Angular Ivy:新渲染引擎的性能提升与优化

Angular Ivy是Angular 9及更高版本中引入的默认渲染引擎,它取代了以前的View Engine。Ivy的目标是提高Angular的性能、减少包大小和提高开发者的生产力。

1. AOT编译的改进:

在Ivy中,Angular使用了更早的AOT(Ahead-of-Time)编译,这意味着在构建时就将模板转换为纯JavaScript,减少了运行时的编译开销。在旧的View Engine中,AOT编译会产生多个大的元数据文件,而在Ivy中,这些元数据被直接内联在组件类中,减少了加载时间。

2. 更小的输出大小:

Ivy生成的代码更小,因为它的元数据格式更紧凑,而且它支持懒加载模块的更细粒度的拆分。这意味着用户只需下载他们实际使用的代码,而不是整个应用。

3. 更快的启动时间:

由于Ivy的元数据结构和更有效的编译过程,应用启动更快。Ivy使用了新的元数据格式,减少了解析和初始化的时间。

4. 更好的类型检查和错误报告:

Ivy在构建时提供了更好的类型检查,这意味着在编译阶段就能捕获更多错误,而不是在运行时。这提高了开发效率并减少了潜在的运行时问题。

5. 更容易的库开发:

Ivy允许库作者直接在他们的库中使用Ivy编译,无需额外的配置。这简化了库的创建和维护,同时也使库的使用者受益。

6. 动态组件的优化:

Ivy对动态组件的支持也进行了优化,降低了动态组件创建和销毁的开销,这对于频繁创建和销毁组件的应用来说是一个显著的性能提升。

7. 更强的DI(依赖注入):

Ivy的依赖注入系统更加高效,减少了查找依赖的开销,尤其是在大型应用中。

8. 更好的树摇优化:

Tree-shaking是现代JavaScript打包工具的一个特性,用于删除未使用的代码。Ivy的设计使得tree-shaking更容易和有效,进一步减小了最终的包大小。

要启用Ivy,你通常不需要在Angular 9及更高版本中做任何特殊配置,因为它已经是默认选项。然而,如果你需要手动启用或禁用,可以在angular.json配置文件中设置"enableIvy"为true或false。

代码示例(在Angular 9+的tsconfig.app.json文件中):

{"compilerOptions": {"enableIvy": true}
}

9. 模块与指令的局部作用域

Ivy 引入了模块和指令的局部作用域概念,这意味着组件可以声明自己的局部指令或管道,而不会污染全局命名空间。这不仅减少了全局范围的潜在冲突,还使得代码组织更加清晰,便于维护。

10. 改进的变更检测

Ivy 对变更检测机制进行了优化,能够更精准地追踪哪些组件需要被检查更新。它引入了“增量构建器”(Incremental DOM Builder),该机制在构建DOM时,仅更新那些数据确实发生变化的部分,从而减少了不必要的DOM操作,提升了性能。

11. 持续的性能优化

Angular团队持续对Ivy进行优化,比如通过减少运行时代码量、改进数据绑定机制等方式,进一步提升应用的启动速度和运行时性能。

让我们看一个简单的Angular组件例子,展示如何利用Ivy的特性:

// app.component.ts
import { Component } from '@angular/core';@Component({selector: 'app-root',template: `<h1>{{ title }}</h1><button (click)="changeTitle()">Change Title</button>`,styles: []
})
export class AppComponent {title = 'Angular Ivy App';changeTitle() {this.title = 'New Title';}
}

在上面代码中,Ivy会通过AOT编译将模板转换为高效的JavaScript代码,减少运行时解析负担。同时,变更检测机制会精确监控title属性的变化,仅当点击按钮触发changeTitle()方法,修改了title的值时,才会触发视图的更新。

12. Tree-shakable服务与依赖

在Ivy中,服务也可以被tree-shake,意味着如果你的应用没有使用某个服务,那么这个服务相关的代码就不会被打包进最终的产物中。这通过在服务提供者上使用@Injectable({ providedIn: ‘root’ })装饰器实现,它指示Angular在根模块中提供此服务,同时允许tree-shaker识别未被引用的服务。

13. 懒加载与预加载策略

Ivy 支持更精细的懒加载和预加载策略,这在大型应用中尤为重要。懒加载允许应用按需加载模块,即只有当用户导航到特定路由时,相关的模块才会被加载进来,这有助于减少初始加载时间。预加载则是在后台预先加载可能即将用到的模块,以提升用户体验。

在Angular中,通过Angular Router配置懒加载非常简单:

