TypeScript模块找不到但tsc --traceResolution解析成功的问题求助
问题描述
环境:MacOS BigSur、nodejs v16.13.2、typescript v4.6.3
tsconfig.json配置:
{ "extends": "../../tsconfig.json", "compilerOptions": { "lib": ["esnext"], "outDir": "./dist", "baseUrl": "./src" }, "include": ["src"] }
在router.ts中使用import TestController from 'controllers/test.controller'导入模块,执行pnpm dev时抛出错误:
Error: Cannot find module 'controllers/test.controller' Require stack: - /Users/cuiyuming/Public/coding/performant-template/packages/backend/src/router.ts
使用tsc --traceResolution验证,TypeScript编译时已成功解析模块:
'baseUrl' option is set to '/Users/cuiyuming/Public/coding/performant-template/packages/backend/src', using this value to resolve non-relative module name 'controllers/test.controller'. Resolving module name 'controllers/test.controller' relative to base url '/Users/cuiyuming/Public/coding/performant-template/packages/backend/src' - '/Users/cuiyuming/Public/coding/performant-template/packages/backend/src/controllers/test.controller'. Loading module as file / folder, candidate module location '/Users/cuiyuming/Public/coding/performant-template/packages/backend/src/controllers/test.controller', target file type 'TypeScript'. File '/Users/cuiyuming/Public/coding/performant-template/packages/backend/src/controllers/test.controller.ts' exist - use it as a name resolution result. ======== Module name 'controllers/test.controller' was successfully resolved to '/Users/cuiyuming/Public/coding/performant-template/packages/backend/src/controllers/test.controller.ts'. ========
解决方案
问题核心:TypeScript的baseUrl仅作用于编译阶段的模块解析,Node.js运行时本身不支持这种非相对路径的模块映射规则,因此会出现编译通过但运行报错的情况。
方案1:针对ts-node运行场景
如果你的pnpm dev是用ts-node直接运行TS代码,需要配置路径解析插件:
- 安装依赖:
pnpm add -D tsconfig-paths - 修改dev启动命令,添加路径注册:
ts-node -r tsconfig-paths/register src/router.ts - 或者在tsconfig.json中添加ts-node的配置,避免每次命令加参数:
{ "ts-node": { "require": ["tsconfig-paths/register"] } }
方案2:针对编译后运行JS的场景
如果是先编译TS到dist目录再运行,需要替换编译后JS文件中的路径:
- 安装依赖:
pnpm add -D tsc-alias - 修改build命令,在tsc编译后执行路径替换:
tsc && tsc-alias
这样编译后的JS文件中,controllers/test.controller会被替换成相对路径(比如./controllers/test.controller),Node.js就能正常识别。
额外检查
- 确认根目录tsconfig.json的配置没有覆盖子包的
baseUrl设置 - 确保
controllers/test.controller.ts文件确实存在于指定路径(根据trace日志已存在,可忽略)
内容的提问来源于stack exchange,提问作者Danmoits
相关产品推荐
相关产品推荐

