Page 141 - Node.js开发指南
P. 141
134 第 6 章 Node.js 进阶话题
令,Node.js会依次查找:
/home/byvoid/develop/node_modules/bar.js
/home/byvoid/node_modules/bar.js
/home/node_modules/bar.js
/node_modules/bar.js
为什么要这样做呢?因为通常一个工程内会有一些子目录,当子目录内的文件需要访问
到工程共同依赖的模块时,就需要向父目录上溯了。比如说工程的目录结构如下:
|- project
|- app.js
|- models
|- ...
|- views
|- ...
|- controllers
|- index_controller.js
|- error_controller.js
|- ...
|- node_modules
|- express
我们不仅要在 project 目录下的 app.js 中使用 require('express'),而且可能要在
controllers 子目录下的 index_controller.js 中也使用 require('express'),这时就需要向
父目录上溯一层才能找到 node_modules 中的 express 了。
6.1.4 加载缓存
我们在前面提到过,Node.js 模块不会被重复加载,这是因为 Node.js 通过文件名缓存所
有加载过的文件模块,所以以后再访问到时就不会重新加载了。注意,Node.js 是根据实际文
件名缓存 的 ,而不是 require() 提供的参 数 缓存的, 也 就是说即 使 你分别通过
require('express') 和 require('./node_modules/express') 加载两次,也不会重
复加载,因为尽管两次参数不同,解析到的文件却是同一个。
6.1.5 加载顺序
下面总结一下使用 require(some_module) 时的加载顺序。
(1) 如果some_module 是一个核心模块,直接加载,结束。
(2) 如果some_module以“ / ”、“ ./ ”或“ ../ ”开头,按路径加载 some_module,结束。
(3) 假设当前目录为 current_dir,按路径加载 current_dir/node_modules/some_module。
如果加载成功,结束。