xinchanghao / one-day-in-the-future

有朝一日,起飞...
2 stars 1 forks source link

Node与浏览器的 Event Loop 差异 #15

Open pzli opened 4 years ago

pzli commented 4 years ago

首先:浏览器的Event Loop是定义在HTML5规范中的,而node的Event Loop是基于libuv的

其次是在node不同版本中,执行顺序也是不一样的


在node11之前

浏览器环境下,microtask的任务队列是每个macrotask执行完之后执行。而在Node.js中,microtask会在事件循环的各个阶段之间执行,也就是一个阶段执行完毕,就会去执行microtask队列的任务。 图片示例


在node12之后

node与浏览器执行顺序一致


参考链接

pzli commented 4 years ago

Node 中的 Event Loop 和浏览器中的是完全不相同的东西。Node.js 采用 V8 作为 js 的解析引擎,而 I/O 处理方面使用了自己设计的 libuv,libuv 是一个基于事件驱动的跨平台抽象层,封装了不同操作系统一些底层特性,对外提供统一的 API,事件循环机制也是它里面的实现。

Node.js 的运行机制如下:

pzli commented 4 years ago

JavaScript Engine 和 JavaScript Runtime

简单来说,为了让 JavaScript 运行起来,要完成两部分工作(当然实际比这复杂的多):

这里的第一部分,是 Engine(执行引擎);第二部分,是 Runtime(执行环境)。

举个栗子: Chrome 和 Node.js 都使用了 V8 Engine:V8 实现并提供了 ECMAScript 标准中的所有数据类型、操作符、对象和方法(注意并没有 DOM)。 但它们的 Runtime 并不一样:Chrome 提供了 window、DOM,而 Node.js 则是 require、process 等等。

参考链接