⚡ 30 秒速记

  • 核心判断:Node.js 事件循环按阶段处理定时器、I/O 与检查队列,并在回调边界清空微任务
  • 原理主线:围绕 「Node.js 事件循环」、「Node.js 循环原理」、「运行起点」 建立输入、状态变化与输出之间的因果关系
  • 文章范围:系统讲解了Node.js事件循环的工作机制,包括事件循环的各个阶段、任务执行顺序、不同类型回调的处理方式及其在单线程环境下实现高并发的原理,帮助开发者深入理解Node.js高性能背后的核心原理与实际应用场景。
  • 边界与代价:process.nextTickPromise 队列优先级不同,滥用会让 I/O 长时间得不到机会
  • 工程落地:定位延迟时区分 CPU 长任务、事件循环延迟、线程池拥塞和外部 I/O

Node.js 由主线程运行事件循环,分阶段处理定时器、I/OsetImmediate 和关闭回调,并优先清空微任务。 一轮循环包含 timerspending callbackspollcheck 等阶段,其中 poll 主要处理 I/Ocheck 执行 setImmediate。微任务里 process.nextTick 的优先级高于 Promise,同步代码则会先于这些回调执行。具体输出顺序还会受 Node.js 版本、I/O 完成时间和底层 libuv 行为影响,我一般会先确认版本,再用最小脚本验证。

这篇文章不要按 API 清单来背。先用上面的 Mind Map 建立全局结构,再通过交互 DEMO 观察正常路径和边界路径如何改变状态;阅读正文时重点核对每一步的输入、负责执行的参与者、产生的中间状态以及最终可观察结果。遇到版本敏感结论,要把“历史实现”“当前行为”和“工程兼容策略”分开说明;遇到性能或架构取舍,则用实际指标、失败现象和验证手段支撑判断。

版本校准: Node.js 的事件循环阶段名称相对稳定,但定时器、微任务和底层 libuv 行为会随主版本变化。回答时必须先报运行版本,再用最小脚本验证顺序;不要把浏览器事件循环或某个旧版本输出当作所有 Node.js 版本的固定结论。

# Node.js 事件循环

事件循环通俗来说就是一个无限的 while 循环。现在假设你对这个 while 循环什么都不了解,你一定会有以下疑问。

  1. 谁来启动这个循环过程,循环条件是什么?
  2. 循环的是什么任务呢?
  3. 循环的任务是否存在优先级概念?
  4. 什么进程或者线程来执行这个循环?
  5. 无限循环有没有终点?

带着这些问题,我们先来看看 Node.js 官网提供的事件循环原理图。

# Node.js 循环原理

图 为 Node.js 官网的事件循环原理的核心流程图。

可以看到,这一流程包含 6 个阶段,每个阶段代表的含义如下所示。

(1)timers:本阶段执行已经被 setTimeout() 和 setInterval() 调度的回调函数,简单理解就是由这两个函数启动的回调函数。

webapp
公众号
开发者导航
切换夜间模式
点击侧边栏上一篇
点击侧边栏下一篇
折叠侧边栏
收起全部