What Is New in Node.js 23?
| Category | Change |
|---|---|
| New Features | require() of synchronous ES modules enabled by default |
| New Features | --experimental-require-module flag removed (now default behavior) |
| New Features | node:sqlite built-in module added (experimental) |
| Improvements | V8 upgraded to 13.0 (ships with Chrome 130) |
| Improvements | Test runner: --test-concurrency flag added |
| Improvements | Windows 32-bit support dropped |
| Improvements | Glob support added in node:fs glob/globSync |
| Security | Multiple dependency updates (OpenSSL, libuv, cares) |
| Deprecated | url.parse() marked as legacy |
require() for ES Modules -- What Changed?
Node.js 23 makes require() of synchronous ES modules work by default. Previously this needed --experimental-require-module. Now you can load ESM files from CommonJS without that flag, as long as the module graph does not use top-level await.
In practice this bridges the interop gap significantly. Many library authors can now ship a single ESM file and have CommonJS consumers load it directly. The .mjs extension and "type": "module" in package.json are still respected.
Built-in SQLite -- node:sqlite
Node.js 23 ships an experimental node:sqlite module backed by SQLite 3. You can open in-memory or file-based databases without any native addon install step.
import { DatabaseSync } from 'node:sqlite';
const db = new DatabaseSync(':memory:');
db.exec('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)');
const insert = db.prepare('INSERT INTO users (name) VALUES (?)');
insert.run('Alice');
const rows = db.prepare('SELECT * FROM users').all();
console.log(rows);
The API is synchronous by design, matching the typical scripting/tooling use case where blocking I/O is acceptable. Async support is tracked for a future release.
V8 13.0 and Performance Improvements
The V8 engine jumps to version 13.0 (Chrome 130 baseline). This brings additional JavaScript spec features and JIT improvements. Iterator helper methods from the TC39 proposal land natively.
The test runner gains --test-concurrency, letting you control how many test files run in parallel -- useful for CI pipelines where you want to cap resource consumption without going fully sequential.
Platform and Build Changes
Windows 32-bit (ia32) support is dropped in Node.js 23. If you still ship to Windows x86 environments, stay on Node.js 22 LTS. All prebuilt binaries and installers are now 64-bit only on Windows.
The node:fs module gains glob() and globSync(), making path pattern matching a built-in operation. Previously this required fast-glob or glob from npm.
FAQ
Can I use require() with .mjs files in Node.js 23?
Yes, as long as the module is synchronous (no top-level await). Node.js 23 enables this by default without any CLI flag.
Is node:sqlite production-ready?
Not yet -- it ships as experimental in v23. The API may still change before stabilization. Fine for tooling and local scripts, but watch for stability notices before using in production services.
Does dropping Windows 32-bit affect npm packages with native addons?
Only if those addons were targeting ia32 Windows. Most modern addons already went 64-bit only. Check your node_modules with node -p "process.arch" to confirm your runtime architecture.
What Iterator helpers are now available natively?
Methods like .map(), .filter(), .take(), .drop(), .reduce(), and .toArray() are available on iterator objects through V8 13.0's implementation of the TC39 Iterator Helpers proposal.
Should I upgrade production apps from Node.js 22 LTS to 23?
Node.js 23 is a current release, not an LTS. For production workloads, stick with Node.js 22 LTS. Use 23 for testing new features or tooling projects where you control the runtime version.