← 返回目录

第 6 卷

第 6 / 10 卷日期:

23└─────────────┬─────────────┘ 24│

25┌─────────────▼─────────────┐

26│阶段4:poll(轮询)│核心阶段,处理I/O回调(文件/网络请求),阻塞等待新任务
27└─────────────┬─────────────┘
28│
29┌─────────────▼─────────────┐
30│阶段5:check(检查)│执行setImmediate()的回调
31└─────────────┬─────────────┘
32│
33┌─────────────▼─────────────┐
34│阶段6:close callbacks│执行关闭回调(如socket.on('close'))
35└───────────────────────────┘

✅ 2. 微任务的优先级和执行时机不同

浏览器:微任务队列只有1个,执行栈为空时一次性全清空。

Node.js:微任务分2类,优先级从高到低:

1.process.nextTick():独立的nextTick队列,优先级最高,任何阶段执行完后,先清空调 nextTick队列,再清空微任务队列;

  1. 普通微任务队列:Promise.then/MutationObserver/queueMicrotask(),优先级次之。

注:Node.js 11+ 版本优化了执行时机,每个宏任务执行完后,立即执行微任务队列(与浏览器一致);Node.js 10- 版本是整个阶段的宏任务执行完后,再执行微任务队列。

✅ 3. 宏任务的类型和优先级不同

浏览器宏任务优先级(大致):

script整体执行 > DOMContentLoaded > setTimeout/setInterval > AJAX/fetch > load > requestAnimationFrame。

Node.js宏任务优先级(按阶段顺序):

timers(setTimeout) > pending callbacks > poll(I/O) > check (setImmediate) > close callbacks。

✅ 4. 页面渲染的差异

  • 浏览器事件循环:每轮循环都会触发页面渲染,是核心环节,保证页面可视化更新;

• Node.js事件循环:无页面渲染环节,Node.js是服务端运行环境,无需渲染页面,专注于I/O处

✅ 5. 异步API的支持差异

• 浏览器:支持DOM事件、AJAX、requestAnimationFrame、MutationObserver等前端专属异步

API;

• Node.js:支持文件I/O、网络I/O、child_process、setImmediate、process.nextTick等服务端专

属异步API,无DOM相关API。

✅ 6. 任务队列的数量差异

  • 浏览器:仅1个宏任务队列 + 1个微任务队列;
  • Node.js:6个宏任务队列(对应6个阶段) + 2个微任务队列(nextTick + 普通微任务)。

✅ 核心差异总结表

维度浏览器事件循环Node.js事件循环
阶段划分无明确阶段,仅分2个队列6个明确执行阶段,按顺序执

行

微任务执行执行栈空→全清微任务→执行每个宏任务执行完→清
1个宏任务nextTick→清微任务
渲染环节必含,每轮循环触发无,服务端无渲染需求
宏任务优先级无严格顺序,按添加时间执行按阶段顺序执行,优先级固定
异步API前端专属服务端专属
(DOM/AJAX/RAF)(I/O/setImmediate)
核心目标保证页面交互流畅,非阻塞渲高效处理I/O请求,高并发服
染务

17. 描述process.nextTick在Nodejs事件循环中的执行顺序及其与微任务

的关系

process.nextTick的定义

process.nextTick() 是Node.js专属的微任务API,用于将回调函数添加到nextTick专属队列,是Node.js中优先级最高的异步任务,独立于普通微任务队列。

空为止);

2.nextTick队列清空后,再执行普通微任务队列(Promise.then/MutationObserver等)的所有回调;

  1. 微任务队列清空后,才会执行Node.js事件循环的各个阶段的宏任务;
  2. 任何阶段执行完一个宏任务后,都会先清空调nextTick队列→再清微任务队列→再执行下一个宏任

务;

  1. 若在 process.nextTick() 中再次调用 process.nextTick(),新的回调会加入当前

nextTick队列末尾,立即执行,不会进入下一轮循环(可能导致事件循环阻塞)。

process.nextTick与普通微任务的关系

  • 1. 同属微任务,process.nextTick优先级更高(核心关系)
  • 微任务分为两级: nextTick队列(一级微任务) > 普通微任务队列(二级微任务);
  • 执行顺序:同步任务 → process.nextTick()全清 → 普通微任务全清 → 宏任务。
  • 2. 执行机制一致,均为批量执行
  • 两者都是队列式存储,遵循「先进先出」;
  • 执行时都会一次性清空当前队列,队列中产生的新任务会加入末尾,同步执行。
  • 3. 所属队列不同,相互独立

• process.nextTick():存入nextTickQueue(专属队列,由Node.js底层维护,效率更

高);

  • 普通微任务:存入microtaskQueue(标准微任务队列,遵循ES6规范)。

执行顺序示例(直观理解)

Code block

1console.log('同步任务1'); // 1. 同步任务,立即执行 2

3Promise.resolve().then(() => {//普通微任务
4console.log('普通微任务Promise');// 4.执行普通微任务
5});
7process.nextTick(() => {// nextTick微任务
8console.log('nextTick1');// 2.执行nextTick
全站分卷索引 · 10 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