Node: 18

This meant you could pipe fetch responses directly to file streams using a standard API:

For small microservices or internal tools, Node 18's test runner eliminated configuration fatigue. No more jest.config.js , no more mocha --timeout . Just node --test and go. Streaming in Node has always been powerful but verbose. Node 18 shipped the Web Streams API as a global, matching the spec used in browsers.

This wasn't just about convenience. It reduced bundle sizes, improved standardization, and made isomorphic JavaScript (code that runs identically on client and server) a true reality. Okay, maybe not death , but a serious challenge. Node 18 introduced an experimental test runner that later became stable in Node 20. For the first time, you could write and run tests without a single devDependency . node 18

// Before Node 18 (and 17.5 experimental) const fetch = require('node-fetch'); // After Node 18 async function getData() const res = await fetch('https://api.example.com/data'); const data = await res.json(); console.log(data);

Thank Node 18 for fetch , streams, and a built-in test runner. Then leave it behind. What version of Node are you running in production right now? Let us know in the comments below. This meant you could pipe fetch responses directly

Upgrade your dependencies or use --openssl-legacy-provider (not recommended for production). The node: Protocol Node 18 strongly encourages using the node: import prefix for built-in modules. This is mandatory if you use ES modules ( "type": "module" in package.json ).

Let’s be honest: in the JavaScript ecosystem, FOMO (Fear Of Missing Out) is real. The moment a new version of Node drops, many developers rush to update. But while the community clamors over Node 20, 22, or even 24, a quiet workhorse is powering millions of production applications: . Streaming in Node has always been powerful but verbose

test('asynchronous passing test', async (t) => assert.strictEqual(await Promise.resolve(2), 2); );