如何在TypeScript中省略相对路径实现模块导入?
无需相对路径导入模块的解决方案
你遇到的问题核心是:TypeScript编译阶段的路径映射规则,Node.js运行时并不识别。虽然你在tsconfig.json里配置了baseUrl和paths,让TS能正确解析import { Work } from 'work',但编译后的CommonJS代码会保留require('work')语句,而Node.js默认只会去node_modules目录查找模块,自然找不到本地的src/work.ts。
下面是几种可行的解决办法:
1. 开发阶段用ts-node + tsconfig-paths快速运行
如果你的项目直接用ts-node执行TS代码,可以借助tsconfig-paths让Node.js识别TS的路径映射:
- 安装依赖:
npm install -D tsconfig-paths
- 修改package.json的启动脚本:
"scripts": { "start": "ts-node -r tsconfig-paths/register src/你的入口文件.ts" }
启动后Node.js就会按照tsconfig的paths规则解析模块路径。
2. 编译后运行用module-alias做路径映射
如果是编译成JS后再运行,需要用module-alias处理运行时的路径映射:
- 安装依赖:
npm install module-alias
- 在项目入口文件的最顶部添加注册代码:
import 'module-alias/register'
- 在package.json里添加和tsconfig paths对应的别名映射(注意指向编译后的输出目录):
"_moduleAliases": { "*": "./dist/src" }
3. 用package.exports字段(生产环境推荐)
如果你的Node.js版本在v12.20+,可以通过package.json的exports字段定义模块入口,无需额外依赖:
- 在项目根目录的package.json里添加:
"exports": { "./work": "./src/work.ts" }
如果要批量映射src下的所有模块,可用通配符:
"exports": { "./*": "./src/*.ts" }
这样import { Work } from 'work'会直接解析到src/work.ts,编译后的JS也能对应到dist目录的文件(需确保tsconfig的outDir配置正确)。
额外注意
- 若
work.ts在src的子目录(比如src/utils/work.ts),可调整tsconfig的paths为"@/*": ["./src/*"],然后用import { Work } from '@/utils/work'导入。 - 若用webpack等打包工具,需单独配置
resolve.alias对应tsconfig的paths,由打包工具处理路径映射。
内容的提问来源于stack exchange,提问作者Kroztty
相关产品推荐
相关产品推荐

