Angular生产构建时单元测试与e2e测试文件的处理规则
Angular默认production构建对测试文件的处理规则
当你使用angular.json中默认的production配置执行生产构建(不管是执行ng build --prod,还是npm脚本映射的npm run build -- --prod指令)时,所有单元测试文件、Protractor/Cypress编写的e2e测试文件默认全部会被排除,不会进入dist目录下的最终构建产物,不会额外增加包体积。
默认排除的核心逻辑有两层:
- 构建依赖链路天然隔离:Angular应用生产构建的入口是
src/main.ts,构建工具只会递归打包这个入口引用到的所有文件。单元测试的独立入口是src/test.ts,仅在执行ng test跑单测时才会被加载,所有.spec.ts格式的单测文件只会被测试运行器识别,不会出现在生产构建的依赖树中;而e2e测试文件默认存放在独立的e2e/或cypress/目录下,本身就和应用运行时代码完全隔离,不会被应用入口引用,自然不会被打包。 - TypeScript编译层过滤:Angular项目默认会给应用构建单独使用
tsconfig.app.json配置,这个配置里的exclude规则默认已经排除了所有.spec.ts文件、测试目录下的文件,TS编译阶段就不会处理这些测试文件,做了第二层拦截。
测试文件的包含/排除规则自定义方式
默认的排除规则完全支持自定义调整,常见的调整方式有两种:
- 调整TS编译范围:直接修改
tsconfig.app.json中的include、exclude字段,新增你需要排除的自定义测试文件规则,比如你自己写的.test.ts后缀的测试文件,加到exclude列表后就不会被编译进产物。 - 调整Angular构建配置:在
angular.json对应项目的production配置节点下,可以通过assets规则、构建排除选项调整非代码类文件的过滤逻辑,适配特殊的目录结构需求。
注意:如果你在业务代码(比如Component、Service)里手动import了测试文件,不管默认排除规则怎么配置,这些测试文件都会被打进最终产物——这种属于代码层面的错误引入,构建工具会默认认为这是应用运行需要的依赖,配置层面的过滤规则不会生效。
内容的提问来源于stack exchange,提问作者Kyle Vassella
相关产品推荐
相关产品推荐

