电子商务|如何开发 Node.js Native Add-on?

电子商务|如何开发 Node.js Native Add-on?

文章图片

电子商务|如何开发 Node.js Native Add-on?

文章图片

电子商务|如何开发 Node.js Native Add-on?


这篇文章是由 Chengzhong Wu (@legendecas) , Gabriel Schulhof (@gabrielschulhof), Jim Schlight (@jimschlight) , Kevin Eady , Michael Dawson (@mhdawson1) , Nicola Del Gobbo (@NickNaso) 等人编写的 , 首发在 Node.js Medium 博客 。
关于N-API N-API 为 Node.js 带来了一个 ABI 稳定的 add-on API , 简化了构建和开发支持跨 Node.js 版本的 add-on 的负担 。

目前 N-API 的 C++ 封装 node-addon-api 每周的下载量已经超过了 250万次 , 并且所有 Node.js LTS(长期支持版本)都已经支持了 N-API v3 或者更高版本, Node.js 15.x 更已经开始支持最新的 N-API v7 。 所以我们认为这是一个非常好的时间点来回头看一看目前 Node.js add-on 的开发体验 。
当我们在 2016 年开始投入 N-API 的工作(最开始的提案是在 2016 年 12 月 12 日提出的) , 我们就知道这会是一个非常长期的任务 。 Node.js 社区生态中已经有非常多现存的包 , 所以这个迁移过程将会持续相当长的一段时间 。
不过好消息是 , 从最初的想法 , 到现在这段路程我们已经走过了非常长的路途 。 许许多多的困难已经由多位 Node.js Collaborator、N-API 团队和模块包作者们攻克 。 目前 , N-API 已经成为了默认、推荐的编写 Node.js add-on 的方式 。
随着 N-API 的发展 , 不断有新的 API 加入到 N-API 中去来满足 Node.js 模块包作者将他们的库向 N-API 迁移中提出新需求 , 当然这个过程也按照我们预先的设计 N-API 一直保持着稳定、向前兼容性 。
我们也非常高兴地看到这些模块包作者们的积极反馈 , 比如 https://twitter.com/mafintosh/status/1256180505210433541

不多说 , 我们先来看看过去几年被添加到 N-API 中的新特性吧 。
新特性 越来越多的开发者们开始使用 N-API 与 node-addon-api 开发 Node.js add-on , 我们也不断地为 N-API 和 node-addon-api 添加新的关键特性和改进 add-on 开发体验 。

这些改进可以分为 3 个主要的类别 , 我们下文将一一介绍 。
多线程与异步编程
随着 Node.js 的使用在开发者群体中越来越显著 , 需要与 OS 接口、异步事件打交道的需求也越来越旺盛 。 Node.js 是一个 JavaScript 单线程模型的实现 , 一个 Node.js 环境只会有一个主线程可以访问 JavaScript 值 。
因此 , 在主线程执行重 CPU 的任务就会导致 JavaScript 程序被阻塞 , 导致事件与回调都堆积在事件队列中 。 为了改进程序的跨线程数据完整性的开发体验 , 我们收集了非常多的真实案例的需求 , 在 N-API 和 N-API 的 C++ 封装 node-addon-api 中都带来了多种机制来解决工作线程回调回 JavaScript 线程的问题 。 根据使用场景 , 可以分为:
AsyncWorker , 提供单向、单次的回调任务封装 , 可以通知 JavaScript 这个任务的最终执行结果或者异常信息; AsyncProgressWorker , 与 AsyncWorker 类似 , 提供单向、单次的回调任务封装 , 不过增加了向 JavaScript 异步传递进度信息的机制; Thread-safe functions , 提供了从任意线程、任意数量的线程、任意时间点向 Node.js JavaScript 线程回调的机制 。多 Node.js 上下文支持
Node.js 近期最让人兴奋的特性之一就是 [worker_threads
, 它提供了一个完整的、但是独立于 Node.js 主 JavaScript 线程的并发执行的 Node.js JavaScript 执行线程 。 这也意味着 Node.js 的 add-on 也同样可以在这些 worker 线程中随着这些 worker 的启动与销毁被多次加载、卸载 。