电子商务|如何开发 Node.js Native Add-on?( 二 )
不过因为这些同一个进程中的 worker 线程是共享了同一个内存空间的 , 多个 add-on 的实例必须考虑到多个 worker 线程的同时存在的可能性 。 另外 , 每一个 Node.js 进程只会加载了一次这些 add-on 的动态库 , 这意味着这些 add-on 线程不安全的全局属性(比如全局静态变量)可以被多个线程同时访问 , 也就不能再这么简单粗暴地存储了 。
类似的 , C++ 类的静态数据成员也是通过线程不安全的方式存储的 , 所以这个方式也需要被避免 。 另外 , 其实对于 add-on 来说 , Node.js 也不保证单个线程只会用来执行一个 worker , 所以 thread-local 也应该被避免 。
在 N-API v6 中 , 我们为每一个 Node.js 实例(主线程 JavaScript 实例、worker 实例等)都引入了一个用来给 add-on 使用的存储空间 。 这样 , add-on 在一个进程中就可以获得对于单个 Node.js 实例唯一的存储空间了 。 同时我们也提供了一些辅助方法来帮助 add-on 开始使用这个特性:
NAPI_MODULE_INIT() 宏 , 会将 add-on 标记为可以被 Node.js 在同一个进程中可以多次加载、卸载的模块 。napi_get_instance_data() 和 napi_set_instance_data() 用来安全地访问单个 Node.js 实例给 add-on 创建的全局唯一存储空间; node-addon-api 还提供了 AddonT类 , 这个类包装了上面说所的方法 , 以 C++ 友好的方式封装了这个给予 add-on 可以在不同的 worker 线程中使用的存储空间 。 因此 , add-on 开发者可以将 add-on 的数据比如全局变量通过 AddonT来存储并创建 , 而 Node.js 则会负责在当前线程使用这个 add-on 的时候创建这片空间 。
其他辅助函数
除了以上几个重要功能之外 , 我们也发现了许多在维护 Node.js add-on 的过程中经常会使用到的类型方法与函数 , 包括:
Date 对象; BigInts; 从 JavaScript 对象上获取任意键(如 Symbol 等); 将 Add-on 创建的 ArrayBuffer 底层存储从 ArrayBuffer 上脱离; 构建 构建工作流对于 Node.js add-on 维护者与 add-on 使用者来说是非常重要的一个环节 , 也是N-API 团队其中一个工作重心 , 比如 CMake.js node-pre-gyp 和 prebuild 。
曾经 Node.js add-on 只能使用 node-gyp 来构建 。 对于一些已经在使用 CMake 的库来说 , CMake.js 就是除了 node-gyp 依赖用来构建 add-on 的一个非常吸引人的选项 。 我们也已经发布了一个使用 CMake 构建 add-on 的例子 。
其他关于如何将 CMake.js 与 N-API add-on 一起使用的详细信息可以在 N-API Resource 获取到 。
开发 Node.js add-on 之后一个重要的现实问题就是在 npm install 时 , add-on 的 C/C++ 代码必须在本地编译、链接 。 这个编译过程需要本地安装有一个可以正常使用的 C/C++ 工具链 。 而这个依赖通常会成为没有安装这些工具链的 add-on 用户使用这个 add-on 的一个阻碍 。 现行的方案对于这个问题一般都是预先构建二进制包 , 然后在安装时直接下载这些预先构建的包 。
有许多工具可以用来预先构建二进制包 。 node-pre-gyp 通常会将构建出来的二进制包上传到 AWS S3 。 prebuild 也类似 , 不过是将包上传到 GitHub Release 。
prebuildify 则是另外一个可选项 。 而 prebuildify 相比于上述的工具来说 , 优点在于在 npm install 安装好时 , 本地就已经有这些二进制包了 , 而不需要再次从第三方服务上下载 。 虽然安装的 npm 包可能会更大 , 不过在实际实践中因为不需要再次从 AWS 或者 GitHub 上下载 , 整个安装过程会相对更加快速 。
开始上手 我们已经在 GitHub 上准备了非常多的 node-addon-examples 来给开发者快速了解常见场景该如何使用 N-API 和 node-addon-api 来开发 Node.js add-on 。 这个仓库的根目录包含了许多的文件夹 , 这些文件夹就代表了不同的使用场景 , 比如从简单的 Hello World add-on , 到复杂的多线程 add-on 。 每一个样例目录会包含 3 个子目录 , 分别代表了传统的 NAN , N-API , 和 node-addon-api 开发 add-on 的例子 。 我们可以直接运行下面的命令 , 立刻从 Hello World 的例子开始使用 node-addon-api:
- meta|促进更逼真AR/VR体验,Meta正在开发全新空间音频工具
- 创投圈|抖音小店无货源适合新手小白么?如何精细化运营?新手小白看来
- 松下|淘宝店铺信誉分等级如何提升?
- PHP|如何降低用户关注的非必要页面的权重传递?
- 量子纠缠存在于任何维度空间?人类如何逃出三维空间变成“神”?
- 显卡|如何组装旗舰游戏电脑?这里有你想要的答案
- 火星和地球交换位置会如何?火星会出现生命吗?答案没你想得简单
- 快手视频|视频号和抖音快手的差异化在哪里呢?你应该如何选择适合你的平台
- 电子商务|关于电子商务
- 电子商务|欧洲跨境电商销售额市场排名公布,第一名令人意外!
