Node.js系列:和浏览器的事件循环有什么区别?

117 阅读2分钟

和浏览器的事件循环有什么区别?

1.执行环境:

  • Node.js: 主要用于服务端端,处理如文件系统操作、网络请求、数据库访问等任务
  • 浏览器:在浏览器环境中运行,重点关注用户交互事件(如点击,滚动)、DOM 操作、网络资源加载(图片)等

2.任务队列类型

  • Nodejs 有6个阶段的任务队列:定时器、I/O回调、轮询、检查、闲置、关闭
  • 浏览器相对简单,主要有宏任务队列 和微任务队列
    • script标签中的脚本
    • settimeout、setInterval
    • I/O操作
    • UI交互事件
    • promise.then
    • MutaionObserve 浏览器特有的微任务 监听DOM变化
    • queueMicrotask

3. 微任务的执行时机:

  • node:每个阶段完成后,如果有微任务队列,就会执行 (即各个阶段之间)
  • 浏览器:在执行完一个宏任务后,会立即执行微任务队列中的所有微任务,再执行下一个宏任务

4. I/O 处理

  • Node: 线程池中的线程处理文件读取等I/O操作,完成后,将回调放入事件循环相应的阶段
  • 浏览器:通过浏览器底层的网络和文件系统模块处理I/O,完成后将任务放在宏任务队列

总结:

  1. Nodejs特有的微任务process.nextTick;特有的宏任务有setImmediate
  2. Nodejs事件循环有6个阶段,浏览器没有那么明确划分
  3. Nodejs的事件循环主要涉及文件读取等I/O操作;浏览器主要处理用户界面有关的事件
  4. 浏览器中没有像Nodejs那样的线程池
    • 浏览器中,事件循环主要负责从消息队列取出人去交给JS主线程执行
    • Nodejs的线程池中的线程会在后台处理这些耗时的I/O操作:如文件读取,文件读取后主线程再处理文件读取的后续事件