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。
                     如果加载成功,结束。
   136   137   138   139   140   141   142   143   144   145   146