本文记录对 Node 认知的改变

之前,对于node的认知仅在于些个js 使用node命令来执行,最近接触到vue的前端项目,越发觉得对于前端的认知很是匮乏

关于 node,我希望了解 node 是什么,如何进行工作的,便在网上查阅资料,在简书上看到这样一篇文章:

Node内部工作原理解析: https://www.jianshu.com/p/a8f5a8cdc6ab

该文章从 node 源码的角度分析其工作原理,给了我很大的帮助(我不是专业的前端技术人员,不敢对文章的好坏做出评价,仅表示对我了解 Node 的历程有很大帮助)

Node 简介

Node is a runtime environment for executing javascript code.  

Node 不是一种语言,也不是一种框架,而是一个能够执行 JavaScript 代码执行的运行时环境。

最初, JavaScript 仅支持在浏览器中,浏览器依赖JS引擎把JavaScript代码转换成浏览器能够识别的机器码,从而支持Javascript的执行,如 Chrome 的 V8 引擎。

后来,Node 创始人Ryan Dahl 希望在浏览器外的其他地方也能够支持 JavaScript的执行,便把google的 V8 引擎嵌入到C++的程序中,并扩展一定的功能,创建 支持执行JavaScript的 Node。

这里我们关注两个依赖库 V8, libuv

V8: 负责将Javascript 转成 c++

libuv: c++ 开源项目,处理并发及进程构建,提供访问操作系统文件及网络的能力

而Node 在这里封装c++的api,给javascript提供很好的接口,实现javascript与计算机上的c++之间的良好交互。(个人理解:简言之,不用写c++,直接通过javascript的接口访问c++的中间层。)

 

从代码的角度分析Node具体的工作原理:

例如: 

模块 scrypt.js 中提供了scrypt函数

https://github.com/nodejs/node/blob/6a9ec8d9331ee726b26ef8427c42e7571bf31174/lib/internal/crypto/scrypt.js

 函数调用了 _scrypt(keybufpasswordsaltNrpmaxmemwrap), 函数由internalBinding获取 const { scrypt: _scrypt } = internalBinding('crypto');

 c++ 代码中函数的定义与绑定:

 Scrypt函数的绑定: env->SetMethod(target, "scrypt", Scrypt); , 与前面js中函数的获取想对应 const scrypt: _scrypt internalBinding('crypto');

至此,从 js 到 c++ 的逻辑解析完成,并盗图一张:

 

认知总结

Node 对 JavaScript 的作用有些像 JVM 对 Java 的作用,js对c++的调用过程类似于 java 中的 JNI 技术, v8 引擎也类似于字节码引擎。

高级程序的架构可能都会有一些类似的地方。

posted on 2021-03-03 14:52  i野老i  阅读(692)  评论(0编辑  收藏  举报