【问题标题】:Angular Elements / Zone.js event listeners slow down homepageAngular Elements / Zone.js 事件监听器减慢主页速度
【发布时间】:2019-04-03 15:05:02
【问题描述】:

我们有一个 Angular 7 项目,它使用 Angular 元素生成自定义元素。此自定义元素用于 React 项目和 AngularJS 项目。 当自定义元素的代码在其中一个项目中加载时,网站速度会降低大约 30% - 即使自定义元素没有呈现到 DOM 中!

性能分析表明 zone.js 中的方法 invokeTask() 和 runTask() 被非常频繁地调用。

我尝试将https://github.com/angular/zone.js/blob/master/STANDARD-APIS.md 中描述的事件列入黑名单,但这没有效果。

packages.json 中的依赖有:

"dependencies": {
    "@angular/animations": "^7.2.7",
    "@angular/cdk": "^7.3.3",
    "@angular/common": "^7.2.7",
    "@angular/compiler": "^7.2.7",
    "@angular/core": "^7.2.7",
    "@angular/elements": "^7.2.7",
    "@angular/forms": "^7.2.7",
    "@angular/http": "^7.2.7",
    "@angular/material": "^7.3.3",
    "@angular/platform-browser": "^7.2.7",
    "@angular/platform-browser-dynamic": "^7.2.7",
    "@angular/router": "^7.2.7",
    "@angular/upgrade": "^7.2.7",
    "compass-mixins": "^0.12.10",
    "core-js": "^2.5.4",
    "dateformat": "^3.0.2",
    "devextreme": "^18.2.6",
    "devextreme-angular": "^18.2.6",
    "devextreme-intl": "^18.2.6",
    "in-view": "^0.6.1",
    "jquery": "^3.0.0",
    "keycode": "^2.1.9",
    "lodash": "^4.17.5",
    "material-design-icons": "^3.0.1",
    "moment": "^2.22.2",
    "muuri": "0.5.4",
    "ng2-nouislider": "^1.7.13",
    "nouislider": "^12.1.0",
    "reflect-metadata": "^0.1.12",
    "rxjs": "6.4.0",
    "rxjs-compat": "^6.0.0-rc.0",
    "zone.js": "^0.9.0"
  },

所以我的问题是:为什么即使自定义元素没有在 DOM 中呈现,zone.js 也会监听事件?如何让网站再次变得更快?

更新: 我也尝试将 ChangeDetection 设置为 onPush,但问题仍然存在。

【问题讨论】:

  • 30% 是一个巨大的性能损失。远远超出仅由区域引起的任何事情。说区域是问题就像抱怨 C++ 中的 main() 函数很慢,所以你应该删除它。话虽如此,这里有一个关于如何完全删除区域的教程。也许在你这样做之后,你会更好地了解问题出在哪里。 blog.angularindepth.com/…
  • 但是为什么即使我的自定义元素根本没有渲染到 dom 中,这些方法也经常被调用?
  • 您可以在zone.js repo 中发布问题并使用repo repo。我可以检查一下。

标签: angular zone.js angular-elements


【解决方案1】:

我不会接触 ZoneJS 设置,因为它会严重影响 Angular 本身。

我有一个类似的经验,组件每次创建都会变慢,因为存在循环依赖。我的猜测是你的代码中有一些东西,更可能是依赖关系,导致生成多个事件。

【讨论】:

  • 感谢您的提示。问题是:即使根本没有创建自定义组件,也会发生“减速”行为。
  • 我通过在组件生命周期的关键时刻(在构造函数、初始化和销毁​​期间)添加日志发现了问题,您可以执行类似的操作,看看会发生什么。调试是一个棘手的问题,并且 Angular 内部 ZoneJS 的复杂性使得使用调试器非常困难。
猜你喜欢
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 2014-11-12
  • 2016-06-25
  • 2019-05-01
  • 2012-10-29
相关资源
最近更新 更多