【问题标题】:Is there a performance difference between using router-outlet and ngIf使用 router-outlet 和 ngIf 之间是否存在性能差异
【发布时间】:2021-09-08 09:35:58
【问题描述】:

想象一下,我正在使用 ngIf 来呈现(或创建)一个组件,并且我正在基于 ngIf(或 ngSwitch)的组件之间切换。无论模式问题如何(尽管我认为在组件之间切换时使用路由器是一种更好的模式),在性能方面,如果我使用路由器插座而不是 ngIf 块(反之亦然)会有任何性能提升吗?

可视化

使用 ngIf

<ng-container *ngIf="condition === a">
   <a-component></a-component>
</ng-container>
<ng-container *ngIf="condition === b">
   <b-component></b-component>
</ng-container>

使用路由器插座

<router-outlet></router-outlet>

【问题讨论】:

    标签: angular


    【解决方案1】:

    这取决于组件,在任何一种情况下(路由器出口或 ngIf),组件都会被创建和销毁。

    如果您的组件很重,那么过于频繁地在组件之间切换可能会导致性能问题。

    顺便说一句 heavy 我的意思是 javascript 内存消耗和 DOM 重绘。

    只要确保没有内存泄漏,就可以避免内存问题,但是如果频繁更改 DOM,则无法避免 DOM 重绘,则会出现性能问题。

    避免 DOM 重绘的一种解决方案是使用 hidden 而不是 ngIf

    【讨论】:

    • 是的,据我所知,ngIf 直接从 DOM 树中删除块,在这些情况下,隐藏属性有时会变得更高效。我猜路由器和 ngIf 之间没有显着的性能差异。
    【解决方案2】:

    有趣的问题,我已经使用 Angular 将近一年了,这是我的看法:

    选择哪个以及为什么:

    • 我认为这只是你试图隐藏和显示的元素有多大的问题,如果它是用于包含一些内容或卡片的容器,*ngIf 更有意义,如果它是一个带有通过它运行的多个元素和功能,可能有子组件,使用 Angular 的路由更有意义,主要是因为上面提到的结构差异,Angular 路由在您的应用程序中很好地组织了您的组件。对大型组件使用 *ngIf 总是会很混乱。

    有性能差异吗?:

    • 这取决于您使用的路由方法,默认情况下,角度会立即加载所有组件,这样可能会产生性能差异。但是,如果您使用他们的延迟加载路由方法来加载您的组件,则在您的命令调用包含它们的模块之前,不会加载组件,在这种情况下,它们之间不会有性能差异。

    在此处查看延迟加载文档:https://angular.io/guide/lazy-loading-ngmodules

    希望这有帮助:)

    【讨论】:

    • 我在我的应用程序的几个地方使用了延迟加载,但我猜延迟加载只会导致页面的更快初始化。此外,为页面中的视图块创建模块并不是解决问题的好模式(个人意见)。据我所知,在页面之间切换时,使用 ngIf 和路由器之间没有显着的性能差异。感谢您的回复!
    猜你喜欢
    • 2012-03-05
    • 2014-05-17
    • 2012-08-21
    • 2023-03-15
    • 2014-02-23
    • 2010-10-02
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多