nodejs技术架构图
前言
中文版官网:http://nodejs.cn/
nodejs它是一个多种技术组合起来的平台,让JS能调用设备终端的接口、开发后端应用。
关键技术
- V8引擎(运行js)
- bindings(桥)
- C/C++ 插件(c-ares、http-parser、OpenSSL、zlib)
周边工具推荐
- nrm 用于切换下载源
- yarn | yrm
- ts-node node的环境直接运行TypeScript
电子书推荐
官方中文版:http://nodejs.cn/learn
民间大神笔记:https://yjhjstz.gitbooks.io/deep-into-node/content/
Event Loop
Event:有哪些事件需要执行
Loop:事件分优先级,按顺序轮询处理事件
操作系统触发事件,JS处理事件,Event Loop则对事件处理顺序的管理。
案例
当事情同时触发时,node应如何处理?
setTimeout(f1,100);
fs.readFile('./doc.txt',f2);
server.on('close',f3);
- 按既定规则排列优先级,意味着所有的任务都有前后次序。
重点注意
- Node 大多数时间都停留在 poll 轮询阶段
- 同时在 poll 阶段中处理绝大部分的事件,如:文件交换、网络请求等
相似的回调对比
setImmediate()
对比 setTimeout()
setImmediate()
在当前轮询阶段完成后执行脚本。setTimeout()
安排脚本在经过以毫秒为单位的最小阈值后运行。
定时器的执行顺序取决于调用它们的上下文。如果两者都从主模块中调用,则计时将受进程性能的限制(这可能会受到机器上运行的其他应用程序的影响)。
例如,如果我们运行以下不在 I/O 周期(即主模块)内的脚本,则两个计时器的执行顺序是不确定的,因为它受进程性能的约束:
// timeout_vs_immediate.js
setTimeout(() => {
console.log('timeout');
}, 0);
setImmediate(() => {
console.log('immediate');
});
node timeout_vs_immediate.js
# timeout
# immediate
node timeout_vs_immediate.js
# immediate
# timeout
⚠️注意:如果在一个 I/O 周期内移动这两个调用,则始终首先执行立即回调:
// timeout_vs_immediate.js
const fs = require('fs');
fs.readFile(__filename, () => {
setTimeout(() => {
console.log('timeout');
}, 0);
setImmediate(() => {
console.log('immediate');
});
});
node timeout_vs_immediate.js
# immediate
# timeout
node timeout_vs_immediate.js
# immediate
# timeout
::: tips
使用setImmediate()
over的主要优点setTimeout()
是, setImmediate()
如果在 I/O 周期内调度,将始终在任何计时器之前执行,而与存在的计时器数量无关。
:::
Libub
异步I/O操作
Bindings
JS和C/C++之间的通信