Building Modern Native Add-ons for Node.js in 2020


New features/functions

Multi-Threaded and Asynchronous Programming

  • AsyncWorker: provides a mechanism to perform a one-shot action, and notify Node.js of its eventual completion or failure.
  • AsyncProgressWorker: similar to the above, adding the ability to provide progress updates for the asynchronous action.
  • Thread-safe functions: provides a mechanism to call into Node.js at any time from any number of threads.


  • the NAPI_MODULE_INIT()macro, which will initialize an add-on in such a way that it can then be loaded multiple times during the life cycle of the Node.js process.
  • napi_get_instance_data() and napi_set_instance_data() in order to provide a place for safely storing global data associated with a single instance of an add-on.
  • The node-addon-api Addon<T> class, which neatly combines the above tools to create a class whose instances represent instances of an add-on present in the various worker threads created by Node.js. Thus, add-on maintainers can store per-add-on-instance data as variables in an instance of the Addon<T> class and Node.js will create an instance of the Addon<T> class whenever it is needed on a new thread:

Additional helper methods

  • Date objects
  • BigInts
  • Retrieving property names from objects
  • Detaching ArrayBuffers


Resources for getting started

git clone node-addon-examples/1_hello_world/node-addon-api/npm inode .
  • tools needed to get started
  • migration guide from NAN
  • differences between build systems (node-gyp, cmake, …)
  • context-sensitivity and thread-safety

Closing out and call to action

  • It has removed the need to recompile modules when migrating to newer major versions of Node.js
  • It allows JavaScript engines other than V8 to implement N-API which, in turn, allows add-on maintainers to target different runtimes (such as Babylon Native or IoT.js, and Electron) with the same code they use for supporting Node.js.
  • Since N-API is a C API it is possible to implement native add-ons using languages other than C / C++ (such as Go or Rust).

Get Involved

  • Porting your own native module to use N-API
  • Porting a native module that your app depends on to N-API
  • Adding new features to N-API
  • Adding new features from N-API to node-addon-api
  • Fixing or adding test cases for node-addon-api
  • Fixing or adding examples to node-addon-examples




Node.js is a collaborative open source project dedicated to building and supporting the Node.js platform.

Love podcasts or audiobooks? Learn on the go with our new app.

Recommended from Medium

How to Dockerize your React application in minutes

Strict equality v loose equality in JavaScript

Contract testing (Part 2) — A progressive workshop

Thursday — Week Nine

Introduction to Machine Learning With JavaScript Using Brain.Js

Day 28, Gun Implementation — Recoil, Debugging

JS Constructor Function

7 Reasons Why You Should Be Using React

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store


Node.js is a collaborative open source project dedicated to building and supporting the Node.js platform.

More from Medium

How to Cache API Requests with Redis and Node.js

Execute long-running jobs in the background [Node.js]

In Node.js, how do you solve a process that has run out of memory?

NodeJS & HTTP Error 431