Node.js 16 is a major release that includes new features and bug fixes. Here are the most important changes:

  • Support for async/await in Node.js 8 and above
  • Improved performance when using streams
  • New module system with better support for dependencies
  • Updated crypto libraries ..

Node.js has launched its latest major version. Released in April 2021, v16 is the new “current” release. In October 2021, it will be promoted to the Long Term Support (LTS) release with maintenance continuing into 2024.

The Node.js release process sees updates from the “current” branch merged into the next major feature release. Consequently, v16 brings several recently added v15 features into what will eventually become the LTS branch. Although already available in v15, the changes are new to LTS users.

JavaScript Engine Updates

Node.js 16 ships with v9.0 of the V8 JavaScript engine. This replaces V8 8.6 in Node.js 15. In the months between the two releases, V8 has landed several new features alongside significant performance enhancements.

One such improvement is faster calls to functions with a mismatched argument list length. JavaScript permits you to pass a different number of arguments to the function’s signature:

The first variant is commonly used when a parameter is optional. The latter variant sometimes occurs when a function is refactored to remove an argument. This kind of code incurred a performance penalty prior to V8 8.7. Reworking the internals used to handle mismatched argument list lengths has virtually eliminated the overhead.

Another performance improvement concerns the super property. This JavaScript feature lets you access the parent of a class that’s using inheritance. Calls to super used to be unoptimised, incurring a runtime call on each use. V8 v9 shipped changes enabling super property access to execute orders of magnitude more quickly. This optimisation is now available to Node.js users.

Finally, V8 v9 comes with a significant new feature for regular expressions. You can now request an array containing the start and end positions of each matched capture group. This is enabled using the /d flag with RegExp. You can then access the indices array via the indices property of the execution result object.

The first item in the array represents the entire match. The subsequent elements give you the positions of each matched capture group in the input string.

npm v7

Node.js v16 will introduce npm v7 to the LTS channel. npm underwent a substantial internal refactoring to improve performance and overhaul the peer dependencies workflow.

Peer dependencies are now installed automatically alongside regular dependencies. This might be a breaking change in some workflows, although disruption’s “usually minimal.”

There’s also a new format for package-lock.json which enables more reliable deterministic builds. It now includes everything npm needs to rebuild your package tree from scratch. If you’re migrating from Yarn, npm’s gained support for yarn.lock files too.

Other Notable Changes

v16 promotes the Timers Promises API to stable status. This API provides JavaScript timer functions that return native promises. Functions such as setTimeout() usually accept a callback. This can be unwieldy when used with modern asynchronous code.

Using promises makes for more readable code when combined with async/await. Waiting for a timer feels like a traditional sleep call in a synchronous language.

Node.js has also added experimental support for the Web Crypto API. This W3C specification is intended to give web applications access to an elementary set of cryptographic functions. The API offers hash generation and signature verification alongside encryption and decryption utilities.

Offering Web Crypto support in Node.js improves interoperability between JavaScript on servers and JavaScript in web browsers. The Node implementation extends various aspects of the W3C spec and includes its own variations of some objects.

Apple Silicon

A change that’s completely new in v16 is the publication of builds for Apple Silicon processors. This should improve performance on new Mac hardware. Node.js will run natively on the Apple M1, instead of using the Rosetta emulation layer.

Users installing via the tarball distribution mechanism will need to choose between darwin-x64 (Intel) or darwin-arm64 (Apple Silicon) packages. If you use the macOS install utility, a single download with support for both architectures is provided.

Deprecations

Being a major release, v16 comes with some deprecations and removals. You can find the full list in the complete changelog.

A notable deprecation is the intent to remove access to several core modules via process.binding(). This call provides a mechanism to access the underlying C++ objects behind the Javacript implementation of modules. Bindings for modules including crypto, v8, async_wrap and url have been deprecated and could be removed in the future.

Elsewhere, the recursive option to the fs.rmdir() directory removal function has been deprecated. New code should use the alternative fs.rm(path, {recursive: true}) function instead. This change has been made to better align Node.js with the rmdir Unix command and rmdir()-equivalent functions in other programming languages.

Summary

Node.js v16 is a major new release which will bring several new features to the LTS channel while rolling the latest V8 JavaScript features. This comes alongside npm v7 and the launch of Apple Silicon-native builds.

You can get the new release via the current channel by following the installation docs on the Node.js website. v16 will replace v14 as the LTS release on October 26th, 2021.

The current Node.js v15 release will remain supported until June 1st, 2021. Users should look to upgrade to v16 as soon as possible. The currently active LTS branch, v14, will be maintained through the end of April 2023.