问题描述
我当前的代码是:
@Directive({
selector: 'some-selector',})
export class SomeSelectorDirective {
constructor() {
if (isDevMode() && someCondition) {
console.warn('Some warning.');
}
// some omitted code
}
}
问题在于,当我运行ng build --prod
时,这种情况并没有被树震动,但是如果我将isDevMode()
替换为!environment.production
,则会删除代码。我想知道一个原因:为什么isDevMode
包装的代码没有被丢弃在构建产品上?
请注意,我正在使用Angular 10.x.y。
解决方法
这是因为优化器(Terser.js)并未应用该函数来检查其运行时值。
使用内联版本时,webpack的DefinePlugin
会将内联替换为其自身的值,因此在优化之前,它看起来像:
@Directive({
selector: 'some-selector',})
export class SomeSelectorDirective {
constructor() {
if (false && someCondition) {
// ---^ inlined the false value
console.warn('Some warning.');
}
// some omitted code
}
}
使用此代码,优化器可以肯定地删除if,因为它是一个“死”分支。