Nodejs addon开发

为什么需要原生模块

  1. 在一些情况下,C++模块的性能要比js好
  2. 不得不用,nodejs无法完成的功能,我们在桌面开发中,需要调用操作系统的API,由于操作系统都提供了基于C\C++的API,所以可用C\C++实现

是什么

  1. C++模块编译后,会生成后缀名为.node的文件
  2. .node文件本质上是动态链接库

开发方式

  1. 直接使用nodejs API 和V8 API
    • 问题:
      • 强依赖于底层API,如果API发生变动,此模块就不能使用了,需要重新编写
      • nodejs版本改变也要重新编译
  2. Native Abstractions for Node.js(NAN) Node.js 原生模块抽象接口
    • 实质:是C++的宏,根据不同node版本展开
    • 好处:一般情况下,一次编码可兼容多个node版本
    • 问题:NAN做出改变时,也需要重新编码; 跟node版本绑定,一次编译只能用于特定node版本
  3. N-API
    • 实质:中间层,把Node.js 的所有底层数据结构全部抽象成 N-API 当中的接口,应用二进制接口(Application Binary Interface)
    • 目标:
      • 以 C 的风格提供稳定 ABI 接口;
      • 消除 Node.js 版本的差异;
      • 消除 JavaScript 引擎的差异(如 Google V8、Microsoft ChakraCore 等)
      • 优点:面向ABI编码,一次编译可适用多个nodejs版本

构建

  1. build tools
    用于生成各个操作系统下的项目工程文件(windows 、mac、linux): Visual Studio、Xcode、Makefile
    • node-gyp
    • CMake.js
  2. 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一起下载

参考

  1. https://cnodejs.org/topic/5957626dacfce9295ba072e0
  2. https://nodejs.org/fr/docs/guides/abi-stability/