暂时对此感到困惑
我在一个名为“foo”的NPM模块中有一个可执行文件(cli / exec.js),如下所示:
/foo
--/cli
exec.js
--/lib
package.json
在package.json中的,我们有:
"name": "foo",
"bin": {
"exec-foo": "cli/exec.js"
}
安装此模块时,使用npm install,node_modules如下所示:
--/node_modules
---/.bin
exec-foo
---/foo
---/lodash
---/async
---/whatev
.........
...让我感到困惑的是:Node.js如何使用require函数执行模块/依赖项解析,现在exec-foo.js文件不再是项目中曾经存在的位置,但是现在位于node_modules/.bin
?对此有一个简单的解释吗?
答案 0 :(得分:2)
在the documentation中很好地解释了NodeJS分辨率。
如果传递给require()的模块标识符不是本机模块,并且不以'/','.. /'或'./'开头,那么Node.js从该目录的父目录开始当前模块,并添加/ node_modules,并尝试从该位置加载模块。 Node不会将node_modules附加到已经以node_modules结尾的路径。
在您的情况下,node_modules/.bin/exec.js
将是一个符号链接 - 指向原始文件的指针。
然后NodeJS检查原始文件路径并开始解析所需的模块。如果在当前node_modules
路径中找不到,则向上移动1个目录,直到找到您的库。
如果没有找到库,则会抛出错误。