// app-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { AboutModule } from './about/about.module'; // 假设AboutModule是一个懒加载模块const routes: Routes = [{ path: '', component: HomeComponent },{ path: 'about', loadChildren: () => import('./about/about.module').then(m => m.AboutModule) }, // 懒加载关于页面模块
];@NgModule({imports: [RouterModule.forRoot(routes)],exports: [RouterModule]
})
export class AppRoutingModule { }

预加载策略可以在Angular Router的配置中通过preloadingStrategy选项指定,使用PreloadAllModules策略可以自动预加载所有懒加载模块:

// main.ts 或 app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule, PreloadAllModules } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';@NgModule({declarations: [AppComponent],imports: [BrowserModule,RouterModule.forRoot(AppRoutingModule.routes, { preloadingStrategy: PreloadAllModules }) // 预加载所有模块],providers: [],bootstrap: [AppComponent]
})
export class AppModule { }

14. Angular Elements

Ivy 支持Angular Elements,这是一种将Angular组件包装为Web Components的技术,使得Angular组件可以在任何支持Web Components标准的平台上运行,包括非Angular应用。这极大地增强了组件的可复用性和跨框架兼容性。

15. 性能监控与诊断

Angular提供了强大的开发者工具,如Angular DevTools,它可以帮助开发者深入了解应用的变更检测、内存分配、渲染性能等,这对于诊断和优化应用性能至关重要。Ivy的改进使得这些工具能够提供更准确和详细的性能数据。

16. 国际化(i18n)与本地化

Ivy对国际化(Internationalization, i18n)的支持也有所增强,提供了更灵活的标记和提取机制,使得多语言应用的开发和维护更加高效。开发者可以使用ng xi18n命令来提取翻译标签,并使用相应的工具或服务来完成翻译。

2500G计算机入门到高级架构师开发资料超级大礼包免费送!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在AnolisOS8.9系统安装docker-compose

在AnolisOS8.9系统安装docker-compose 下载docker-compose之前请先确保docker已经安装完&#xff0c;教程可以参考 在阿里Anolis OS 8.9龙蜥操作系统安装docker 下载最新版的docker-compose文件 sudo curl -L https://github.com/docker/compose/releases/download/v2.21.0…

大数据工具之HIVE-参数调优,调度乱码(二)

一、调度乱码 在利用HUE工具,搭建WORKFLOW流程的过程中,如果直接执行hivesql数据正常,不会出现乱码现象,如果利用WORKFLOW搭建的流程,进行数据的拉取,会出现数据中文乱码现象,这些乱码主要是由于select 中的硬编码中文导致出现的现象 具体现象如下: select case when …

百度 提前批 国际化广告部 (深圳-机器学习/数据挖掘/自然语言处理工程师) 一面+二面面经

文章目录 0、面试情况1、一面1.1、简历上的项目介绍了个遍1.2、dbscan原理1.3、为什么梯度的负方向就是损失函数下降最快的方向&#xff1f;1.4、bn原理&#xff0c;为什么bn能解决过拟合&#xff0c;1.5、auc原理&#xff0c;为什么ctr或你的广告推荐里用auc指标&#xff1f;1…

TG5032CGN TCXO 超高稳定10pin端子型适用于汽车动力转向控制器

TG5032CGN TCXO / VC-TCXO是一款应用广泛的晶振&#xff0c;具有超高稳定性&#xff0c;CMOS输出和使用晶体基振的削波正弦波输出形式。且有低相位噪声优势&#xff0c;是温补晶体振荡器(TCXO)和压控晶体振荡器(VCXO)结合的产物&#xff0c;具有TCXO和VCXO的共同优点&#xff0…

后台接口返回void但是response有设置合适的相关信息,前端调用接口解析Blob数据下载excel文件

1、pom.xml文件增加依赖&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId></dependency> 2、接口代码如下&#xff1a; /*** 企业列表--导出*/GetMapping(value "/downloadTenantL…

微信小程序上线必备:SSL证书申请以及安装

一、认识ssl证书 1、ssl证书是什么&#xff1f; SSL证书&#xff0c;全称Secure Socket Layer Certificate&#xff0c;是一种数字证书&#xff0c;它遵循SSL&#xff08;现在通常指TLS&#xff0c;Transport Layer Security&#xff09;协议标准&#xff0c;用于在客户端&…

SpringCloud系列(26)--OpenFeign超时控制

前言&#xff1a;在上一章节中我们简单的介绍了如何使用OprnFeign去调用微服务&#xff0c;因为消费侧和服务侧是两个不同的微服务&#xff0c;这样可能会出现超时的现象&#xff0c;例如服务侧需要3秒处理任何才能返回结果&#xff0c;但消费侧可能2秒就断开连接了&#xff0c…

【深度学习】2.单层感知机

