Angular 18 於 2024 年 5 月 22 日發布,引入了一個實驗性的遊戲規則改變者:無區域 Angular 應用程式。 這消除了對 Zone.js 的依賴,提高了效能,減少了開銷,並簡化了偵錯。讓我們深入研究無區域應用程式、它們的優點以及如何嘗試此功能。
更改偵測使 DOM 與元件資料保持同步。 以前,Angular 依賴 Zone.js。 透過以下方式觸發變更偵測:
setTimeout
、setInterval
、Promise 解析。 ApplicationRef.tick()
、ChangeDetectorRef.detectChanges()
.Zone.js 修補了瀏覽器 API,通知 Angular 啟動更改偵測。 雖然有效,但這增加了開銷,有時會導致ExpressionChangedAfterItHasBeenCheckedError
。
在無區域變更偵測之前,Zone.js 管理 UI 更新。這個 StackBlitz 範例說明:
ChangeDetectionStrategy.OnPush
,直接數組突變可能不會更新視圖,除非手動觸發引用更改或更改檢測。 AsyncPipe
簡化可觀察處理,自動訂閱並觸發變更偵測。 這些範例突顯了 Zone.js 在變更偵測中的作用,為 Angular 改進的無區域架構奠定了基礎。
刪除 Zone.js 有顯著的好處:
ExpressionChangedAfterItHasBeenCheckedError
問題和與區域相關的複雜性。 切換到無區需要更改配置:
app.config.ts
中,新增:<code class="language-typescript">providers: [ provideExperimentalZonelessChangeDetection() ]</code>
刪除provideZoneChangeDetection()
(如果存在)。
import '*zone.js';
。 angular.json
中,從 zone.js
陣列中刪除 polyfills
:<code class="language-json">"polyfills": []</code>
<code class="language-bash">npm uninstall zone.js</code>
此範例示範了沒有 Zone.js 的變更偵測:
讓我們來分析每個場景:
如預期工作。
需要this.changeDetectorRef.markForCheck();
或使用訊號:
更正版本(有markForCheck
):
更正版本(含訊號):
視圖不會自動更新:
更正版本(有markForCheck
):
優先使用async
管道。
簡單;使用 async
管:
使用 toSignal()
將可觀察量轉換為訊號:
摘要:
markForCheck()
或訊號。 async
管道。 Angular 19 進一步完善了無區應用程式支援、改進了 API、新增了伺服器端渲染支援並增強了測試。 Angular CLI 現在支援建立無區域專案:
<code class="language-typescript">providers: [ provideExperimentalZonelessChangeDetection() ]</code>
以上是在 Angular 中擁抱 Zoneless:變化檢測的新時代的詳細內容。更多資訊請關注PHP中文網其他相關文章!