求问:Angular6编译时检测AOT问题的工具及合规tslint规则?
解决Angular AOT编译提前排查问题的实用方案
我之前也踩过Angular AOT编译的坑,JIT好好的一到AOT就出各种runtime问题,太闹心了!给你分享几个能在编译阶段就揪出问题的方法:
一、开启严格模式的AOT编译
别只用ng build,一定要加上--aot --prod参数!生产模式下的AOT编译会启用最严格的检查规则,很多JIT模式下被忽略的问题(比如你提到的装饰器引用本地未导出符号),都会直接在编译阶段抛出错误,不会留到运行时才爆发。
如果不想直接用生产环境配置,也可以用
ng build --aot --strict,--strict参数会开启一系列严格的TypeScript和Angular编译选项,同样能提前排查大部分AOT兼容问题。
二、用上官方的AOT检查TSLint规则
你说没找到相关的TSLint包,其实Angular官方维护的codelyzer就包含了专门针对AOT兼容性的检查规则,步骤很简单:
- 先安装依赖:
npm install codelyzer tslint --save-dev
- 在项目根目录的
tslint.json中引入规则集,然后启用关键的AOT检查项:
{ "extends": ["codelyzer"], "rules": { // 其他基础规则... // 重点:检查装饰器中引用的符号是否已导出 "no-decorator-not-exported": true, // 其他AOT相关规则,按需开启 "no-forward-ref": false, // 如果代码中用了forwardRef可以关闭,否则开启会检查 "use-input-property-decorator": true, "use-output-property-decorator": true } }
配置好后,运行ng lint就能在编码阶段就发现不符合AOT规范的代码,比如你那种引用本地未导出符号的情况,会直接给出警告。
三、针对MatIconModule这类模块缺失的问题
JIT模式下Angular可能会动态加载依赖模块,但AOT是静态编译,必须显式导入所有用到的模块。除了严格编译,你可以:
- 检查所有用到
mat-icon的模块(包括懒加载模块),确保MatIconModule已经被加到imports数组里; - 用VS Code的Angular Language Service插件,它会在你写代码的时候实时提示模块未导入的问题,不用等到编译才发现。
四、额外的排查小技巧
- 查看详细编译日志:加上
--verbose参数运行编译命令,ng build --aot --prod --verbose,这样能看到所有编译过程中的警告和错误,有些细节可能被默认日志漏掉了; - 定期运行
ng build --aot做预检查:哪怕是开发阶段,也可以时不时跑一次AOT编译,提前发现问题,避免到上线前才踩坑。
内容的提问来源于stack exchange,提问作者Maksym
相关产品推荐
相关产品推荐

