嵌套TypeScript项目exclude配置失效,上层node_modules被编译如何解决
原配置不生效的原因
TypeScript的exclude规则仅对include匹配到的文件生效,对于代码中主动导入的文件、以及类型查找过程中自动扫描到的类型文件,exclude不会生效。默认情况下TypeScript会从当前目录向上递归查找node_modules下的类型包,所以会读到上层App1的node_modules内容。
解决方案
- 调整
exclude配置,匹配所有上层目录的node_modules。相对路径匹配规则是相对于当前tsconfig.json存放目录,修改如下:
"exclude": ["node_modules", "../**/node_modules/**/*", "server", "electron", "src/sw.js"]
../**/node_modules/**/*会匹配所有上层目录中任意位置的node_modules文件夹下的所有内容,比硬写../../node_modules/兼容性更强。
- 新增
rootDir配置,限制TypeScript扫描源文件的根目录,避免向上扫描超出当前项目范围:
// 根据你实际的源码存放目录调整,这里匹配你include的路径 "rootDir": "./blah-webapp/src"
- 新增
typeRoots配置,指定TypeScript只从当前项目的node_modules查找类型声明文件,避免向上递归查找上层node_modules的类型包:
"typeRoots": ["./node_modules/@types"]
- 新增
skipLibCheck配置,跳过所有第三方依赖的类型声明文件检查,哪怕意外读取到上层node_modules的内容也不会触发编译校验:
"skipLibCheck": true
- 检查项目代码是否存在从上层目录导入的语句(比如
import xxx from '../../xxx'),如果有这类导入,TypeScript会跟随导入路径扫描上层目录的文件,不受exclude限制。如果确实需要引用上层App1的内容,建议使用TypeScript项目引用功能:- 给App1的tsconfig.json添加
"composite": true配置 - 在App2的tsconfig.json中添加references配置指向App1:
"references": [{ "path": "../tsconfig.json" }] - 给App1的tsconfig.json添加
完整配置参考
{ "include": ["blah-webapp/src/**/*.*"], "exclude": ["node_modules", "../**/node_modules/**/*", "server", "electron", "src/sw.js"], "rootDir": "./blah-webapp/src", "typeRoots": ["./node_modules/@types"], "skipLibCheck": true // 其余原有配置保留即可 }
内容的提问来源于stack exchange,提问作者Twiggeh
相关产品推荐
相关产品推荐

