Node相关

一.require导入机制

  1. 首先我们要清楚NodeJS的模块机制。导出的每个模块其实都是Module对象的实例。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Module {
id: '.',
path: 'C:\\Users\\14828\\Desktop\\Task\\笔记\\NodeJS',
exports: {},
parent: null,
filename: 'C:\\Users\\14828\\Desktop\\Task\\笔记\\NodeJS\\node.js',
loaded: false,
children: [],
paths: [
'C:\\Users\\14828\\Desktop\\Task\\笔记\\NodeJS\\node_modules',
'C:\\Users\\14828\\Desktop\\Task\\笔记\\node_modules',
'C:\\Users\\14828\\Desktop\\Task\\node_modules',
'C:\\Users\\14828\\Desktop\\node_modules',
'C:\\Users\\14828\\node_modules',
'C:\\Users\\node_modules',
'C:\\node_modules'
]
}
  1. 其次我们来看require。当我们通过require引入某个模块时,require函数内部会调用Module.load方法。在这个方法内部 首先调用Module.resolveFilename来获得这个模块的绝对路径filename(定位这个模块)之后在Module._cache[filename]查找是否有缓存,如果有就直接返回缓存的exports属性。如果没有,再看是否是内置的模块,如果是内置的模块,就返回NativeModule.require(filename);如果不是内置模块,就新建一个Module实例,然后把这个实例缓存起来。最后通过load方法加载这个模块,将exports属性返回。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
let Module = require('module')
Module._load = function (request, parent, isMain) {
var filename = Module._resolveFilename(request, parent);
var cachedModule = Module._cache[filename];
if (cachedModule) {
return cachedModule.exports;
}
if (NativeModule.exists(filename)) {
return NativeModule.require(filename);
}
var module = new Module(filename, parent);
Module._cache[filename] = module;
try {
module.load(filename);
hadException = false;
} finally {
if (hadException) {
delete Module._cache[filename];
}
}
return module.exports;
};

二.异步I/O

1. 事件循环机制

  1. Timers(计时器阶段):初次进入事件循环,会从计时器阶段开始。此阶段会判断是否存在过期的计时器回调(包含 setTimeout 和 setInterval),如果存在则会执行所有过期的计时器回调,执行完毕后,如果回调中触发了相应的微任务,会接着执行所有微任务,执行完微任务后再进入 Pending callbacks 阶段。

  2. Pending callbacks:执行上一循环推迟到下一个循环迭代的I / O回调(系统调用相关的回调)。

  3. Idle/Prepare:仅供内部使用。

  4. Poll(轮询阶段):当回调队列不为空时:

会执行回调,若回调中触发了相应的微任务,针对每一个回调执行完毕后,就执行相应微任务。执行完所有的回到后,变为下面的情况。

当回调队列为空时(没有回调或所有回调执行完毕):

但如果存在有计时器(setTimeout、setInterval和setImmediate)没有执行,会结束轮询阶段,进入 Check 阶段。否则会阻塞并等待任何正在执行的I/O操作完成,并马上执行相应的回调,直到所有回调执行完毕。

  1. Check(查询阶段):会检查是否存在 setImmediate 相关的回调,如果存在则执行所有回调,执行完毕后,如果回调中触发了相应的微任务,会接着执行所有微任务,执行完微任务后再进入 Close callbacks 阶段。

  2. Close callbacks:执行一些关闭回调,比如 socket.on('close', ...)等。


Node相关
https://jing-jiu.github.io/jing-jiu/2021/08/05/Node/node相关/
作者
Jing-Jiu
发布于
2021年8月5日
许可协议