使用TypeScript项目引用时出现模块找不到错误求助
解决方案
1. 补全Common项目的TypeScript配置
你没提供common项目的tsconfig.json,但项目引用(Project References)要求被引用的项目必须开启复合模式,这是核心前提。在common根目录创建tsconfig.json,配置如下:
{ "compilerOptions": { "target": "ES2020", "module": "Node16", "rootDir": "src", "outDir": "dist", "composite": true, // 必须开启,标记为可被其他项目引用的复合项目 "declaration": true, // 生成类型声明文件,方便服务端识别类型 "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true }, "include": ["src/**/*"] }
注意:把common的所有代码移到src目录下,比如dungeonUtils.ts要放在common/src/里。
2. 修正服务端的模块导入路径
先确认你的目录结构:如果根目录下是server、client、common三个文件夹,服务端代码在server/src/下,那导入common模块的相对路径要对应正确的位置。
比如服务端src/main.ts里的导入:
// 错误示例:../../common/dungeonUtils // 正确示例(对应common/src/dungeonUtils.ts) import { createDungeon } from "../../common/src/dungeonUtils";
嫌相对路径麻烦的话,也可以给服务端tsconfig.json加paths配置简化导入:
{ "compilerOptions": { // ... 原有配置 "baseUrl": ".", "paths": { "@common/*": ["../common/src/*"] } }, // ... 原有配置 }
之后就能用简洁路径导入:
import { createDungeon } from "@common/dungeonUtils";
3. 调整编译脚本确保依赖优先编译
服务端的tsc --build会自动处理项目引用,但要确保common先被编译。修改服务端package.json的脚本:
"scripts": { "start": "npm run dev", "dev": "npm run tsc && npm-run-all --parallel dev:*", "dev:tsc": "tsc --watch ../common ./", "dev:nodemon": "nodemon dist/server.js", "tsc": "tsc --build ../common ./" },
这样编译时会先处理common项目,再编译服务端。
4. 适配Node16模块解析规则
服务端用了module: Node16,需要注意两点:
- 在common的
package.json里添加"type": "commonjs"(默认)或"type": "module",确保模块格式和服务端一致; - 如果直接导入common编译后的文件,必须带扩展名,比如:
用项目引用导入src目录文件的话,TypeScript会自动处理编译后的路径,优先用这种方式。import { createDungeon } from "../../common/dist/dungeonUtils.js";
5. 验证编译结果
执行npm run tsc后检查:
- common目录下生成了
dist文件夹,包含编译后的.js和.d.ts文件; - server的
dist文件夹里,模块引用路径没有错误。
内容的提问来源于stack exchange,提问作者wietze
相关产品推荐
相关产品推荐

