Node Express项目moduleResolution设为node,编译正常运行却找不到'myTypes'模块?
问题原因及解决办法
嗨,这个问题我之前也碰到过,核心原因其实是TypeScript的paths配置只在编译阶段生效,Node.js运行时完全不识别这个路径映射规则。
具体为啥会这样?
- 你在
tsconfig.json里写的"paths": { "*": [ "node_modules/*", "src/types/*" ] },是给TypeScript编译器看的——它知道要去src/types目录找myTypes,所以tsc能正常编译没报错。 - 但等你运行编译好的
app.js时,Node.js是按自己的模块规则找文件的:它只会去node_modules里找,或者认相对/绝对路径,完全不知道你在tsconfig里定义的映射规则,自然就找不到myTypes.js了。
给你几个实用的解决思路:
1. 改用相对路径(最简单直接的方案)
直接把app.ts里的导入改成相对路径就行:
import { HttpError } from "./types/myTypes";
这样编译后的app.js里的导入路径也会是相对路径,Node.js就能精准找到对应的文件了。
2. 用tsconfig-paths让Node.js认tsconfig的路径
这个工具能让Node.js在运行时读取tsconfig.json的paths配置,按照你定义的规则解析模块:
- 先装依赖:
npm install tsconfig-paths --save-dev
- 如果是用
ts-node直接运行TS文件,启动命令改成这样:
ts-node -r tsconfig-paths/register src/app.ts
如果是运行编译后的JS文件,就用:
node -r tsconfig-paths/register outDir/app.js
注意哦,这个方案需要你在tsconfig.json里把baseUrl配置对,一般设成./或者./src就没问题。
3. 用package.json的exports字段(适合把类型模块当内部包用)
如果你的src/types是一组独立的模块,可以在项目根目录的package.json里加个exports字段,指定myTypes的入口:
{ "exports": { "myTypes": "./src/types/myTypes.ts" } }
这样不管是TypeScript编译还是Node.js运行,都能正确解析import { HttpError } from "myTypes"了,不过这个要求Node.js版本在12.7.0以上才行。
内容的提问来源于stack exchange,提问作者u936293
相关产品推荐
相关产品推荐