目标&#xff1a; 实现一个简单的二分类模型的训练过程&#xff0c;通过模拟数据集进行训练和优化&#xff0c;训练目标是使模型能够根据输入特征正确分类数据。 演示: 1.通过PyTorch生成了一个模拟的二分类数据集&#xff0c;包括特征矩阵data_x和对应的标签数据data_y。标签…

加密与安全_AES RSA 密钥对生成及PEM格式的代码实现

文章目录 RSA&#xff08;非对称&#xff09;和AES&#xff08;对称&#xff09;加密算法一、RSA&#xff08;Rivest-Shamir-Adleman&#xff09;二、AES&#xff08;Advanced Encryption Standard&#xff09; RSA加密三种填充模式一、RSA填充模式二、常见的RSA填充模式组合三…

新业务 新市场 | 灵途科技新品亮相马来西亚亚洲防务展

5月6日&#xff0c;灵途科技携新品模组与武汉长盈通光电&#xff08;股票代码&#xff1a;688143&#xff09;携手参加第18届马来西亚亚洲防务展。首次亮相海外&#xff0c;灵途科技便收获全球客户的广泛关注&#xff0c;为公司海外市场开拓打下坚实基础。 灵途科技与长盈通共同…

Dbs封装_连接池

1.Dbs封装 每一个数据库都对应着一个dao 每个dao势必存在公共部分 我们需要将公共部分抽取出来 封装成一个工具类 保留个性化代码即可 我们的工具类一般命名为xxxs 比如Strings 就是字符串相关的工具类 而工具类 我们将其放置于util包中我们以是否有<T>区分泛型方法和非泛…

Python并发编程学习记录

1、初识并发编程 1.1、串行&#xff0c;并行&#xff0c;并发 串行(serial)&#xff1a;一个cpu上按顺序完成多个任务&#xff1b; 并行(parallelism)&#xff1a;任务数小于或等于cup核数&#xff0c;多个任务是同时执行的&#xff1b; 并发(concurrency)&#xff1a;一个…

计算机SCI期刊,IF=8+,专业性强,潜力新刊!

一、期刊名称 Journal of Big data 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;8.1 中科院分区&#xff1a;2区 出版方式&#xff1a;开放出版 版面费&#xff1a;$1990 三、期刊征稿范围 《大数据杂志》发表了关于…

2024年【T电梯修理】考试内容及T电梯修理新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【T电梯修理】考试内容及T电梯修理新版试题&#xff0c;包含T电梯修理考试内容答案和解析及T电梯修理新版试题练习。安全生产模拟考试一点通结合国家T电梯修理考试最新大纲及T电梯修理考试真题汇总&#xff0c;…

线性dp合集,蓝桥杯

贸易航线 0贸易航线 - 蓝桥云课 (lanqiao.cn) n,m,kmap(int ,input().split()) #贪心的想&#xff0c;如果买某个东西利润最大&#xff0c;那我肯定直接拉满啊&#xff0c;所以买k个和买一个没区别 p[0] for i in range(n):p.append([-1]list(map(int,input().split())))dp[[…

(2024,SDE,对抗薛定谔桥匹配,离散时间迭代马尔可夫拟合,去噪扩散 GAN)

Adversarial Schrdinger Bridge Matching 公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 简介 4. 实验 0. 摘要 薛定谔桥&#xff08;Schrdinger Bridge&#xff0c;SB&…

el-autocomplete后台远程搜索

el-complete可以实现后台远程搜索功能&#xff0c;但有时传入数据为空时&#xff0c;接口可能会报错。此时可在querySearchAsync方法中&#xff0c;根据queryString判断&#xff0c;若为空&#xff0c;则不掉用接口&#xff0c;直接callback([])&#xff0c;反之则调用接口&…

浮点型比较大小

浮点数的存储形式 浮点数按照在内存中所占字节数和数值范围&#xff0c;可以分为浮点型&#xff0c;双精度浮点型和长双浮点型数。 代码&#xff1a; printf("lgn:%e \n", pow(exp(1), 100));printf("lgn:%f ", pow(exp(1), 100));输出结果&#xff1a; …

Stanford斯坦福 CS 224R: 深度强化学习 (5)

离线强化学习:第一部分 强化学习(RL)旨在让智能体通过与环境交互来学习最优策略,从而最大化累积奖励。传统的RL训练都是在线(online)进行的,即智能体在训练过程中不断与环境交互,实时生成新的状态-动作数据,并基于新数据来更新策略。这种在线学习虽然简单直观,但也存在一些局限…

【Could not find Chrome This can occur if either】

爬虫练习中遇到的问题 使用puppeteer执行是提示一下错误 Error: Could not find Chrome (ver. 125.0.6422.78). This can occur if either you did not perform an installation before running the script (e.g. npx puppeteer browsers install chrome) oryour cache path…