| name | cli-nodejs-26 |
| description | Node.js 26 (Current) version-specific expertise. Temporal API enabled by default, V8 14.6 (Map/WeakMap.getOrInsert + getOrInsertComputed, Iterator.concat), Undici 8 fetch client, npm 11.x, and semver-major removals (legacy _stream_* modules, http.Server.writeHeader, --experimental-transform-types, module.register runtime-deprecated). WHEN: "Node 26", "Node.js 26", "Temporal", "Temporal.PlainDate", "getOrInsert", "getOrInsertComputed", "Iterator.concat", "Undici 8". |
| license | MIT |
| metadata | {"version":"1.0.0"} |
Node.js 26 (Current) Version Expert
Node 26 Current. Released May 2026. Will become LTS October 2026, EOL April 2029. This is the last release to follow the existing Current-then-LTS cadence (the schedule changes from Node 27 onward).
Key Features
| Feature | Status |
|---|
Temporal global date/time API | Enabled by default (no flag) |
| V8 14.6.202.33 (Chromium 146) | Included |
Map/WeakMap.prototype.getOrInsert() + getOrInsertComputed() | Added |
Iterator.concat() | Added |
Undici 8 (fetch) | Updated |
| npm 11.x bundled | Updated |
http.Server.prototype.writeHeader() | Removed (use writeHead()) |
Legacy _stream_* internal modules | Removed |
--experimental-transform-types flag | Removed |
module.register() | Runtime-deprecated |
NODE_MODULE_VERSION | Bumped to 147 (native addons must rebuild) |
Temporal -- Modern Date/Time (No Flag)
Temporal is now a global, enabled by default. It replaces error-prone Date arithmetic with immutable objects, explicit time zones, and predictable math -- ideal for scripts that parse timestamps, compute durations, or schedule work.
const date = Temporal.PlainDate.from('2026-05-05');
console.log(date.toString());
console.log(date.add({ days: 30 }).toString());
console.log(date.dayOfWeek);
const dt = Temporal.PlainDateTime.from('2026-05-05T14:30:00');
console.log(dt.add({ hours: 2, minutes: 15 }).toString());
const zoned = Temporal.ZonedDateTime.from('2026-05-05T09:00[America/New_York]');
const inTokyo = zoned.withTimeZone('Asia/Tokyo');
console.log(inTokyo.toString());
const now = Temporal.Now.instant();
const today = Temporal.Now.plainDateISO();
const zonedNow = Temporal.Now.zonedDateTimeISO('UTC');
const start = Temporal.Now.instant();
const elapsed = Temporal.Now.instant().since(start);
console.log(elapsed.total('seconds'));
const a = Temporal.Instant.from('2026-05-05T10:00:00Z');
const b = Temporal.Instant.from('2026-05-05T10:05:30Z');
console.log(a.until(b).total('minutes'));
console.log(Temporal.Instant.compare(a, b));
const legacy = new Date();
const instant = legacy.toTemporalInstant();
const backToDate = new Date(instant.epochMilliseconds);
Script: report file ages with Temporal
import fs from 'node:fs/promises';
const now = Temporal.Now.instant();
const entries = await fs.readdir('.', { withFileTypes: true });
for (const entry of entries.filter(e => e.isFile())) {
const stat = await fs.stat(entry.name);
const mtime = stat.mtime.toTemporalInstant();
const ageDays = now.since(mtime).total({ unit: 'days' });
console.log(`${entry.name}: ${ageDays.toFixed(1)}d old`);
}
V8 14.6 -- Map/WeakMap Upsert
getOrInsert() and getOrInsertComputed() collapse the read-then-set pattern into one call -- common when grouping, counting, or memoizing in scripts.
const counts = new Map();
for (const word of text.split(/\s+/)) {
counts.set(word, counts.get(word) ?? 0);
}
const tally = new Map();
for (const word of text.split(/\s+/)) {
const n = tally.getOrInsert(word, 0);
tally.set(word, n + 1);
}
const cache = new Map();
function expensiveLookup(id) {
return cache.getOrInsertComputed(id, () => fetchAndParse(id));
}
const byDept = new Map();
for (const row of rows) {
byDept.getOrInsertComputed(row.dept, () => []).push(row);
}
const memo = new WeakMap();
const result = memo.getOrInsertComputed(obj, () => compute(obj));
V8 14.6 -- Iterator.concat()
Chain multiple iterators/iterables lazily without materializing arrays -- memory-efficient for large or streamed sequences.
function* gen() { yield 5; yield 6; }
for (const item of Iterator.concat([1, 2], new Set([3, 4]), gen())) {
console.log(item);
}
const a = new Map([['x', 1]]);
const b = new Map([['y', 2]]);
for (const key of Iterator.concat(a.keys(), b.keys())) {
console.log(key);
}
Undici 8 -- Built-in fetch
The global fetch/Request/Response stack moves to Undici 8: tighter WHATWG Fetch alignment, improved request-lifecycle handling, and better streaming/connection management. Existing fetch code keeps working -- no API change required for typical scripting use.
import { createWriteStream } from 'node:fs';
import { Writable } from 'node:stream';
const res = await fetch('https://example.com/large.bin');
if (!res.ok) throw new Error(`HTTP ${res.status}`);
await res.body.pipeTo(Writable.toWeb(createWriteStream('large.bin')));
npm 11
Node 26 bundles npm 11.x (e.g. 11.13.0). Same major as Node 24 -- faster installs, stricter peer-dependency enforcement, improved lockfile resolution and workspace support. No new migration step versus Node 24 on the npm front.
Removals & Deprecations (semver-major)
These are the breaking changes most likely to bite scripts and tooling:
http.Server.prototype.writeHeader() removed -- use writeHead().
- Legacy internal stream modules removed --
_stream_readable, _stream_writable, _stream_duplex, _stream_transform, _stream_passthrough, _stream_wrap. Always import from node:stream (these were never public API).
--experimental-transform-types removed -- use the stable type-stripping support or a build step.
module.register() runtime-deprecated -- emits a runtime warning; plan to migrate custom loader registration.
- Crypto/stream deprecations promoted to runtime (DEP0201, DEP0203, DEP0204).
localStorage without a backing file now returns undefined instead of throwing.
Platform/build requirements (for native addons & CI)
NODE_MODULE_VERSION bumped to 147 -- native modules (better-sqlite3, bcrypt, etc.) must be rebuilt/reinstalled for Node 26.
- GCC requirement raised to 13.2; Python 3.9 dropped from the build toolchain; Windows SDK updated to 11.
Migration Notes
When migrating from Node 24 to Node 26:
Temporal is available globally -- replace fragile Date arithmetic and ad-hoc timezone math; remove polyfills like @js-temporal/polyfill.
- Use
Map/WeakMap.getOrInsert() / getOrInsertComputed() to simplify counting, grouping, and lazy-memoization helpers.
- Use
Iterator.concat() to chain iterators instead of spreading into intermediate arrays.
- Audit for removed APIs: replace
writeHeader() with writeHead(), and any require('_stream_*') with node:stream imports.
- Drop the
--experimental-transform-types flag from scripts/CI.
- Rebuild native dependencies (
NODE_MODULE_VERSION 147) -- delete node_modules and reinstall, or rerun npm rebuild, after upgrading.
- Note the release-cadence change: Node 26 is the last version on the current Current→LTS schedule (Node 27+ differs) -- confirm your LTS upgrade plan accordingly.