這次帶給大家Angular4效能優化方法總結,Angular4效能優化的注意事項有哪些,以下就是實戰案例,一起來看一下。
Summary
Angular 4的髒值偵測是個老話題了,而理解這個模型是做Angular效能優化的基礎。因此,今天我們再來聊聊Angular 4髒值偵測的原理,並看看效能最佳化的小提示。
進入點 - Zone.js
Angular 4是一個MVVM框架。資料模型(Model)轉換成視圖模型(ViewModel)後,綁定到視圖(View)上渲染成肉眼可見的頁面。因此,發現資料模型變化的時間點是更新頁面的關鍵,也是呼叫髒值偵測的關鍵。
經過分析,工程師發現,資料的變化往往由macrotask和microtask等非同步事件所引起。因此,透過重寫瀏覽器所有的非同步API,就能從源頭有效監聽資料變化。 Zone.js就是這樣一個猴子腳本(Monkey Patch)。 Angular 4使用了一個客製化的Zone(NgZone),它會通知Angular可能有資料變化,需要更新視圖中的資料(髒值偵測)。
髒值偵測(Change Detection)
髒值偵測的基本原理是儲存舊數值,並在進行偵測時,把當前時刻的新值和舊值比對。若相等則沒有變化,反之則偵測到變化,需要更新視圖。
Angular 4把頁面切割成若干個Component(元件),組成一棵元件樹。進入髒值偵測後,從根組件自頂向下進行偵測。 Angular有兩種策略:Default和OnPush。它們配置在組件上,決定髒值偵測過程中不同的行為。
Default - 預設策略
ChangeDetectionStrategy.Default。它也意味著一旦發生可能有資料變化的事件,就總是偵測這個元件。
髒值偵測的操作基本上可以理解為以下幾步。 1)更新子元件綁定的properties,2)呼叫子元件的NgDoCheck和NgOnChanges生命週期鉤子(Lifecycle hook),3)更新自己的DOM,4)對子元件髒值偵測。這是一個從根組件開始的遞歸方程式。
// This is not Angular code function changeDetection(component) { updateProperties(component.children); component.children.forEach(child => { child.NgDoCheck(); child.NgOnChanges(); }; updateDom(component); component.children.forEach(child => changeDetection(child)); }
我們開發者會非常關注DOM更新的順序,以及呼叫NgDoCheck和NgOnChanges的順序。可以發現:
DOM更新是深度優先的
NgDoCheck和NgOnChanges並不是(也不是深度優先)
#OnPush - 單次偵測策略
ChangeDetectionStrategy.OnPush。只在Input Properties變化(OnPush)時才檢測這個組件。因此當Input不變時,它只在初始化時被偵測,也叫單次偵測。它的其他行為和Default保持一致。
要注意的是,OnPush只偵測Input的引用。 Input物件的屬性變化並不會觸發目前元件的髒值偵測。
雖然OnPush策略提高了性能,但也是Bug的高發地點。解往往是將Input轉換成Immutable的形式,強制Input的引用改變。
Tips
#Angular有3種合法的資料綁定方式,但它們的性能是不一樣的。
直接綁定資料
- Name {{item.name}} Classes {{item.classes}}
大多數情況下,這都是效能最好的方式。
綁定一個function呼叫結果
- Name {{item.name}} Classes {{classes(item)}}
在每個髒值偵測過程中,classes方程式都要被呼叫一遍。設想使用者正在滾動頁面,多個macrotask產生,每個macrotask都至少進行一次髒值檢測。如果沒有特殊需求,應盡量避免這種使用方式。
綁定資料 pipe
- Name {{item.name}} Classes {{item | classPipe}}
它和綁定function類似,每次髒值偵測classPipe都會被呼叫。不過Angular給pipe做了優化,加了緩存,如果item和上次相等,則直接回傳結果。
NgFor
多数情况下,NgFor应该伴随trackBy方程使用。否则,每次脏值检测过程中,NgFor会把列表里每一项都执行更新DOM操作。
@Component({ selector: 'my-app', template: `
- {{item.id}}
Reference
He who thinks change detection is depth-first and he who thinks it's breadth-first are both usually right
Angular Runtime Performance Guide
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上是Angular4效能最佳化方法總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

JavaScript不需要安裝,因為它已內置於現代瀏覽器中。你只需文本編輯器和瀏覽器即可開始使用。 1)在瀏覽器環境中,通過標籤嵌入HTML文件中運行。 2)在Node.js環境中,下載並安裝Node.js後,通過命令行運行JavaScript文件。

如何在Quartz中提前發送任務通知在使用Quartz定時器進行任務調度時,任務的執行時間是由cron表達式設定的。現�...

在JavaScript中如何獲取原型鏈上函數的參數在JavaScript編程中,理解和操作原型鏈上的函數參數是常見且重要的任�...

在微信小程序web-view中使用Vue.js動態style位移失效的原因分析在使用Vue.js...

在Tampermonkey中如何對多個鏈接進行並發GET請求並依次判斷返回結果?在Tampermonkey腳本中,我們經常需要對多個鏈...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中