Node.js 词条目录
前端Wiki/Node.js/基础/认识 Node.js

事件驱动与非阻塞 I/O

“事件驱动”指程序流程由事件(I/O 完成、定时器触发、新连接到达)推动,而不是从头到尾顺序执行。“非阻塞”指遇到耗时的 I/O 操作时,主线程不等待,先去做别的,完成后再通过回调处理结果。

幕后功臣是 libuv 提供的事件循环(Event Loop):它像一个不知疲倦的分发员,不断轮询“哪些任务完成了”,然后执行对应的回调。前端的 setTimeout、Promise 的底层机制与它是同一套思想,理解了事件循环,Node.js 的异步行为就有了抓手。

  • 非阻塞 I/O:读文件/发请求时主线程不干等,先执行后续代码
  • 事件循环(libuv)负责在 I/O 完成后调度回调
  • 单线程不等于“只有一个线程”:I/O 交给系统线程池,JS 逻辑跑在单线程上
JS
// 用定时器直观感受事件驱动的执行顺序
console.log('1. 同步代码开始');

setTimeout(() => console.log('3. 定时器回调(事件循环在同步代码结束后才处理)'), 0);

// Node 环境下读文件,回调由 libuv 线程池完成后投递回事件循环
const fs = require('fs');
fs.readFile(__filename, () => console.log('4. 文件读取完成回调'));

console.log('2. 同步代码结束');
本节要点非阻塞让 I/O 不卡主线程,事件循环负责“完成后执行回调”;单线程指的是 JS 执行线程,I/O 仍在底层多线程完成。