Node.js 26: Temporal on by default, V8 14.6 and a round of removals
Node.js 26.0.0 came out on May 5. Like every even-numbered release, it starts as “Current” for the next six months and, according to the announcement, enters long-term support (LTS) in October. In other words, it is the version most teams will run in production from the end of the year, and it is worth starting to test it now.
Temporal, finally, with no flag
The change that excites me most is simple to describe: the Temporal API is now enabled by default in Node.js 26. Anyone who has suffered with JavaScript’s Date object, with zero-based months, confusing time zones and mutability, knows why this matters. Temporal brings separate types for dates, times, instants and time zones, all immutable.
A minimal example, to get today’s date in the ISO calendar:
const today = Temporal.Now.plainDateISO();
console.log(today.toString());
No polyfill to install and no command-line flag to pass. A behind-the-scenes detail: the Node build now includes cargo and rustc checks because of Temporal, so anyone compiling Node from source will need a Rust toolchain.
V8 14.6 and language features
The JavaScript engine was updated to V8 14.6, the same version as Chromium 146. With it come a few language features the announcement highlights:
- Map upsert:
getOrInsert()andgetOrInsertComputed()onMapandWeakMap, which return the existing value or insert a new one. Goodbye to the repetitive pattern of checking withhas, inserting withsetand reading withget. - Iterator sequencing:
Iterator.concat(), to chain several iterators into one.
The Undici HTTP client, which powers the native fetch, moved to version 8.0.2. And NODE_MODULE_VERSION is now 147, which means native addons need to be recompiled for this release.
What was removed
A major release is also the time to clean house, and Node 26 removes several things that had been deprecated for a while:
http.Server.prototype.writeHeader()is fully removed. The replacement iswriteHead().- Legacy stream modules:
_stream_wrap,_stream_readable,_stream_writable,_stream_duplex,_stream_transformand_stream_passthroughno longer exist. --experimental-transform-typeswas removed.
In addition, the crypto deprecation DEP0182 reached end-of-life, and module.register() now emits a runtime deprecation warning. Other crypto and stream deprecations were also promoted to runtime warnings.
The _stream_* modules are the kind of thing nobody uses directly today, but that may be hiding in an old dependency. That is the kind of breakage that shows up during an upgrade without anyone on the team having written the offending line.
Toolchain and platform changes
For anyone who compiles Node or maintains less common environments, there are important changes. The minimum GCC is now 13.2, and Python 3.9 support in the build was dropped. Support for the Power8 and IBM z13 architectures was discontinued, and builds for AIX and IBM i now target Power 9.
My take
Node.js 26 is a well-behaved transition release. Temporal on by default is the change that will show up in people’s code, and it is a real improvement for any application that deals with dates. The V8 additions are small, but getOrInsert will clean up a lot of caching and counting code.
The risk lies in the removals, and almost never in your own code. My suggestion is to run your test suite on Node 26 now, while it is still Current, to find out which dependencies use writeHeader, _stream_* modules or module.register(). When the release becomes LTS in October, you will already know what needs updating, instead of finding out in a rush.