当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《哪个是正确的Node.js架构?》经验,为你挑选了1个好方法。

我对Node.js的架构有点困惑

这是真的吗?

在此输入图像描述

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



1> Aren Li..:

首先,虽然第一个图表有点过时,但两个图表都是正确的.Node.js的ascynchronous部分曾经由libev,libeio和libuv组成.然而,随着libuv在过去几年的推进过程中," 删除了libuv libev的node-v0.9.0版本 ",让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架构的不同部分,然后再解释它们相互交互的方式:

V8 - Google的开源JavaScript引擎,位于Chrome/Chromium浏览器中.V8不像典型的Web浏览器那样动态地解释JavaScript代码,而是将您的JS代码转换为机器代码,以便快速实现.V8是用C++编写的.详细了解V8如何在这里工作.

libuv - libuv最初开发用于提供异步I/O,包括异步TCP和UDP套接字,(着名的)事件循环,异步DNS解析,文件系统读/写等.libuv是用C语言编写的.这是一个很好的视频了解更多有关libuv的信息.

其他低级组件 - 例如c-ares,http解析器,OpenSSL,zlib等,大多用C/C++编写.

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

绑定 - 绑定基本上是用一种语言编写的库的包装,并将库公开给用另一种语言编写的代码,以便用不同语言编写的代码可以进行通信.

现在第一个图应该有意义:顶部是用JavaScript编写的应用程序(,模块和核心Node.js内置模块); 底部是用C/C++编写的Node.js内部组件.要将它们连接起来以便它们可以进行通信,您需要绑定.这就是Node.js绑定的位置:在高级应用程序和低级Node组件之间.此图表不一定代表工作流程; 它只是根据彼此的关系/功能对不同Node.js片段进行分类.

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

您的部分困惑可能来自第二个图表中使用的技术术语的选择.仔细观察,在"NODE.JS BINDINGS"下面写着"(NODE API)",不幸的是,它是两个不同的东西.Node.js API是其内置库的接口,而从软件编程的角度来看,绑定是用不同语言编写的代码之间的桥梁.

我希望这有帮助.


Node.js内部结构的更准确表示是这样的: Node.js架构 (我前一段时间从互联网上的一个来源下载了这张照片,我忘了它来自哪里.如果图片属于你,请发表评论,我会在下面添加信用!谢谢!)


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

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有