Skip to content

Angular 19 RC 前瞻:增量水合與模板熱更新

Angular 19 RC 已經可以預覽,正式版預計 2024 年 11 月 19 日釋出。本文基於 RC 版本介紹最重要的新特性——增量水合(Incremental Hydration)模板 HMR,以及路由級渲染模式的進一步完善。

本文基於 Angular 19 RC,API 可能與正式版有細微差異。

增量水合(Incremental Hydration)

Angular 17 引入了非破壞性 SSR 水合,但仍是全量水合——頁面所有元件同時啟用。Angular 19 引入了增量水合:元件可以按需、延遲地完成水合,類似 @defer 塊的懶載入邏輯。

typescript
// app.config.ts:開啟增量水合(需要同時開啟 SSR + 非破壞性水合)
import {
  provideClientHydration,
  withIncrementalHydration,
} from "@angular/platform-browser";

export const appConfig: ApplicationConfig = {
  providers: [
    provideClientHydration(
      withIncrementalHydration(), // 開啟增量水合
    ),
  ],
};

在模板中使用 @defer 控制水合時機:

html
<!-- 服務端渲染,但客戶端僅在可見時才水合 -->
@defer (hydrate on viewport) {
<heavy-analytics-chart [data]="chartData" />
}

<!-- 使用者互動時才水合 -->
@defer (hydrate on interaction) {
<rich-text-editor [(content)]="body" />
}

<!-- 立即水合(預設行為)-->
@defer (hydrate immediately) {
<critical-header />
}

<!-- 永不水合(純靜態內容)-->
@defer (hydrate never) {
<static-footer />
}

增量水合的好處:

  • 服務端輸出完整 HTML(SEO 友好)
  • 客戶端只水合使用者可見/互動的部分
  • 首次互動時間(TTI)大幅縮短
  • 對於內容密集型頁面(新聞、部落格)效果最明顯

模板 HMR(Hot Module Replacement)

Angular 19 正式支援元件模板的熱更新——修改 .html 模板檔案後,無需重新整理整個頁面,只更新對應元件的檢視,保留應用狀態:

bash
ng serve
# 修改 app.component.html → 僅更新 AppComponent 的檢視,狀態保留
# 修改 product-card.component.html → 僅更新所有 ProductCard 例項
# 修改 .ts 檔案 → 仍然全頁重新整理(元件邏輯變更,狀態重置)

這對錶單密集型應用特別有價值——開發中反覆調整表單佈局時,不再因 HMR 導致已填寫的資料丟失。

路由級渲染模式(穩定化)

Angular 18 引入、19 進一步穩定的路由級渲染模式:

typescript
// app.routes.server.ts
import { RenderMode, ServerRoute } from "@angular/ssr";

export const serverRoutes: ServerRoute[] = [
  {
    path: "", // 首頁:預渲染(構建時生成靜態 HTML)
    renderMode: RenderMode.Prerender,
  },
  {
    path: "blog/:slug", // 部落格文章:預渲染(需要提供所有可能的 slug)
    renderMode: RenderMode.Prerender,
  },
  {
    path: "dashboard", // 儀表盤:服務端渲染(每次請求動態生成)
    renderMode: RenderMode.Server,
  },
  {
    path: "profile", // 個人主頁:純客戶端渲染
    renderMode: RenderMode.Client,
  },
  {
    path: "**", // 其餘路由:SSR 兜底
    renderMode: RenderMode.Server,
  },
];

linkedSignal 正式穩定(預期)

Angular 18.2 引入的實驗性 linkedSignal() 預計在 19 中穩定:

typescript
// Angular 19 中 linkedSignal 預計去掉實驗標記
import { linkedSignal } from '@angular/core';

@Component({ standalone: true, ... })
export class TabsComponent {
  tabs = input.required<Tab[]>();

  // 當 tabs 變化時自動重置到第一個 tab,但使用者切換後本地狀態有效
  activeTab = linkedSignal(() => this.tabs()[0]);
}

Zoneless 變更檢測:從實驗到推薦

Angular 19 中 Zoneless 模式從"實驗性"提升為"開發者預覽":

typescript
// Angular 18:provideExperimentalZonelessChangeDetection()(實驗性)
// Angular 19:provideZonelessChangeDetection()(開發者預覽,去掉 Experimental)
import { provideZonelessChangeDetection } from "@angular/core";

bootstrapApplication(AppComponent, {
  providers: [provideZonelessChangeDetection()],
});

總結

Angular 19 的增量水合是 SSR 效能的重大提升,結合 @defer 語法,開發者可以精細控制哪些內容需要立即啟用、哪些延遲啟用。模板 HMR 則是對開發體驗的直接改善。如果你在關注 Angular 的 SSR 能力,Angular 19 值得認真評估。正式版 11 月 19 日釋出,RC 階段可以開始在測試環境中驗證。

MIT Licensed