节点如何在需要时从另一个模块解析模块位置?

时间:2014-07-05 21:31:52

标签: javascript node.js

我有以下目录和文件

/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目录?为什么这不起作用?

2 个答案:

答案 0 :(得分:9)

来自documentation

  

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

并为每个依据正确指定依赖项。