当我做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.paths
与other-file.js
不同。为什么? (并且the-module
的安装路径不在此列表中。)
答案 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
的相对路径工作规则,那么您将获得期望和需要的东西。