Node 15 vs. Node 16
Tags: node, reactnative, api
Published: 2021-06-22 20:32:01

On April 20, 2021, OpenJS released the latest major version of Node.js, Node 16.

With this even-numbered release, we see a few changes to the V8 engine, support for the new Apple Silicon processors, and a stable Timers/Promises API. We can also expect to see long-term support for this version.


## High Level Changes
### "Even number" vs. "Odd number" releases

As an even-numbered release, we can expect to see Node 16 move to long-term support status, which guarantees that critical bugs will be fixed for a total of 30 months. Also, because Node 16 is an even-numbered release, Node 15 has officially become unsupported.

ONe of the quirks of Node worth remembering is that odd-numbered releases – those literally ending in an odd number -- will go End-of-Life as soon as the next Semantic Version release line ships. According to [NodeSource](https://nodesource.com/blog/understanding-how-node-js-release-lines-work/), a blog covering all things Node, Semantic Versions, or SemVers as they are called, include:

* Major Release: Major Releases are for incompatible API changes, from version to version. Major releases can also include changes that would normally be included as Minor or Patch releases.
* Minor Release: Minor Releases include backward compatible functionality changes. Minor releases can also include changes that would normally be included as Patch releases.
* Patch Release: Patch releases include non-breaking bug fixes and security patches.

Conversely though, even-numbered releases become Long-Term Support, which is say they will be supported and maintained by the Node.js project for an extended period of time.

From a support standpoint, it's worth understanding the implications which version of Node version you're business is running. 


![Node JS release schedule](https://raw.githubusercontent.com/nodejs/Release/master/schedule.svg?sanitize=true)

### timers/promises API

Starting with version 16.0, the timers/promises API officially moves from `experimental` to `stable`. This API simply gives gives a way to define a timer as a `Promise` object. 

```javascript
import { setTimeout } from 'timers/promises';

const main = async () => {
  console.log(new Date().toTimeString());
  await setTimeout(1000);
  console.log(new Date().toTimeString());
}

main();
```

Running the following example correctly `await`'s the `Promise` returned from `setTimeout`, and prints out the following: 

```bash
16:45:41 GMT-0700 (Pacific Daylight Time)
16:45:42 GMT-0700 (Pacific Daylight Time)
```
### V8 Upgraded to V8 9.0

The V8 JavaScript engine is updated to V8 9.0, up from 8.6 in Node 15. With this upgrade comes some performance improvements, and the ECMAScript RegExp Match Indices, which provide the start and end indices of a string through a new `.indices` property on certain match objects. 

```javascript
const matchObj = /(Node) (16)/d.exec('Node 16');
```

Given a match object defined above, we get the following when logging out `matchObj.indices`, outlining the start and end indices of each match. 

```javascript
[[0, 7], [0, 4], [5, 7], groups: undefined]
```


### Apple Silicon support

In order to support Apple's new Apple Silicon M1 chip, the macOS installer (.pkg) will be shipped as a multi-architecture binary. This means that Node 16 will work on the new M1 Macs.

### Breaking Changes

None coming from Node 15.

## Conclusion

Node 16 will be supported next 30 months, while simultaneously discontinuing support for Node 15 immediately. This makes this a "must" upgrade for those currently on Node 15, and definitely something to consider coming from Node 14 in order to stay on the current LTS version for the longest. 

This post originally appeared [this blog](https://nextlinklabs.com/) where we cover [devops consulting services](https://nextlinklabs.com/services/devops-consulting-services).