nodejs require - 模块名称区分大小写的问题

时间:2014-04-25 09:21:52

标签: javascript node.js

最近我发现了一个关于node.js需要机制的奇怪问题

您可能会认为,由于Windows文件系统,所需模块是否区分大小写并不重要。所以...

模块A:

require("fancyModule");

模块B:

require("fancymodule");

都指向同一个fancymodule.js文件。但该对象的构造函数将被调用两次。所以

var FancyModule = {
    var name = "unkown";
    var setName = function(val){
        name = val
    }
    return {
        setName:setName
    }
}
module.exports = FancyModule();

将导致两个单独的FancyModule实例。所以要注意它。

我知道我总是要关心正确的文件名 - 无论文件系统是否区分大小写。

我的问题是, 有没有办法设置或配置nodejs以防止 - 或至少打印出警告?

1 个答案:

答案 0 :(得分:8)

首先,永远不要对您正在使用的文件系统做出假设。 如果您在不同的环境中运行它,请始终期望它区分大小写。

现在问题:

当您在节点中需要模块时,节点将完全缓存导入以防止您要导出单例并且不将其初始化两次的情况。 虽然文件系统查找将返回相同的确切文件,因为它不区分大小写,但需要的缓存仍然将这两种情况视为不同的模块。这是因为它必须假设它在区分大小写的环境中运行,因此实际上可能有两个不同的模块。

这就是为什么它会两次初始化你的单身人士。它实际上将它们视为两个不同的模块。

你在问是否有办法阻止它。 有一个非常容易但可怕的方法来做到这一点。您可以将global.require修补为小写导入:

var patchRequire = function () {
    var oldRequire = global.require;
    global.require = function (moduleName) {
        return oldRequire.call(global, moduleName.toLowerCase());
    };
};

patchRequire();
require('Foo-Bar'); // Will require 'foo-bar' instead

但请不要这样做。最好确保您的导入保持一致,并使用由短划线分隔的所有小写名称。