我对Node.js的架构有点迷惑。
第一个是正确的还是第二个?因为在第二张图中,每个调用都会先通过V8,然后再通过Node.js绑定,但在第一张图中,情况正好相反。你能帮我理解一下。提前谢谢。
发布于 2016-05-29 17:15:38
首先,两个图都是正确的,尽管第一个有点过时。Node.js的异步部分过去由libev、libeio和libuv组成。然而,随着libuv在过去几年中的发展,"[in] the node-v0.9.0 version of libuv libev was removed“让libuv负责处理Node.js的整个异步I/O进程(因此当然包括事件循环)。因此,现代版本的Node.js架构将用"libuv“替换"libeio”和"libev“(如第二张图片所示)。
这两个图表在结构上不同的原因是它们是根据不同的视角进行组织的。图1表示从高级到低级的不同Node.js技术的分类(因此它并不意味着工作流);而图2是Node.js操作的实际工作流。
打个比方:假设你试图用图形来表示汽车的不同部分。您可以通过多种方式完成此操作:您可以通过分类/功能来组织不同的部分(场景A),如下所示:
或者,您也可以通过工作流来组织这些部分(场景B):
)我不太了解汽车的细节。组件的名称和实际的工作流程可能是错误的。它的列出只是为了帮助理解。)
现在,因为组织碎片的方式不同,它们出现的顺序也会不同。场景A类似于您的图1,场景B类似于图2。
我不确定您对Node.js的工作方式有多了解,所以在继续解释它们之间的交互方式之前,我将简要概述一下适合Node.js架构的不同部分:
现在,第一张图应该有意义了:顶部是用JavaScript编写的应用程序(模块和核心Node.js内置模块);底部是用C/C++编写的Node.js内部组件。要桥接它们以便它们可以通信,您需要绑定。这就是Node.js绑定所处的位置:位于高级应用程序和低级节点组件之间。此图不一定表示工作流;它只是根据不同Node.js部分之间的关系/功能对它们进行分类。
第二个图表示Node.js应用程序的实际工作流程。在应用程序中编写的代码将由V8进行编译。代码通过绑定与低级Node.js组件通信。在您的代码中编写的所有事件都注册到Node.js。一旦事件被触发,它们就会根据它们被触发的顺序在事件队列中排队。只要事件队列中仍有剩余的事件,事件循环就会不断地获取它们,调用它们的回调函数,并将它们发送到工作线程进行处理。一旦回调函数被执行,它的回调被再次发送到事件队列,等待被事件循环再次拾取。
您的部分困惑可能来自于第二张图中使用的技术术语的选择。如果仔细观察,下面的"NODE.JS BINDINGS“表示"(NODE API)",不幸的是,这是两个不同的东西。Node.js API是其内置库的接口,而从软件编程的角度来看,bindings是用不同语言编写的代码之间的桥梁。
我希望这能帮到你。
Node.js内部结构的一个更准确的表示是:
(我前段时间从网上下载了这张图片,我忘了它是从哪里来的。如果图片属于你,请评论,我会在下面添加信用!谢谢!)
编辑:我最近写了一篇更全面的文章,用一个简单易懂的类比来解释Node.js's architecture。我希望它能帮上忙!
https://stackoverflow.com/questions/36766696
复制相似问题