为什么需要原生模块
- 在一些情况下,C++模块的性能要比js好
- 不得不用,nodejs无法完成的功能,我们在桌面开发中,需要调用操作系统的API,由于操作系统都提供了基于C\C++的API,所以可用C\C++实现
是什么
- C++模块编译后,会生成后缀名为.node的文件
- .node文件本质上是动态链接库
开发方式
- 直接使用nodejs API 和V8 API
- 问题:
- 强依赖于底层API,如果API发生变动,此模块就不能使用了,需要重新编写
- nodejs版本改变也要重新编译
- Native Abstractions for Node.js(NAN) Node.js 原生模块抽象接口
- 实质:是C++的宏,根据不同node版本展开
- 好处:一般情况下,一次编码可兼容多个node版本
- 问题:NAN做出改变时,也需要重新编码; 跟node版本绑定,一次编译只能用于特定node版本
- N-API
- 实质:中间层,把Node.js 的所有底层数据结构全部抽象成 N-API 当中的接口,应用二进制接口(Application Binary Interface)
- 目标:
- 以 C 的风格提供稳定 ABI 接口;
- 消除 Node.js 版本的差异;
- 消除 JavaScript 引擎的差异(如 Google V8、Microsoft ChakraCore 等)
- 优点:面向ABI编码,一次编译可适用多个nodejs版本
构建
- build tools
用于生成各个操作系统下的项目工程文件(windows 、mac、linux): Visual Studio、Xcode、Makefile
- Uploading precompiled binaries
基于上面的build tools加入预编译包,当有适合的预编译包时,直接下载使用,省去编译,这样开发者不用安装各种编译工具。经常与CI/CD结合
- node-pre-gyp
- 基于node-gyp
- 适合上传到Amazon S3,上传到其他服务需要有些改动
- prebuild
- node-gyp和CMake.js都可用
- 只支持上传到 GitHub releases
- prebuildify
- 基于node-gyp
- 直接上传到npm,install时和module一起下载
参考
- https://cnodejs.org/topic/5957626dacfce9295ba072e0
- https://nodejs.org/fr/docs/guides/abi-stability/