TypeScript跨项目引用node_modules构建报找不到模块及TS9005错误
问题根因
- 你配置的
@core/*路径指向的../../core/node_modules/*不在tsconfig的include范围内,TypeScript编译时只会处理src和__test__下的文件,根本不会把core下的第三方包输出到dist目录,构建完自然找不到对应模块。IDE和Lint能识别是因为它们直接读取tsconfig的paths配置做静态分析,和编译流程无关。 - 手动指定JS文件路径触发TS9005报错,是因为开启了
declaration: true后,TS会尝试给所有纳入编译范围的文件生成类型声明,第三方JS包没有符合要求的显式类型注解,就会触发声明生成阻塞错误。 link-module-alias只负责运行时的路径软链映射,既不会帮你编译外部文件,也不会处理编译阶段的类型问题,解决不了构建时的文件缺失问题。@app/*能正常工作是因为它指向的src/*本身就在include范围内,TS会正常编译输出到dist。
解决方案
1. 调整TS配置,跳过第三方库的类型编译
修改tsconfig.json,避免TS尝试编译core目录下的第三方文件:
{ "compilerOptions": { // 保留原有配置,新增以下项 "skipLibCheck": true, // 如果你的项目不需要对外提供TS类型包,直接关闭声明生成,彻底解决TS9005报错 "declaration": false }, // 如果必须保留declaration:true给自身业务代码生成类型,就把core目录加入exclude,不要让TS编译它 "exclude": ["node_modules", "**/*.spec.ts", "../../core/**/*"] }
第三方包的类型直接用包自身自带的.d.ts文件即可,不需要TS重新编译生成。
2. 构建时自动拷贝core依赖到dist目录
TS本身不负责第三方依赖的拷贝,直接在构建脚本里加拷贝逻辑,和你_moduleAliases里配置的@core路径对齐,不需要手动维护单个包的映射:
{ "scripts": { // 替换原有的build脚本,tsc编译完成后自动把core下的node_modules全量拷贝到dist对应路径 "build": "rm -rf dist/* && tsc --p ./tsconfig.json && mkdir -p dist/core/node_modules && cp -r ../../core/node_modules/* dist/core/node_modules/" } }
全量拷贝不需要你每次core加新包都改配置,维护成本为0。如果对构建产物体积有要求,可以自己写个简单的node脚本扫描代码里的@core/引用,按需拷贝对应包,内部项目用全量拷贝足够。
3. 校验moduleAlias配置
确认_moduleAliases里的@core路径和你拷贝后的目录一致即可,当前配置的"@core": "dist/core/node_modules"可以正常匹配@core/xxx的子路径引用,如果运行时仍有子路径找不到的问题,补充通配配置:
{ "_moduleAliases": { "@app": "dist/service/cms/src", "@consumer": "dist/event-broker/core-event-consumer/src/index.js", "@core": "dist/core/node_modules", "@core/*": "dist/core/node_modules/*" } }
验证
执行yarn build后检查dist目录结构:
- dist/core/node_modules下存在winston等所有@core引用的依赖
- 执行
yarn start无cannot find module报错 - 后续core目录新增依赖,直接重新执行build即可,不需要修改任何配置
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

