node 模块实现
优先从缓存加载
路径分析和文件定位
模块标识符分析
核心模块
http,fs,path
核心模块其实分为 C/C++编写的和 JavaScript 编写的两部分,其中 C/C++文件存放在 Node 项目的 src 目录下,JavaScript 文件存放在 lib 目录下。
内建模块(由纯 C/C++编写的部分),因为它们通常不被用户直接调用
Node 的 buffer、crypto、evals、fs、os 等模块都是部分通过 C/C++编写的
路径形式的文件模块
模块路径(沿路径向上逐级递归,直到根目录下的 node_modules)
自定义模块
可能是一个文件或者包的形式
文件定位
文件扩展名分析
node 会按.js .node .json 的次序补足扩展名
如果是.node 和.json 文件,在传递给 require()的标识符中带上扩展名,会加快一点速度
同步配合缓存,可以大幅度缓解 Node 单线程中阻塞式调用的缺陷
目录分析和包
node 在前目录下查找 package.json->index.js->index.node->index.json
模块编译
- js文件 (通过fs模块同步读取文件后编译执行)
- node文件 (用c/c++编写的扩展文件,通过dlopen()方法加载最后编译生成的文件)
- json文件。通过fs模块同步读取文件后,用JSON.parse()解析返回结果。
- 其余扩展名文件。它们都被当做.js文件载入
.node的模块文件并不需要编译,因为它是编写C/C++模块之后编译生成的