Nodejs 模块大概可分为4种:
a) builtin module Nodejs中以C++形式提供的文件模块。
b) constant module Nodejs中定义常量的文件模块。
c) native module Nodejs中以javascript形式提供的核心模块。
d) 第三方module 由第三方提供的文件模块。
一、模块加载步骤
1、路径查找
文件查找是先查找当前目录的node_modules,然后查找父目录的node_modules,然后逐级向上查找
2、文件定位
1) 缓存
2) 如果是绝对路径, 则直接按路径读取并编译
3) 如果是“/”则直接从/node_modules目录查找
4) 如果是相对路径, 则生成如下查询规则,
[
‘/home/myapp/mydir/node_module‘,
‘/home/myapp/node_module‘
‘/home/node_module‘,
‘/node_module‘
]
5) 从上述数组中取出第一个目录作为查找对象, 如果存在结束查找
6) 然后依次尝试添加.js、.json、.node后缀继续查找, 如果存在则结束
7) 尝试将require参数作为一个包查找, 读取目录下的package.json文件, 取得main参数指定的文件
8) 根据指定的文件未找到, 如果没有,执行第6步
9) 如果main参数不存在或者第8步未找到, 则查找该目录下index文件, 如果没有, 执行第6步
10) 如果依然没有找到, 则开始取出数组第二条路径, 然后执行5-7步。 直到数组中最后一个值
11) 如果还没找到, 抛出异常
3、模块编译
编译分为三种情况,js模块、c/c++模块、json模块
4、模块缓存
核心模块编译成功后缓存在NativeModule._cache
下
文件模块编译成功后缓存在Module._cache
下