Node.js系列:和浏览器的事件循环有什么区别?
和浏览器的事件循环有什么区别?
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,完成后将任务放在宏任务队列
总结:
- Nodejs特有的微任务process.nextTick;特有的宏任务有setImmediate
- Nodejs事件循环有6个阶段,浏览器没有那么明确划分
- Nodejs的事件循环主要涉及文件读取等I/O操作;浏览器主要处理用户界面有关的事件
- 浏览器中没有像Nodejs那样的线程池
- 浏览器中,事件循环主要负责从消息队列取出人去交给JS主线程执行
- Nodejs的线程池中的线程会在后台处理这些耗时的I/O操作:如文件读取,文件读取后主线程再处理文件读取的后续事件