更改偵測是 Angular 的一個基本面,負責識別和更新 DOM 中因資料修改或使用者互動而發生變更的部分。此過程可確保 UI 與底層資料保持一致,從而增強使用者體驗和應用程式效能。
從歷史上看,Angular 一直依賴 Zone.js 來實現其變更檢測機制。 Zone.js 是一個攔截非同步操作的 JavaScript 函式庫,允許 Angular 監視變更並相應地觸發更新。但是,包含 Zone.js 可能會增加應用程式的開銷,特別是在非同步活動頻繁的場景中。
Angular 提供了兩種主要的變化檢測策略:
@Component({ selector: 'app-my-component', template: `{{ message }}
` }) export class MyComponent { message = 'Hello, world!'; }
這種策略更容易實現,因為 Angular 會自動處理大部分變化檢測邏輯。
這種變更檢測策略的最大挑戰是它會導致不必要的 DOM 更新,這對於大型應用程式至關重要。
@Component({ selector: 'app-my-component', template: `{{ message }}
`, changeDetection: ChangeDetectionStrategy.OnPush }) export class MyComponent { message = 'Hello, world!'; }
雖然 onPush 變更偵測策略最大限度地減少了不必要的 DOM 操作,但 onPush 變更策略的最大挑戰是開發人員必須進行更多的手動管理並手動觸發變更。在某些情況下,例如當資料間接變更或使用可變物件時,他們必須使用changeDetectorRef.detectChanges()明確處理變更偵測。
為了解決與 Zone.js 相關的挑戰,Angular 18 引入了一項稱為混合變更檢測的實驗性功能。這種方法旨在完全消除 Zone.js,使用新的更改檢測機制來檢測變更並操作 DOM。
要啟用混合變更偵測,可以使用下列程式碼:
bootstrapApplication(RootCmp, { providers: [provideExperimentalZonelessChangeDetection()] } );
這將在以下場景中觸發更改檢測:
啟用混合變更偵測後,您可以安全地從應用程式的 polyfill 中刪除 Zone.js。
"polyfills": [ "zone.js" //remove this line ],
提高效能:消除 Zone.js 可以減少開銷,從而提高效能,特別是在具有大量非同步操作的應用程式中。
增強的開發人員體驗:取消手動更改檢測簡化了開發並降低了出錯的可能性。
較小的應用程式大小: Zone.js 通常會增加約 13KB 的應用程式大小。刪除它可能會導致捆綁包變小。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3