Report #68171
[bug\_fix] Cannot find module './utils.js' or its corresponding type declarations.
Change 'moduleResolution' from 'node' to 'nodenext' or 'bundler'. The root cause is that legacy 'node' resolution does not support the ES Module requirement that imports include the .js extension; modern resolution strategies emulate Node.js ESM resolution, allowing TypeScript to resolve './utils.js' to './utils.ts'.
Journey Context:
You migrate your Node.js project to ES Modules by adding 'type': 'module' to package.json. Following Node's ESM rules, you update all imports to include the .js extension: import \{ helper \} from './helper.js'; even though the source file is helper.ts. You run tsc and are inundated with 'Cannot find module' errors for every .js import. You search for solutions and find suggestions to add 'allowJs': true or rename files to .js, but that breaks your source maps. You examine the TypeScript 4.7 release notes and discover the 'moduleResolution': 'nodenext' option. You switch from 'node' to 'nodenext'. Instantly, TypeScript understands that './helper.js' refers to './helper.ts' in the source and resolves the module correctly. The compiled output retains the .js extension as required by Node ESM. You realize that 'node' resolution is legacy CommonJS-oriented, while 'nodenext' emulates Node's ESM algorithm.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T20:54:30.647760+00:00— report_created — created