V8引擎、 libuv 和 N-API
Node.js系统
application 应用将代码送到V8处理引擎处理js,其他io操作通过nodejs bindings 内部封装的 os operation。
llibuv是一个调度系统,本身不处理底层api,只负责接住从nodejs传过来的事件,剩下的事情由操作系统处理,操作系统处理事件的时候 worker threads 等待处理结果。
V8的线程是程序调起来的,当执行程序的时候,就会拉起nodejs的进程,工作进程也是主进程。
libuv 异步机制和调用系统两个作用。
什么是V8引擎
v8引擎是一种JavaScript引擎的实现。JavaScript引擎是执行JavaScript代码的程序或解释器。除了v8引擎,还有其他 JavaScript引擎,比如:Rhin、SpiderMonkey、JavaScriptCore、Chakra、Nashorn、JerryScript等。
V8使用C++开发,在运行JavaScript之前,相比其它的JavaScript的引擎转换成字节码或解释执行,V8将其编译成原生机器码(IA-32, x86-64, ARM, or MIPS CPUs),在V8引擎下的运行速度媲美二进制程序。
V8支持众多操作系统,如windows、linux、android等,也支持其他硬件架构,如IA32,X64,ARM等,具有很好的可移植和跨平台特性。
libuv
libuv是一个跨平台聚焦于异步IO的库,著名的event-loop便是libuv的一大特色。Node.js 能够实现跨平台,就是利用了libuv。
N-API
编写 C/C++ 的扩展本来就是一件很复杂的事情,另外,开发者需要了解 V8 以及 NAN(Native Abstractions for Node.js) 的 API/ABI, 而这些 API/ABI 本身不是为 Node.js 的场景设计的因此并不友好。另外,C/C++ 的扩展直接依赖 V8 以及 NAN 的接口稳定性,使得编译维护的成本非常高。
Node 10 正式引入的 N-API 就是要解决这个问题,通过提供一个稳定的 ABI 抽象层,使得 C/C++ 扩展的跨平台编译成本显著降低。
C/C++ 的生态因为缺乏统一的构建工具链以及包管理工具,用 Rust 替代 C/C++ 是一个很好的选择,Rust 有现代化的包管理器,经过这么多年的发展有了非常多的沉淀。比起 C/C++ 生态,Rust 生态的包属于只要有,都可以直接用 的状态,而 C/C++ 生态中的第三方代码则属于肯定有,但不一定能直接用的状态。这种状态下,用 Rust 开发 Node addon 是更好的选择。
参考:
https://www.jianshu.com/p/81f6ded64ab2
https://www.yuque.com/nznql7/qgxbp1/lvoyu1
https://cloud.tencent.com/developer/article/1700664