如果 require() 中的模块名不是一个本地模块,也没有以 '/' 、 '../' 或是 './' 开头,那么 Node.js 会从当前模块的父目录开始,尝试在它的 /node_modules 文件夹里加载相应模块。Node.js 不会添加 node_modules 到已经以 node_modules 结尾的路径上。
如果没有找到,那么就再向上一级目录移动,直到文件系统的根目录为止。
例如,假设在 '/home/ry/projects/foo.js' 的文件里调用了 require('bar.js') ,那么 Node.js 查找其位置的顺序依次为:
-
/home/ry/projects/node_modules/bar.js -
/home/ry/node_modules/bar.js -
/home/node_modules/bar.js -
/node_modules/bar.js
这就要求程序本地化它们的依赖,避免它们产生冲突。
你可以要求特定的文件或子模块分散在一个模块的模块名后所跟着的路径后缀中。例如,require('example-module/path/to/file') 将被解析为相对于 example-module 模块的 path/to/file 路径中。后缀路径同样遵循模块路径的解析规则。