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.pswp.cn/web/15944.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15944.shtml
英文地址,請注明出處:http://en.pswp.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…