Angular 角度变化检测策略和禁用zone.js

Angular 角度变化检测策略和禁用zone.js,angular,zonejs,Angular,Zonejs,我目前正在使用Ivy(v10.1.2)开发非常轻量级的角度元素 当我在我的polyfills.ts中不导入zone.js并在我的main.ts中“禁用”它时,如下所示: platformBrowserDynamic() .bootstrapModule(AppModule, { ngZone: 'noop' }) .catch(err => console.error(err)); 那么,我在组件上设置了什么样的ChangeDetectionStrategy是否仍然相关 因此,如

我目前正在使用Ivy(v10.1.2)开发非常轻量级的角度元素

当我在我的
polyfills.ts
中不导入
zone.js
并在我的
main.ts中“禁用”它时,如下所示:

platformBrowserDynamic()
  .bootstrapModule(AppModule, { ngZone: 'noop' })
  .catch(err => console.error(err));
那么,我在组件上设置了什么样的ChangeDetectionStrategy是否仍然相关


因此,如果我通过将组件标记为dirty(
ɵmarkDirty为markDirty
)并使用默认的ChangeDetectionStrategy手动触发它,Noop ChangeDetector会遍历整个树吗?如果我将其设置为changeDetection:ChangeDetectionStrategy.OnPush,它会检查手头的组件吗?

我实际上在a中问了相同的问题,并得到了以下回答(简短版本):

当我们禁用Zone.js时,我们仍然有变更检测器,但没有人 将为我们运行更改检测。我们必须将部件标记为 弄脏我们自己

这实际上回答了我的问题,因为我认为我们没有变更检测器,因为我们将成为变更检测器(因为我们自己将组件标记为脏的)

它继续说:

至于ChangeDetectionStrategy,它有点有用,因为 我在模板中使用的对象是不可变的。让我 解释为什么这很重要。当变更检测运行时,它将进行检查 如果我在模板中使用的任何对象已更改或未更改。如果我是 使用默认的变化检测策略,它将检查任何对象 通过深度相等性检查,它将进入组件树 并进行相同的平等性检查。就我而言,OnPush 将执行引用相等性检查,这就足够了,因为 我正在使用的对象中有许多是不可变的,除此之外,我只 有一个没有任何子组件的组件

总之,我禁用了Zone.js以减小捆绑包大小,因为我 在需要时手动触发更改检测,并且 启用OnPush,因为我的所有对象都是不可变的,而我是 通过减少 支票数量

所以我的外卖和结论是

禁用zone.js(我们仍然有一个ChangeDetector)时,通过使用默认策略(而不是OnPush)并手动触发更改检测(使用markDirty),ChangeDetector将检查整个树(假设每个组件都有默认的更改检测策略)。 但使用OnPush时,ChangeDetector只会检查手头的组件