【问题标题】:How does Angular2 Ahead of Time (AoT) compilation work?Angular2 Ahead of Time (AoT) 编译是如何工作的?
【发布时间】:2016-09-13 07:23:05
【问题描述】:

Angular 2 带有一个名为 Ahead of Time (AoT) 的新功能。但是读了一些之后,我仍然无法真正理解它。它是如何工作的?它将如何带来更好的性能?它与 JIT 有何不同?

谢谢。

【问题讨论】:

    标签: javascript performance angular


    【解决方案1】:

    Angular 在模块、指令、管道上的视图和装饰器中使用声明式绑定,这些模块、指令、管道需要由浏览器中的 JS 解释以执行其预期用途。

    离线模板编译器用生成的静态代码替换声明性绑定和装饰器。

    这使得 Angular2 组件的实例化和初始化更快,因为 JS 要做的工作更少。在将应用程序提供给客户端之前,已经完成了组件的“编译”。

    如果您不使用在运行时需要它的其他功能,则可以省略 platform-b​​rowser-dynamic 并且根本不需要将其加载到浏览器中。

    有一些讨论是否生成的代码不会超出浏览器动态平台的大小,但据我所知,Angular2 团队进行了大量试验和基准测试以确保最佳性能。

    来自 AoT 食谱

    Angular 组件由标准 html 和 Angular 的混合组成 语法(例如ngIf、ngFor)。

    ngIf 和 ngFor 等表达式是 Angular 特有的,因此浏览器无法直接执行它们。

    在浏览器可以渲染应用程序之前,Angular 特定的代码和模板必须转换为常规的可执行文件 JavaScript。我们将此步骤称为编译。

    默认情况下,编译由浏览器在运行时执行,在 所谓的即时编译(JIT)。它被称为“刚进 时间”,因为编译在应用程序加载时即时进行。

    JIT 编译的缺点是运行时性能损失。 由于编译步骤,视图需要更长的时间来呈现。它也是 迫使我们下载 Angular 编译器和我们的应用程序 代码,因为我们在运行时需要编译器。

    【讨论】:

    • 非常感谢您的出色回答。那么,这是否意味着如果我的代码由 AOT 编译,那么我不需要在我的生产代码中包含 Angular 库,因为整个代码已转换为常规的可执行 JavaScript 代码?
    • Angular2 本身仍然包含在内。生成的代码使用 Angular2。但是 Angular2 由几个模块组成,如果您的所有组件都提前编译,则不需要平台浏览器动态模块(主要由编译器组成)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2017-01-13
    • 2018-10-29
    • 2017-05-03
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多