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

修改时间 2021-05-03

真诚赞赏,手留余香
赞赏
随机推荐
详谈JavaScript数组合并常见几大方法
jquery Jcrop图像裁切插件中文api文档及示例
macOS重装Adobe Photoshop CS6
PHP curl的GET和POST
详解 RESTful API 中的动词覆盖
Windows Server 2008 R2 实现网络流量的监控和限制
Andorid Studio连接红米Note
ffmpeg 推送流到nginx服务器,生成m3u8 地址
Javascipt数组
MYSQL导入数据出现The MySQL server is running with the --secure-file-priv