跳到主要内容

nodejs技术架构图

前言

中文版官网:http://nodejs.cn/

nodejs它是一个多种技术组合起来的平台,让JS能调用设备终端的接口、开发后端应用。

关键技术

img

周边工具推荐

  • 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);
  • 按既定规则排列优先级,意味着所有的任务都有前后次序。

img

重点注意

  • 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++之间的通信

V8

API