我有以下目录和文件
/path/to/dir1
/path/to/dir1/server.js
/path/to/dir1/package.json
/path/to/dir1/node_modules
/path/to/dir2/moduleA.js
然后我有这样开始的moduleA.js:
var React = require('react');
我的package.json文件如下所示:
{
"dependencies": {
"react": "^0.10.0"
}
}
现在来自server.js,如果我这样做:
需要(' ../ DIR2 / moduleA&#39)
它会找到moduleA但是在moduleA中我需要(' react')它实际上位于node_modules文件夹中server.js的同一目录中。但是,此位置未被搜索,我收到错误
错误:找不到模块'反应'
我认为在解析require语句时搜索到的其中一个位置是当前正在执行的进程的node_modules目录?为什么这不起作用?
答案 0 :(得分:9)
从
加载node_module
个文件夹如果传递给
require()
的模块标识符不是本机模块,并且不以'/'
,'../'
或'./'
开头,则节点从父节点开始当前模块的目录,并添加/node_modules
,并尝试从该位置加载模块。如果在那里找不到它,那么它会移动到父目录,依此类推,直到到达树的根目录。
例如,如果
'/home/ry/projects/foo.js'
处的文件名为require('bar.js')
,则节点将按以下顺序查看以下位置:/home/ry/projects/node_modules/bar.js /home/ry/node_modules/bar.js /home/node_modules/bar.js /node_modules/bar.js
这允许程序本地化它们的依赖项,以便它们不会发生冲突。
即。它会显示/path/to/dir2/node_modules
,/path/to/node_modules
等,但不会显示在/path/to/dir1/node_modules
中。
答案 1 :(得分:0)
我认为在解析require语句时搜索到的其中一个位置是当前正在执行的进程的node_modules目录?
没有; require
在与包含运行node_modules
的文件及其所有父项的文件相同的目录中搜索require
。因此,require
中的/path/to/dir2/moduleA.js
搜索:
/path/to/dir2/node_modules/
/path/to/node_modules/
/path/node_modules/
/node_modules/
正确的方法是在/path/to/dir2
中假设dir2
是一个完整的模块:
sudo npm link
然后回到dir1
:
npm link dir2
并为每个依据正确指定依赖项。