Node.js 25 is here! We have upgraded V8 to 14.1, bringing major JSON.stringify
performance improvements, built-in Uint8Array
base64/hex conversion, and ongoing
WebAssembly and JIT pipeline optimizations.
This release doubles down on secure-by-default apps and web-standard APIs: the permission
model gains --allow-net
, Web Storage is enabled by default, and ErrorEvent
is now a global.
We’ve also removed or finalized long-deprecated APIs such as SlowBuffer,
and added quality-of-life improvements like a portable compile cache and JSPI for WebAssembly.
Notable Changes
- [
8bc7dfd16f
] - build: test on Python 3.14 release candidate 3 (Christian Clauss) #59983 - [
663554abdf
] - (SEMVER-MAJOR) lib: expose global ErrorEvent (Richie Bendall) #58920 - [
3312e4e946
] - (SEMVER-MAJOR) src: unflag --experimental-webstorage by default (Daniel M Brasil) #57666 - [
462c74181d
] - (SEMVER-MAJOR) src,permission: add --allow-net permission (Rafael Gonzaga) #58517
Deprecations and Removals
- [
d33f4b539a
] - (SEMVER-MAJOR) assert: move assert.fail with multiple arguments to eol (James M Snell) #58532 - [
b21574d63b
] - (SEMVER-MAJOR) assert: move CallTracker to EOL (James M Snell) #58006 - [
308b6bc6de
] - (SEMVER-MAJOR) async_hooks: moveasyncResource
property on bound function to EOL (James M Snell) #58618 - [
daced4ab98
] - (SEMVER-MAJOR) buffer: move SlowBuffer to EOL (Filip Skokan) #58220 - [
df16f0fd8d
] - (SEMVER-MAJOR) child_process: move _channel to end-of-life (James M Snell) #58527 - [
a472745958
] - (SEMVER-MAJOR) crypto: runtime-deprecate default shake128/256 output lengths (Filip Skokan) #59008 - [
c3b986853c
] - (SEMVER-MAJOR) crypto: move deprecated hash and mgf1Hash options to EOL (James M Snell) #58706 - [
66632648ba
] - (SEMVER-MAJOR) crypto: runtime deprecate ECDH.setPublicKey() (James M Snell) #58620 - [
a5f9ca1f77
] - (SEMVER-MAJOR) dns: move falsy hostname in lookup to end-of-life (James M Snell) #58619 - [
2bb7667475
] - (SEMVER-MAJOR) fs: move FileHandle close on GC to EOL (James M Snell) #58536 - [
eec0302088
] - (SEMVER-MAJOR) fs: move rmdir recursive option to end-of-life (James M Snell) #58616 - [
25dd206c29
] - (SEMVER-MAJOR) fs: removefs.F_OK
,fs.R_OK
,fs.W_OK
,fs.X_OK
(Livia Medeiros) #55862 - [
91dadf2897
] - (SEMVER-MAJOR) http: deprecate writeHeader (Sebastian Beltran) #59060 - [
4e06a648ff
] - (SEMVER-MAJOR) perf_hooks: move deprecated accessors to EOF (James M Snell) #58531 - [
a3dfca90d1
] - (SEMVER-MAJOR) process: move multipleResolves event to EOL (James M Snell) #58707 - [
790acc8689
] - (SEMVER-MAJOR) tls: move IP-address servername deprecation to eol (James M Snell) #58533 - [
3aaa2ebe19
] - (SEMVER-MAJOR) url: move bad port deprecation in legacy url to end-of-life (James M Snell) #58617
Semver-Major Commits
- [
7c9fbc15bc
] - (SEMVER-MAJOR) assert,util: fail promise comparison in deep equal checks (Ruben Bridgewater) #59448 - [
11222f1a27
] - (SEMVER-MAJOR) assert,util: handle invalid dates as equal in deep comparison (Ruben Bridgewater) #57627 - [
acce2e8f87
] - (SEMVER-MAJOR) build: reset embedder string to "-node.0" (Michaël Zasso) #59805 - [
8a87ba031b
] - (SEMVER-MAJOR) build: bump minimum Clang version to 19 (Michaël Zasso) #59048 - [
21b131e93a
] - (SEMVER-MAJOR) build: reset embedder string to "-node.0" (Michaël Zasso) #58064 - [
f31c88021b
] - (SEMVER-MAJOR) build: stop distributing Corepack (Antoine du Hamel) #57617 - [
b3238442d8
] - (SEMVER-MAJOR) deps: patch V8 for illumos (Dan McDonald) #59805 - [
2a1da3260d
] - (SEMVER-MAJOR) deps: patch V8 to avoid duplicated zlib symbol (Michaël Zasso) #54077 - [
7772a2df9d
] - (SEMVER-MAJOR) deps: update V8 to 14.1.146.11 (Michaël Zasso) #59805 - [
6d61175db0
] - (SEMVER-MAJOR) deps: V8: backport 1d3362c55396 (Shu-yu Guo) #58064 - [
974773572e
] - (SEMVER-MAJOR) deps: V8: cherry-pick 4f38995c8295 (Shu-yu Guo) #58064 - [
70bfc398e9
] - (SEMVER-MAJOR) deps: V8: cherry-pick 044b9b6f589d (Rezvan Mahdavi Hezaveh) #58064 - [
6bfc525cf0
] - (SEMVER-MAJOR) deps: V8: cherry-pick d2ad518a0b57 (Joyee Cheung) #58064 - [
754d28e34f
] - (SEMVER-MAJOR) deps: V8: revert 6d6c1e680c7b (Michaël Zasso) #58064 - [
8c508b9399
] - (SEMVER-MAJOR) deps: V8: revert e3cddbedb205 (Michaël Zasso) #58064 - [
88ca8287b6
] - (SEMVER-MAJOR) deps: use std::map in MSVC STL for EphemeronRememberedSet (Joyee Cheung) #58064 - [
838e2332a5
] - (SEMVER-MAJOR) deps: patch V8 for illumos (Dan McDonald) #58064 - [
3522731d9a
] - (SEMVER-MAJOR) deps: remove problematic comment from v8-internal (Michaël Zasso) #58064 - [
d234475a33
] - (SEMVER-MAJOR) deps: define V8_PRESERVE_MOST as no-op on Windows (Stefan Stojanovic) #58064 - [
a738eb4a7f
] - (SEMVER-MAJOR) deps: fix FP16 bitcasts.h (Stefan Stojanovic) #58064 - [
1744c7d991
] - (SEMVER-MAJOR) deps: patch V8 to avoid duplicated zlib symbol (Michaël Zasso) #58064 - [
fff0d1554d
] - (SEMVER-MAJOR) deps: update V8 to 13.7.152.9 (Michaël Zasso) #58064 - [
968e2f47c8
] - (SEMVER-MAJOR) dgram: move deprecated APIs to EOL (James M Snell) #58474 - [
5623194a6b
] - (SEMVER-MAJOR) doc,src,test: replace use of deprecatedGetIsolate
(Michaël Zasso) #59805 - [
823ca6991f
] - (SEMVER-MAJOR) fs: makeprocessReadResult()
andreadSyncRecursive()
private (Livia Medeiros) #58672 - [
a273674dee
] - (SEMVER-MAJOR) fs: move fs stream open method to eol (James M Snell) #58529 - [
39d73036e7
] - (SEMVER-MAJOR) lib: use validators for argument validation (Nam Yooseong) #59416 - [
cd68e35704
] - (SEMVER-MAJOR) lib: deprecate_stream_*
modules (Dario Piotrowicz) #58337 - [
a822a1cbe7
] - (SEMVER-MAJOR) lib: deprecate _tls_common and _tls_wrap (Dario Piotrowicz) #57643 - [
705bcc2a00
] - (SEMVER-MAJOR) module: move Module._debug to end-of-life (James M Snell) #58473 - [
5fe7800683
] - (SEMVER-MAJOR) node-api: add warning for NAPI_EXPERIMENTAL (Miguel Marcondes Filho) #58280 - [
e1d4d6ab49
] - (SEMVER-MAJOR) repl: eol deprecate instantiating without new (Aviv Keller) #59495 - [
ed94bc48f3
] - (SEMVER-MAJOR) src: update crypto.getCipherInfo() to use DictionaryTemplate (James M Snell) #60036 - [
37a3df3556
] - (SEMVER-MAJOR) src: fix calls to v8::Object::wrap (Andreas Haas) #59805 - [
801ae26fa3
] - (SEMVER-MAJOR) src: update NODE_MODULE_VERSION to 141 (Michaël Zasso) #59805 - [
10df38a38b
] - (SEMVER-MAJOR) src: improve performance of dotenv ToObject (James M Snell) #60038 - [
075936b413
] - (SEMVER-MAJOR) src: use std::string_view from node_report (iknoom) #60006 - [
234c26cca3
] - (SEMVER-MAJOR) src: storeLocal
forCallbackScope
on stack (Anna Henningsen) #59705 - [
708fd1945b
] - (SEMVER-MAJOR) src: remove node.h APIs to make callback without an async context (Chengzhong Wu) #58471 - [
56989d33f5
] - (SEMVER-MAJOR) src: remove deprecated node::EmitBeforeExit and node::EmitExit (Chengzhong Wu) #58469 - [
d429aa2d17
] - (SEMVER-MAJOR) src: remove deprecated node::CreatePlatform and node::FreePlatform (Chengzhong Wu) #58470 - [
e0ae14ce73
] - (SEMVER-MAJOR) src: remove deprecated node::InitializeNodeWithArgs (Chengzhong Wu) #58470 - [
db1700e4b5
] - (SEMVER-MAJOR) src: update NODE_MODULE_VERSION to 138 (Michaël Zasso) #58064 - [
0a87084150
] - (SEMVER-MAJOR) test: update cppgc-object addon config (StefanStojanovic) #59805 - [
7dd49d7da4
] - (SEMVER-MAJOR) test: spin longer for sequential/test-worker-prof (Michaël Zasso) #59805 - [
faba50df96
] - (SEMVER-MAJOR) test: remove--always-turbofan
flag (Michaël Zasso) #59805 - [
496f12dec6
] - (SEMVER-MAJOR) test: update snapshot for V8 14.1 (Michaël Zasso) #59805 - [
05aa3a1c70
] - (SEMVER-MAJOR) test,win: split addon tests (StefanStojanovic) #59805 - [
308de27255
] - (SEMVER-MAJOR) tools: update V8 gypfiles for 14.0 (Michaël Zasso) #59805 - [
b736370c07
] - (SEMVER-MAJOR) tools: update V8 gypfiles for 13.9 (Michaël Zasso) #59805 - [
085a94ac9b
] - (SEMVER-MAJOR) tools: update V8 gypfiles for 13.8 (Michaël Zasso) #59805 - [
a71ae18ac8
] - (SEMVER-MAJOR) tools: enable leaptiering for aix/ibmi (Abdirahim Musse) #59805 - [
a8217a9eb8
] - (SEMVER-MAJOR) tools: update V8 gypfiles for 13.7 (Michaël Zasso) #58064 - [
fdef0725de
] - (SEMVER-MAJOR) util,console: colorize regexp groups, character classes, etc (Ruben Bridgewater) #59710 - [
411cc42d22
] - (SEMVER-MAJOR) worker: move terminate callback to end-of-life (James M Snell) #58528
Semver-Minor Commits
- [
94422e8a40
] - (SEMVER-MINOR) src: add an option to make compile cache portable (Aditi) #58797 - [
29738c7b42
] - (SEMVER-MINOR) src,permission: add --allow-inspector ability (Rafael Gonzaga) #59711 - [
f9fcc746f3
] - (SEMVER-MINOR) v8: add cpu profile (theanarkh) #59807 - [
4396cf2d45
] - (SEMVER-MINOR) wasm: enable JSPI (Guy Bedford) #59941
Semver-Patch Commits
- [
91f035e597
] - assert: resolve TODO and rename function (Antoine du Hamel) #59451 - [
2e675c4fa3
] - benchmark: use non-deprecated WriteUtf8V2 method (Michaël Zasso) #60173 - [
0fb040603b
] - build: upgrade Python linter ruff, add rules ASYNC,PERF (Christian Clauss) #59984 - [
f468b6c72b
] - build: update minimum Xcode version to 16.4 (Michaël Zasso) #60079 - [
0eda17ba20
] - build: fix flags for ngtcp2 on IBM i (SRAVANI GUNDEPALLI) #60073 - [
22a864a275
] - build: remove corepack from release tarballs (Jordan Harband) #59835 - [
7079041e0a
] - build: only mention Apple when on Apple (Michaël Zasso) #59385 - [
954d3f44ef
] - build: check Apple clang version in configure script (Michaël Zasso) #59358 - [
2b4a09ef8b
] - build: fix OpenSSL version detection (Richard Lau) #59353 - [
af77e4bf2f
] - build: update macOS runner and Xcode (Michaël Zasso) #59238 - [
86bfdb5528
] - build: removenocorepack
vcbuild
flag (Antoine du Hamel) #57772 - [
b13f24c2da
] - build, src: fix include paths for vtune files (Rahul) #59999 - [
2216a3b1d5
] - deps: V8: cherry-pick 1e190bbb0396 (Richard Lau) #60206 - [
1b22f6049a
] - deps: upgrade npm to 11.6.2 (npm team) #60168 - [
a1b73fe430
] - deps: V8: cherry-pick 2abc61361dd4 (Richard Lau) #60177 - [
4eb6e6fd79
] - deps: V8: cherry-pick 87356585659b (Joyee Cheung) #60069 - [
c0b8c80164
] - deps: define V8_PRESERVE_MOST as no-op on Windows (Stefan Stojanovic) #56238 - [
65a32bac18
] - deps: add ngtcp2 test binaries (James M Snell) #59946 - [
ebfc28a037
] - deps: update nghttp3 to 1.11.0 (James M Snell) #59249 - [
dceb1fca40
] - deps: update ngtcp2 to 1.14.0 (James M Snell) #59249 - [
ee36b86ba3
] - deps: patch V8 to 13.7.152.19 (Node.js GitHub Bot) #58713 - [
0b3fc0d7a8
] - deps: patch V8 to 13.7.152.14 (Node.js GitHub Bot) #58631 - [
91b3bd3fe6
] - deps: patch V8 to 13.7.152.13 (Node.js GitHub Bot) #58539 - [
f77a96cd76
] - deps: patch V8 to 13.7.152.10 (Node.js GitHub Bot) #58446 - [
1cd16e5355
] - doc: improve code snippet alternative of url.parse() using WHATWG URL (Steven) #60209 - [
d54e6aec9e
] - doc:createSQLTagStore
->createTagStore
(Aviv Keller) #60182 - [
aef3fc37eb
] - doc: use markdown when branch-diff major release (Rafael Gonzaga) #60179 - [
a2f088d516
] - doc: update teams in collaborator-guide.md and add links (Bart Louwers) #60065 - [
75a6fff6be
] - doc: disambiguate top-levelworker_threads
module exports (René) #59890 - [
51df7b92bc
] - doc: update macOS version used to build releases (Michaël Zasso) #60080 - [
910c8796f9
] - doc: update BUILDING to reflect Clang 19 changes (Michaël Zasso) #59782 - [
34f9b7eab9
] - doc: reserve NMV 140 for Electron 39 (David Sanders) #59627 - [
3f6f6db43f
] - doc: update minimum Xcode and VS versions (Michaël Zasso) #59358 - [
d9fe28bd6b
] - doc: fixCHANGELOG.md
version listing (Antoine du Hamel) #59299 - [
0ab50c2768
] - doc: reserve NMV 139 for Electron 38 (Calvin) #58779 - [
516b4ebd3c
] - doc: mark Node.js 23 as End-of-Life (Antoine du Hamel) #58563 - [
59b70e5fe3
] - http: fix http client leaky with double response (theanarkh) #60062 - [
5cf3c3e24c
] - http2: rename variable to additionalPseudoHeaders (Tobias Nießen) #60208 - [
535efea962
] - http2: do not crash on mismatched ping buffer length (René) #60135 - [
4bfa387f6d
] - lib: fix constructor in _errnoException stack tree (SeokHun) #60156 - [
4daeec11b9
] - lib: fix typo in QuicSessionStats (SeokHun) #60155 - [
15278252bb
] - lib: remove redundant destroyHook checks (Gürgün Dayıoğlu) #60120 - [
83052ff9ad
] - lib: addnode:
prefix in sys module deprecation warning (Dario Piotrowicz) #58442 - [
d5abfbf582
] - lib: add module to use in module deprecation warnings (Dario Piotrowicz) #58442 - [
db0121bedd
] - module: fix directory option in the enableCompileCache() API (Joyee Cheung) #59931 - [
822a8c3244
] - perf_hooks: fix stack overflow error (Antoine du Hamel) #60084 - [
d52cd04591
] - quic: continue working on quic api bits (James M Snell) #60123 - [
b4af647920
] - quic: reduce boilerplate and other minor cleanups (James M Snell) #59342 - [
cd9fd09a27
] - quic: multiple fixups and updates (James M Snell) #59342 - [
a6c5d27739
] - quic: update more of the quic to the new compile guard (James M Snell) #59342 - [
ee7b8ab29c
] - quic: few additional small comment edits in cid.h (James M Snell) #59342 - [
c8b64bd023
] - quic: fixup NO_ERROR macro conflict on windows (James M Snell) #59381 - [
e2fefd78e2
] - quic: fixup windows coverage compile error (James M Snell) #59381 - [
99c80e3a45
] - quic: update the guard to check openssl version (James M Snell) #59249 - [
0e754fa5d1
] - quic: start re-enabling quic with openssl 3.5 (James M Snell) #59249 - [
200fe9e7f4
] - repl: move completion logic to internal module (Dario Piotrowicz) #59889 - [
3ac88a7a66
] - src: use string_view inWriteReport()
(Anna Henningsen) #60201 - [
a1244f04de
] - src: make additional cleanups in node locks impl (James M Snell) #60061 - [
fdb6e66227
] - src: update locks to use DictionaryTemplate (James M Snell) #60061 - [
367bcce6a6
] - src: fix usage of deprecated V8 API (Michaël Zasso) #60174 - [
23fa18444f
] - src: fix small compile warning in quic/streams.cc (James M Snell) #60118 - [
0ec1d186f4
] - src: always use strong reference tonapi_async_context
resource (Anna Henningsen) #59828 - [
ce748f6cae
] - src: useGlobal
for storing resource in Node-API callback scope (Anna Henningsen) #59828 - [
36256230b4
] - src: cleanup quic TransportParams class (James M Snell) #59884 - [
985e2fb383
] - Revert "test: ensure message event fires in worker message port test" (Luigi Pinca) #60126 - [
da9cd745c8
] - test: ensure assertions are reachable intest/client-proxy
(Antoine du Hamel) #60175 - [
e105e821e9
] - test: skip quic tests that IBM i does not support (SRAVANI GUNDEPALLI) #60160 - [
bfc81ca228
] - test: ensure assertions are reachable intest/async-hooks
(Antoine du Hamel) #60150 - [
712cee951c
] - test: skip tests that cause timeouts on IBM i (SRAVANI GUNDEPALLI) #60148 - [
f8a43f6f34
] - test: deflake test-fs-promises-watch-iterator (Luigi Pinca) #60060 - [
1f95d39997
] - test: prepare junit file attribute normalization (sangwook) #59432 - [
eb159a8cfd
] - test: remove duplicated allocUnsafeSlow test (Michaël Zasso) #58524 - [
d93cff5af3
] - Revert "test: fix watch tests not including completion messages" (Joyee Cheung) #58190 - [
6102159fa1
] - test: fix watch tests not including completion messages (Dario Piotrowicz) #58183 - [
ad2c1bf62e
] - test,doc: skip --max-old-space-size-percentage on 32-bit platforms (Asaf Federman) #60144 - [
6dbf7086bb
] - test_runner: fix suite timeout (Moshe Atlow) #59853 - [
f0aa073907
] - test_runner: add junit file attribute support (sangwook) #59432 - [
cff138c6b1
] - tests: start adding quic test server utilities (James M Snell) #59946 - [
20dc4b514a
] - tools: use cooldown property correctly (Rafael Gonzaga) #60134 - [
ec26b1c01a
] - tools: add lint rule to ensure assertions are reached (Antoine du Hamel) #60125 - [
bab752d4db
] - typings: add buffer internalBinding typing (방진혁) #60163 - [
1986ee4b65
] - vm: hint module identifier in instantiate errors (Chengzhong Wu) #60199 - [
23b834058c
] - wasm: revert enable JSPI as already enabled (Guy Bedford) #60014 - [
4bfcad1ac5
] - Revert "watch: fix watch args not being properly filtered" (Joyee Cheung) #58190 - [
4acb854039
] - watch: fix watch args not being properly filtered (Dario Piotrowicz) #57936