深入浅出Nodejs 2 模块机制

1. CommonJS规范

nodejs.png nodejs.png

2. Node 模块实现

核心模块:

node源码中编译生成, 路径分析中优先判断

文件模块:

运行时动态加载, 需要经历路径分析, 文件定位, 编译执行过程; 速度比核心模块慢

路径分析

1. 核心模块

2. 路径形式文件模块

以. .. / 开始的标识符, 被当做文件模块加载

3. 自定义模块

node_modules加载方式, 是所有加载方式中最慢的

文件定位

文件扩展名分析

require 引入模块不包含扩展名, nodejs依次尝试 .js .json .node扩展名

目录分析和包

如果require分析, 没有获取到对应的文件, 但是得到一个目录; node会尝试获取该目录下的package.json读取main属性, 如果获取失败, 则尝试index.js index.json index.node; 如果还是失败, 则会遍历该目录查找目标文件.

编译执行过程

.js 通过fs模块读取后编译执行

.node 通过dlopen方法加载后编译执行

.json 通过JSON.parse()解析后返回结果

其余扩展名 被当做.js文件加载

1. .js模块编译

2. .node编译, C/C++模块编译

3. .json文件编译

3. 核心模块

包括C/C++和js编写组成, C/C++在node项目src目录下, js在node项目lib目录下

1. js核心模块加载过程

转存为C/C++代码

编译js代码

2. C/C++核心模块加载过程

nodejs.png

nodejs.png

4. C/C++扩展模块

GYP项目生成工具 node-gyp 支持编写跨平台node的C/C++代码

V8引擎C++库 实现js和C++相互调用

libuv库 跨平台库, 实现了时间循环, 文件操作等

Node内部库

其他库 在deps目录下

####1. C/C++扩展模块的编写

####2. C/C++扩展模块的编译

####3. C/C++扩展模块的加载

5. 模块调用栈

nodejs.png

6. 包与NPM

包结构: package.json 包描述文件 bin 可执行二进制文件 lib js代码 doc 文档 test 单元测试

7. 前后端公用模块

node是CommonJS实现规范的一种; AMD规范是CommonJS在前端的领域的延伸

AMD规范:

define([id, dependencies], factory/function) id 模块id, 选填 dependencies 依赖, 选填 factory 必填, 模块实现部分

CMD规范

define([‘dependencies1’, …], function(dependencies1, …){ return function(){}; })

CMD与AMD的区别, 主要是定义模块和依赖引入的部分

版本控制

Version Action Time
1.0 Init 2019-08-19