哪个是正确的Node.js架构?

我对Node.js的体系结构有点困惑

这是真的吗?

在这里输入图像描述

第一个是正确的还是第二个? 因为在第二个图中,每个调用先经过V8,然后经过Node.js绑定,但是在第一个调用中反过来。 你能帮助理解吗? 提前致谢。

首先,两张图都是正确的,尽pipe第一张图已经过时了。 Node.js的ascynchronous部分曾经由libev,libeio和libuv组成。 然而,随着libuv在过去几年的发展,“ libuv libev的node-v0.9.0版本被删除 ”,留下libuv来照顾Node.js的整个asynchronousI / O进程(因此包括事件当然循环)。 因此,现代版本的Node.js架构会将“libeu”和“libev”replace为“libuv”(就像在第二个映像中一样)。

这两张图结构不同的原因是它们是根据不同的视angular来组织的。 图1代表了不同的Node.js技术从高级到低级的分类(因此它并不意味着工作stream)。 而图2是Node.js操作的实际工作stream程。

把这个比喻成一个类比:假设你用图表来表示汽车的不同部分。 你可以用很多方式做到这一点:你可以按照他们的分类/function来组织不同的部分(情景A),因此:

  • 动力系统 :发动机,机油,冷却,排气等
  • 传动系统 :齿轮箱,轴,离合器总成,差速器等
  • 悬挂系统 :控制臂,减震器,转向组件等
  • ……

或者您也可以按工作stream程(场景B)组织作品:

  • 油 – >发动机 – >变速器 – >差速器 – >悬架 – >等

(我对汽车的细节并不太了解,部件的名称和实际的工作stream程可能是错误的,只是为了帮助理解。)

现在因为你组织这些作品的手段是不同的,它们出现的顺序也会有所不同。 情景A类似于图1,情景B类似于图2。


我不确定您对Node.js的工作方式有多了解,因此我将简要介绍一下适用于Node.js体系结构的不同部分,然后再解释它们之间的交互方式:

  • V8 – Google的开源JavaScript引擎,位于Chrome / Chromium浏览器中。 V8并不像典型的networking浏览器那样快速解释JavaScript代码,而是将您的JS代码翻译成机器代码,以便快速实现。 V8是用C ++编写的。 阅读更多关于V8如何在这里工作 。

  • libuv – libuv最初是为了提供包括asynchronousTCP和UDP套接字,(着名)事件循环,asynchronousDNSparsing,文件系统读/写等的asynchronousI / O。libuv是用C语言编写的。要了解更多关于libuv的信息。

  • 其他低级组件 – 比如c-ares , httpparsing器 , OpenSSL , zlib等等,主要用C / C ++编写。

  • 应用程序 – 这里是你的代码,模块和Node.js的内置模块 ,用JavaScript编写(或通过TypeScript,CoffeeScript等编译成JS)

  • 绑定 – 绑定基本上是一个用一种语言编写的库的包装,并将库暴露给以另一种语言编写的代码,以便用不同语言编写的代码可以进行通信。

现在第一个图应该是有意义的:顶部是用JavaScript编写的应用程序(模块和核心Node.js内置模块) 底部是用C / C ++编写的Node.js内部组件。 为了使他们能够沟通,你需要绑定。 这就是Node.js绑定所处的位置:位于高级应用程序和低级别的Node组件之间。 此图不一定代表工作stream程; 它只是根据它们之间的关系/function对不同的Node.js块进行分类。

第二个图表示Node.js应用程序的实际工作stream程。 在您的应用程序中编写的代码由V8编译。 代码通过绑定与低级Node.js组件进行通信。 写在代码中的所有事件都是用Node.js注册的。 一旦事件被触发,它们将根据它们被触发的顺序排入事件队列。 只要事件队列中还有其他事件,事件循环就会继续进行拾取,调用它们的callback函数,并将它们发送给工作线程进行处理。 一旦一个callback函数被执行,它的callback再一次被发送到事件队列,等待被事件循环再次拾取。

你的困惑的一部分可能来自第二幅图中使用的技术术语的select。 如果仔细观察,在“NODE.JS绑定”下面说“(NODE API)”,不幸的是,这是两回事。 Node.js API是其内置库的接口,而从软件编程的angular度看, 绑定是用不同语言编写的代码之间的桥梁。

我希望这有帮助。


Node.js内部结构的更准确的表示是: Node.js体系结构 (我从互联网上的一个图片源下载了这个图片,但是我忘了它是从哪里来的,如果图片属于你,请评论,我将在下面添加信用!谢谢!)


编辑:我最近写了一个更全面的文章来解释Node.js的架构与一个易于理解的类比。 我希望它可以帮助!