Node.js 16, released on April 20, brings several exciting updates to the popular JavaScript runtime, including the addition of Apple Silicon support and enhanced API stability. For the first time, Node.js ships with prebuilt binaries for Apple’s new ARM-based M1 chips. This version offers a “fat” (multi-architecture) binary in the macOS installer, allowing it to support both Intel and Apple Silicon (ARM) architectures. This move aligns Node.js with the growing shift to ARM-based processors, offering better performance and compatibility for Apple’s latest hardware.
In addition to Apple Silicon support, Node.js 16 introduces a host of new features that improve the developer experience. One notable addition is the stabilization of the Timers Promises API, which provides an alternative to traditional timer functions by returning Promise objects. This enhancement eliminates the need for workarounds like util.promisify()
and simplifies asynchronous programming within Node.js. The API’s stability marks an important step forward in providing a more modern and promise-based approach to handling timers in JavaScript.
The upgrade also includes an updated version of the Google V8 engine, now at version 9.0, compared to V8 8.6 in Node.js 15. This upgrade brings several performance improvements and introduces new ECMAScript features, such as RegExp Match Indices. This feature allows developers to retrieve the start and end indices of captured strings in regular expressions, enhancing the flexibility and utility of regular expression matching in JavaScript. As V8 continues to evolve, Node.js 16 benefits from a more powerful and feature-rich JavaScript/WebAssembly engine.
Node.js 16 also includes features that were introduced in Node.js 15, but are now considered stable. These include Node-API version 8, stable Source Maps v3, and new web platform APIs for atob and btoa methods (buffer.atob(data) and buffer.btoa(data)) to provide compatibility with legacy web platform APIs. However, this release also comes with some notable deprecations, including the runtime deprecation of access to process.binding()
for certain core modules, such as process.binding('http_parser')
. These changes reflect the ongoing effort to modernize the Node.js runtime while maintaining compatibility and improving performance.