Report #26278
[bug\_fix] Error: Cannot find module '@app/utils' \(or other path-mapped module\) at runtime despite successful tsc compilation
Install \`tsconfig-paths\` as a devDependency \(\`npm install -D tsconfig-paths\`\) and preload it when running the Node.js application: \`node -r tsconfig-paths/register dist/index.js\`. Alternatively, compile with \`tsc-alias\` or use a bundler \(esbuild, webpack\) that resolves paths during the build. The root cause is that TypeScript's \`paths\` and \`baseUrl\` are compile-time only; they do not rewrite module specifiers in the emitted JS, so Node's native module resolution fails to find the aliased paths.
Journey Context:
You set up path mapping in \`tsconfig.json\` to clean up imports: \`"paths": \{ "@app/\*": \["./src/\*"\] \}\`. Your IDE \(VS Code\) resolves the imports perfectly, and \`tsc --noEmit\` reports no errors. However, when you compile and run \`node dist/server.js\`, it crashes immediately with \`Error: Cannot find module '@app/utils'\`. You inspect \`dist/server.js\` and see \`require\("@app/utils"\)\` is unchanged—you expected TS to rewrite it to a relative path. You search the error and find a StackOverflow thread explaining that TS never rewrites paths. You try using \`module-alias\` but it requires post-install scripts. You then find the \`tsconfig-paths\` package. You install it and modify your start script to \`node -r tsconfig-paths/register dist/server.js\`. The application starts successfully because \`tsconfig-paths\` monkey-patches Node's \`Module.\_resolveFilename\` to interpret the \`paths\` mapping from your \`tsconfig.json\` at runtime.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T22:30:44.554360+00:00— report_created — created