nodejs的require加载模块的路径搜索顺序

nodejs的require加载模块的路径搜索顺序


如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033

环境:
nodejs : 12.13.0

可以解决的问题:

  1. 提高require加载速度
  2. 使用NODE_PATH简化部署
  3. 解决模块版本问题
  4. 解决依赖包重复问题,降低部署文件大小

1.非核心模块加载示例

路径:d:\requireDemo\index.js

let modulePahts = require.resolve.paths('express'); //返回被查询的路径
console.log(modulePahts);

windows下在cmd中执行:

# 临时设置环境变量
set NODE_PATH=c:\

node index.js

非核心模块检索路径:

node_modules(遍历至根目录) -> NODE_PATH目录 -> 全局目录

[
  'D:\\requireDemo\\node_modules',
  'D:\\node_modules',
  
  'c:\\',
  
  'C:\\Users\\Administrator\\.node_modules',
  'C:\\Users\\Administrator\\.node_libraries',
  'C:\\Program Files (x86)\\nodejs\\lib\\node'
]

2.完整的加载顺序

2.1 缓存

模块在第一次加载后会被缓存。 这也意味着(类似其他缓存机制)如果每次调用 require(‘foo’) 都解析到同一文件,则返回相同的对象。

2.2 核心模块

核心模块定义在 Node.js 源代码的 lib/ 目录下。

require() 总是会优先加载核心模块。 例如, require(‘http’) 始终返回内置的 HTTP 模块,即使有同名文件。

2.3 文件模块

如果按确切的文件名没有找到模块,则 Node.js 会尝试带上 .js、 .json 或 .node 拓展名再加载。

当没有以 '/'、 './' 或 '../' 开头来表示文件时,这个模块必须是一个核心模块或加载自 node_modules 目录。

2.4 目录作为模块

可以把程序和库放到一个单独的目录,然后提供一个单一的入口来指向它。 把目录递给 require() 作为一个参数,有三种方式。

第一种方式是在根目录下创建一个 package.json 文件,并指定一个 main 模块。 例子, package.json 文件类似:

{ "name" : "some-library",
  "main" : "./lib/some-library.js" }

如果这是在 ./some-library 目录中,则 require(’./some-library’) 会试图加载 ./some-library/lib/some-library.js。

这就是 Node.js 处理 package.json 文件的方式。

如果目录里没有 package.json 文件,或者 ‘main’ 入口不存在或无法解析,则 Node.js 将会试图加载目录下的 index.js 或 index.node 文件。 例如,如果上面的例子中没有 package.json 文件,则 require(’./some-library’) 会试图加载:

./some-library/index.js
./some-library/index.node

如果这些尝试失败,则 Node.js 将会使用默认错误报告整个模块的缺失:

Error: Cannot find module 'some-library'

2.5 node_modules 目录加载

如果传递给 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

2.6 从全局目录加载

2.6.1 NODE_PATH检索

如果 NODE_PATH 环境变量被设为一个以冒号分割的绝对路径列表,则当在其他地方找不到模块时 Node.js 会搜索这些路径。

windows:

set NODE_PATH=c:\

UNIX/Linux

export NODE_PATH=.

虽然NODE_PATH可以指定特殊路径(例如SET NODE_PATH=C:\,这样会检索C盘),但是一般不建议使用。

2.6.2 其他全局目录

Node.js 还会搜索以下的全局目录列表:

1: $HOME/.node_modules
2: $HOME/.node_libraries
3: $PREFIX/lib/node

其中 $HOME 是用户的主目录, $PREFIX 是 Node.js 里配置的 node_prefix。


觉得文章对你有帮助,可以扫描二维码捐赠给博主,谢谢!
在这里插入图片描述
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033


License

License under CC BY-NC-ND 4.0: 署名-非商业使用-禁止演绎


Reference:

  1. http://nodejs.cn/api/modules.html#modules_modules
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itas109

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值