为什么另一个目录中的文件的require(“ the-module”)失败?

时间:2019-09-07 00:45:48

标签: node.js npm

当我做node myfile.js时,遇到一个错误,即找不到模块。我这样检查了module.paths

$ node
> module.paths

显示了模块的安装路径,我可能需要该模块:

$ node
> require("the-module")

因此,我将console.log(module.paths)添加到了myfile.js来查看module.paths是否相同。不是。

这是怎么回事?


编辑: 有点复杂。

module.paths不同,但这似乎不是问题。列表中安装了the-module的路径。

当我在require("the-module")中添加myfile.js时,它可以正常工作。但是,我做require("c:/path-to/other-file.js"),然后再做另外一个require("the-module")。此要求失败。


编辑2: module.pathsother-file.js不同。为什么? (并且the-module的安装路径不在此列表中。)

1 个答案:

答案 0 :(得分:1)

您可以在未指定完整路径here的情况下查看有关require()加载文件的所有规则。

仅指定文件名时,如require("the-module"),node.js会在要调用的当前模块require()从其加载的目录下的node_modules子目录中查找。这样,模块就可以拥有自己的一组依赖关系,并且可以相对于其自己的目录加载它们,而无需考虑文件系统中的位置。

因此,如果您从中调用require()的模块位于c:\myprojects\team\module1中,并且位于该目录中的文件中,则调用require("the-module"),则node.js将在{{ 1}}中找到c:\myprojects\team\module1\node_modules

类似地,任何以the-module.js开头的路径都相对于同一目录,但是允许您引用同一目录本身中的文件。

node.js不会将路径动态添加到搜索路径列表中。听起来您似乎期望当您访问各种目录时,它们会以某种方式自动添加到搜索路径中。现在就是这样。 ./查找相对路径的规则全部阐明为here

此外,请记住,整个node.js中不仅只有一个require()变量。在node.js中加载的每个文件中都有一个不同的文件,因此module可能在每个文件中都不同。实际上,大多数node.js开发人员从不以任何方式使用module.paths。如果您只是遵循module.paths的相对路径工作规则,那么您将获得期望和需要的东西。