You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:05:45