Node.js 23

23 released 16 October 2024, latest 23.11.1.

Node.js 23 reached end of life on 1 June 2025.

What changed

Node.js 23 continued the move toward more automatic ECMAScript module handling. It enabled syntax detection by default for ambiguous JavaScript input, so a file without an explicit module-type marker can be interpreted as an ES module when it contains ES module syntax. It also enabled require() of synchronous ES modules by default, subject to important limits: an ES module graph using top-level await cannot be loaded through require(). These changes reduce some CommonJS/ESM friction, but they can alter how older projects with ambiguous .js files load and execute. The line also updated Node’s bundled JavaScript engine and maintained the current platform, dependency, and tooling baseline for this release generation.

What staying costs

Node.js 23 has reached end of life. It no longer receives maintenance releases, including fixes for newly discovered security issues, runtime defects, and compatibility problems. Staying on it leaves production services dependent on an unsupported engine and package-manager/tooling combination, which can complicate security review, incident response, and vendor or customer compliance requirements. Because 23 was an odd-numbered, non-LTS line, most ecosystem testing and deployment guidance has moved to supported LTS lines. The module-loading defaults introduced in this line add a further migration risk: projects may accidentally come to depend on syntax detection or require() loading ES modules, while their target supported line or their build and test tools may behave differently.

What to do

Plan a direct move from Node.js 23 to a currently supported LTS line rather than treating 23 as a platform to retain or newly standardize. First, inventory every runtime location: developer machines, CI images, containers, serverless functions, build agents, and embedded command-line tools. Run the full test suite, builds, linters, and production-like smoke tests under the target Node version. Review package.json module settings, file extensions, and imports so that CommonJS and ES module intent is explicit; in particular, test ambiguous .js files and any code that uses require() to load ES modules. Update native addons and dependencies to versions that support the target runtime, regenerate lockfiles only when required, and verify npm, Corepack or alternative package-manager behavior in CI. Roll out through a canary or staged deployment, monitor startup failures, module-resolution errors, and native-module loading errors, then remove Node 23 from supported build and deployment images.

We can tell you what moving off Node.js 23 involves.

What it takes to move off Node.js 23 depends on what you built on it — the version you are on, how much depends on it, and how much of the work is mechanical. Leave your email with this version and we can tell you what that looks like for you.

Not sure yet? Get my plan