【问题标题】:Can I force node.js require to be case sensitive?我可以强制 node.js 要求区分大小写吗?
【发布时间】:2021-10-30 09:36:16
【问题描述】:

由于我的 Mac 有一个不区分大小写的文件系统,因此在本地运行测试时不会捕获与大小写相关的拼写错误,但是它们在运行 Linux 的构建服务器上会失败。

例如:require('./mymodule') 在 Lion 上运行时会找到 ./myModule.js,但在 Linux 上则不会。

因为我想让测试在本地也失败,以免破坏服务器上的构建,所以我正在寻找一种方法来使 node.js 要求更严格,因为如果它会引发错误文件名不准确(即大小写不同)。

有谁知道实现这个的方法吗?

编辑

由于这个问题似乎没有好的解决方案,我创建了valiquire

此工具验证整个 nodejs 项目中的所有要求,同时确保大小写正确。

【问题讨论】:

  • 我通常不使用 mac,所以这只是一个想法,但您是否可以自己搜索文件,并获取它的名称,然后使用字符串比较来检查大小写并查看它是否与您正在搜索的文件匹配。当你在mac上获取文件名时,它是否保持大小写相同?

标签: linux node.js file-io osx-lion


【解决方案1】:

如果你使用 webpack,请查看https://github.com/Urthen/case-sensitive-paths-webpack-plugin

刚刚为我们的开发版本安装了它。本来可以让我们免于多次取消刺激......如果你在这个问题上,可能已经发生了?

安装

npm install --save-dev case-sensitive-paths-webpack-plugin

用法

const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');

const webpackConfig = {
    plugins: [
        new CaseSensitivePathsPlugin(),
        // other plugins ...
    ],
    // other webpack config ...
};

【讨论】:

    【解决方案2】:

    由于您的 hfs 文件系统不区分大小写,“fileName”的查找将在 OS lib 级别匹配“filename”,因此 node.js 的行为将相同。因此,根据定义,没有解决方法。

    但是以重新格式化为代价,您可以更改 fs 格式以使用 hfs 区分大小写。

    http://www.coriolis-systems.com/iPartition.php 在此线程中被提及:https://superuser.com/questions/380330/mac-convert-from-case-sensitive-to-case-insensitive-file-system

    【讨论】:

      【解决方案3】:

      这是一个老问题,但这是我遇到的第一个谷歌结果。对于其他偶然发现此问题的人,2021 年的答案是使用 ESLint 包 eslint-plugin-import“no-unresolved”规则 - https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-unresolved.md#casesensitive

      默认情况下,如果需要的路径大小写不完全匹配,它将显示警告/错误。当require路径大小写不同时,你会看到:

      /Users/<your user>/projects/my-app/api/v1/createApplication.js:
          Line 7: import/no-unresolved - Casing of ../../../repositories/Application does not match the underlying filesystem.
      

      要让它工作:

      npm install --save-dev eslint-plugin-import
      

      并添加到 .eslintrc(.js 或 .json):

          "extends": [
              ...
              "plugin:import/recommended",
              ...
          ],
          ...
          "rules": {
              "import/no-unresolved": [2, {commonjs: true, amd: true}],
              ...
      

      【讨论】:

        【解决方案4】:

        防弹的答案是将您的 MacOS 文件系统重新格式化为区分大小写,但这当然非常不方便。相反,请查看相关问题的答案,该答案描述了在 MacOS 上解决此问题的一个非常优雅的解决方案,即创建一个虚拟区分大小写的分区,并在其上执行所有开发工作: How do I commit case-sensitive only filename changes in Git?

        【讨论】:

          【解决方案5】:

          在不更改操作系统文件分区的情况下,您可以使用自动检测这些更改的捆绑程序,我个人使用 webpack 2。当文件被解析但大小写不同时,它会发出警告。它不会阻止在 OSX / Windows 上编译,但你会有提示。另外,在当今的 js 开发中拥有捆绑器是一项巨大的资产

          hacky 且不推荐的方法是填充要求并强制某个案例或尝试大多数可能的案例,但这可能会非常难看,并且会造成性能不佳,而无需提及加载错误文件的潜在危险。一个大小写重命名的文件,旧文件没有被清理

          【讨论】:

            【解决方案6】:

            文件名始终使用小写,这样您就不必担心文件系统是否支持它。

            让我想起人们过去在 url 中使用空格的时候。

            【讨论】:

            • "...在本地运行测试时不会捕获与案例相关的拼写错误..."
            • 同样约定,导出 JavaScript 类的文件以大写字母开头,单例模块以小写字母开头。
            • 总是说总是
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-08
            • 2012-10-01
            • 2015-02-05
            相关资源
            最近更新 更多