Node相关
一.require导入机制
- 首先我们要清楚NodeJS的模块机制。导出的每个模块其实都是Module对象的实例。
1 | |
- 其次我们来看require。当我们通过require引入某个模块时,require函数内部会调用Module.load方法。在这个方法内部 首先调用Module.resolveFilename来获得这个模块的绝对路径filename(定位这个模块)之后在Module._cache[filename]查找是否有缓存,如果有就直接返回缓存的exports属性。如果没有,再看是否是内置的模块,如果是内置的模块,就返回NativeModule.require(filename);如果不是内置模块,就新建一个Module实例,然后把这个实例缓存起来。最后通过load方法加载这个模块,将exports属性返回。
1 | |
二.异步I/O
1. 事件循环机制
-
Timers(计时器阶段):初次进入事件循环,会从计时器阶段开始。此阶段会判断是否存在过期的计时器回调(包含 setTimeout 和 setInterval),如果存在则会执行所有过期的计时器回调,执行完毕后,如果回调中触发了相应的微任务,会接着执行所有微任务,执行完微任务后再进入 Pending callbacks 阶段。
-
Pending callbacks:执行上一循环推迟到下一个循环迭代的I / O回调(系统调用相关的回调)。
-
Idle/Prepare:仅供内部使用。
-
Poll(轮询阶段):当回调队列不为空时:
会执行回调,若回调中触发了相应的微任务,针对每一个回调执行完毕后,就执行相应微任务。执行完所有的回到后,变为下面的情况。
当回调队列为空时(没有回调或所有回调执行完毕):
但如果存在有计时器(setTimeout、setInterval和setImmediate)没有执行,会结束轮询阶段,进入 Check 阶段。否则会阻塞并等待任何正在执行的I/O操作完成,并马上执行相应的回调,直到所有回调执行完毕。
-
Check(查询阶段):会检查是否存在 setImmediate 相关的回调,如果存在则执行所有回调,执行完毕后,如果回调中触发了相应的微任务,会接着执行所有微任务,执行完微任务后再进入 Close callbacks 阶段。
-
Close callbacks:执行一些关闭回调,比如
socket.on('close', ...)等。
Node相关
https://jing-jiu.github.io/jing-jiu/2021/08/05/Node/node相关/