Latest in branch 18.x
18.20.8
Released 27 Mar 2025
(1 year ago)
SoftwareNode.js
Branch18.x
StatusLTS
End of life
Initial release18.0.0
18 Apr 2022
(4 years ago)
Latest release18.20.8
27 Mar 2025
(1 year ago)
CodenameHydrogen
End of bug fixes18 Oct 2023
(Ended 2 years, 6 months ago)
End of security fixes30 Apr 2025
(Ended 1 year ago)
Release noteshttps://github.com/nodejs/node/releases/tag/v18.20.8
Source codehttps://github.com/nodejs/node/tree/v18.20.8
Documentationhttps://nodejs.org/dist/latest-v18.x/docs/api/
Downloadhttps://nodejs.org/download/release/latest-v18.x/
Node.js 18.x ReleasesView full list

What Is New in Node.js 18?

CategoryChange
New Featuresfetch() API enabled globally (experimental, no flag needed)
New Featuresnode:test built-in test runner module
New FeaturesWeb Streams API (ReadableStream, WritableStream, TransformStream)
New FeaturesBlob URL support via URL.createObjectURL(blob)
ImprovementsV8 10.2 -- class static blocks, Array.findLast, Error.cause
Improvements--experimental-fetch officially named and included
ImprovementsOpenSSL 3.0 LTS bundled
Securitynpm 8.6.0
Deprecatedurl.parse() documented as legacy

Global fetch() -- HTTP Requests Without npm install

Node.js 18 includes fetch() in the global scope without any import. Under the hood it uses the undici library. You can make HTTP/HTTPS requests from server-side code using the exact same API as browsers.

const res = await fetch('https://api.example.com/data');
const json = await res.json();
console.log(json);

This marks a shift in Node.js philosophy -- instead of npm packages filling browser API gaps, Node itself ships those APIs. The node-fetch package remains relevant for older versions but is no longer needed in v18+.

Built-in Test Runner -- node:test

The node:test module provides a native test runner with TAP output, subtests, and async support. No Jest, Mocha, or Tap install required for simple test suites.

import test from 'node:test';
import assert from 'node:assert';

test('adds correctly', () => {
  assert.strictEqual(1 + 1, 2);
});

test('async test', async () => {
  const result = await Promise.resolve(42);
  assert.strictEqual(result, 42);
});

For v18 this is experimental, but the API is stable enough to use for new projects. The runner integrates with node:assert and produces TAP output readable by most CI systems.

Web Streams API in Node.js Core

WHATWG Streams (ReadableStream, WritableStream, TransformStream) are available as globals in Node.js 18. These are the same streaming primitives used in browsers, enabling isomorphic streaming code.

The connection between Node.js stream.Readable/stream.Writable and the WHATWG streams is handled via stream.Readable.toWeb() and stream.Readable.fromWeb().

New JavaScript Features via V8 10.2

Class static initialization blocks let you run setup code inside a class body. Array.prototype.findLast() and findLastIndex() search from the end of an array. Error.cause lets you chain error context without losing the original error.

const arr = [1, 2, 3, 4];
console.log(arr.findLast(x => x % 2 === 0)); // 4

try { /* ... */ } catch (err) {
  throw new Error('DB query failed', { cause: err });
}

FAQ

Is fetch() in Node.js 18 fully compatible with browser fetch?
Mostly, but there are known gaps -- for example, no support for credentials in the cookie jar or service workers. For most API calls it works identically to browser fetch.

Should I switch from Jest to node:test in Node.js 18?
Not necessarily. For v18, node:test is still experimental and lacks mocking, snapshot testing, and rich matchers. Jest and Vitest remain better choices for complex test suites.

Does OpenSSL 3.0 in Node.js 18 break any cipher compatibility?
Yes -- some older, legacy ciphers (MD4, some 3DES modes) are disabled by default in OpenSSL 3.0. If your app depends on these for TLS or hashing, you may need to update your crypto configuration.

Is Node.js 18 an LTS version?
Yes. Node.js 18 is an LTS release (codename "Hydrogen") with active support until April 2025 and security updates until April 2027.

Can I stream a fetch() response directly to a file?
Yes. Use response.body (a ReadableStream) and pipe it through stream.Readable.fromWeb() into a fs.createWriteStream().

Releases In Branch 18.x

VersionRelease datenpm version
18.20.827 Mar 2025
(1 year ago)
10.8.2
18.20.720 Feb 2025
(1 year ago)
10.8.2
18.20.621 Jan 2025
(1 year ago)
10.8.2
18.20.511 Nov 2024
(1 year ago)
10.8.2
18.20.408 Jul 2024
(1 year ago)
10.7.0
18.20.320 May 2024
(1 year ago)
10.7.0
18.20.210 Apr 2024
(2 years ago)
10.5.0
18.20.102 Apr 2024
(2 years ago)
10.5.0
18.20.026 Mar 2024
(2 years ago)
10.5.0
18.19.113 Feb 2024
(2 years ago)
10.2.4
18.19.029 Nov 2023
(2 years ago)
10.2.3
18.18.213 Oct 2023
(2 years ago)
9.8.1
18.18.110 Oct 2023
(2 years ago)
9.8.1
18.18.018 Sep 2023
(2 years ago)
9.8.1
18.17.108 Aug 2023
(2 years ago)
9.6.7
18.17.018 Jul 2023
(2 years ago)
9.6.7
18.16.120 Jun 2023
(2 years ago)
9.5.1
18.16.012 Apr 2023
(3 years ago)
9.5.1
18.15.005 Mar 2023
(3 years ago)
9.5.0
18.14.221 Feb 2023
(3 years ago)
9.5.0
18.14.116 Feb 2023
(3 years ago)
9.3.1
18.14.001 Feb 2023
(3 years ago)
9.3.1
18.13.005 Jan 2023
(3 years ago)
8.19.3
18.12.104 Nov 2022
(3 years ago)
8.19.2
18.12.025 Oct 2022
(3 years ago)
8.19.2
18.11.013 Oct 2022
(3 years ago)
8.19.2
18.10.028 Sep 2022
(3 years ago)
8.19.2
18.9.123 Sep 2022
(3 years ago)
8.19.1
18.9.007 Sep 2022
(3 years ago)
8.19.1
18.8.024 Aug 2022
(3 years ago)
8.18.0
18.7.026 Jul 2022
(3 years ago)
8.15.0
18.6.013 Jul 2022
(3 years ago)
8.13.2
18.5.006 Jul 2022
(3 years ago)
8.12.1
18.4.016 Jun 2022
(3 years ago)
8.12.1
18.3.002 Jun 2022
(3 years ago)
8.11.0
18.2.017 May 2022
(3 years ago)
8.9.0
18.1.003 May 2022
(4 years ago)
8.8.0
18.0.018 Apr 2022
(4 years ago)
8.6.0