由于 Node.js 中存在 4 类模块(原生模块和3种文件模块),尽管 require 方法极其简单,但是内部的加载却是十分复杂的,其加载优先级也各自不同。如下图所示:
原生模块指的就是 node.js 自带的模块,文件模块指的是项目本地的文件:
加载顺序:
-
缓存。模块在第一次加载后会被缓存。 这也意味着(类似其他缓存机制)如果每次调用 require(‘foo’) 都解析到同一文件,则返回相同的对象。
-
核心模块。核心模块定义在 Node.js 源代码的 lib/ 目录下。require() 总是会优先加载核心模块。 例如, require(‘http’) 始终返回内置的 HTTP 模块,即使有同名文件。
-
文件模块。如果按确切的文件名没有找到模块,则 Node.js 会尝试带上 .js、 .json 或 .node 拓展名再加载。
当没有以 '/'、 './' 或 '../' 开头来表示文件时,这个模块必须是一个核心模块或加载自 node_modules 目录。
-
目录作为模块。可以把程序和库放到一个单独的目录,然后提供一个单一的入口来指向它。
-
node_modules 目录加载
-
从全局目录加载。NODE_PATH检索,如果 NODE_PATH 环境变量被设为一个以冒号分割的绝对路径列表,则当在其他地方找不到模块时 Node.js 会搜索这些路径。其他全局目录,$HOME/.node_modules (其中 $HOME 是用户的主目录)等等
粗略记录一下,详细可自行查阅资料。