0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Angular技術要素解説】ビルドツールとパフォーマンス最適化を理解する:CLI・esbuild・SSR

0
Posted at

はじめに

Angular技術要素解説シリーズ、第8弾です。

今回は、書いたコードを実際にブラウザで動くアプリに変換するビルドツールと、表示速度を改善する各種の仕組みを解説します。

普段何気なく使っているng serveやng buildの裏側で何が起きているかを理解しましょう。

この記事で扱う技術要素

  • Angular CLI(ngコマンド)
  • esbuild / Vite
  • AOT(Ahead-of-Time)コンパイル
  • Ivy
  • SSR(Server-Side Rendering) / Hydration

Angular CLIとは

Angular CLIは、Angularプロジェクトの作成・開発・ビルド・テストを統一的なコマンドで行うための、公式コマンドラインツールです。

# Angular CLI自体をグローバルにインストール
npm install -g @angular/cli

# 新規プロジェクトを作成
ng new my-app

# 開発サーバーを起動(ファイル変更を検知して自動リロード)
ng serve

# コンポーネント・サービス・ディレクティブ等の雛形を生成
ng generate component user-profile
ng generate service user
ng generate directive highlight

# 本番用にビルド(最適化されたファイル一式をdist/フォルダに出力)
ng build

# ユニットテストを実行
ng test

ng generate(短縮形ng g)を使うと、コンポーネントの.ts・.html・.cssファイルが決まった構成で自動生成されるため、プロジェクト間でのファイル構成のばらつきを抑えられます。

チーム開発において「新しいメンバーが来ても、同じコマンドを叩けば同じ構成のファイルが作れる」という点は、地味ですが大きなメリットです。

esbuildとVite:ビルドの高速化

ng build・ng serveの裏側では、TypeScriptやSCSSなどのソースコードを、ブラウザが実行できるJavaScript・CSSに変換する処理(バンドル処理)が行われています。

この処理を担うのがesbuildとViteです。

  • esbuild: Go言語で実装された、非常に高速なJavaScript/TypeScriptバンドラー。Angular CLIは現在、本番ビルドの中核にこのesbuildを採用しています
  • Vite: 開発時のビルド・ホットリロードを高速化するツール。ng serveで使われる開発サーバーの基盤になっています

以前のAngular(16以前)はWebpackというバンドラーを中心に使っていましたが、esbuildベースのビルドシステムへの移行により、ビルド時間が従来比60〜75%短縮されたと報告されています。

開発者としてこれらのツールの内部実装を直接いじる機会は少ないですが、「なぜ最近のAngularはビルドが速くなったのか」を理解しておくと、他のフレームワーク(Vue、Svelteなど)のツールチェインとの比較の際にも役立ちます。

# angular.jsonでビルダーの種類を確認できる
# "builder": "@angular-devkit/build-angular:application" のように指定されている

AOT(Ahead-of-Time)コンパイルとIvy

Angularのテンプレート(HTML風の記法)は、そのままではブラウザが理解できないため、最終的にはJavaScriptのコードに変換(コンパイル)される必要があります。

このコンパイルには2つのタイミングがあります。

方式 コンパイルのタイミング 特徴
JIT(Just-in-Time) ブラウザでアプリを実行する瞬間 開発時に使われていた方式。初回表示が遅くなりがち
AOT(Ahead-of-Time) ng buildを実行する、ビルドの段階 現在の標準。ブラウザは変換済みのコードを受け取るだけでよい

現在のAngularは、開発時・本番ビルド時ともに基本的にAOTを採用しています。

テンプレートを事前にJavaScriptへ変換しておくことで、ブラウザ側でのコンパイル処理が不要になり、初期表示が高速化されます。

このAOTコンパイルを支えているレンダリングエンジンがIvyです。

Angular 9で導入されたIvyは、以前のレンダリングエンジン(View Engine)と比べて、生成されるコードのサイズを削減し、未使用のコード(使っていないコンポーネントの機能など)を取り除くツリーシェイキングの精度を高めました。

SSR(Server-Side Rendering)とHydration

通常のAngularアプリ(SPA)は、最初は空っぽのHTMLがブラウザに届き、その後JavaScriptが実行されて初めて画面の中身が表示されます。

この方式には、以下のような課題があります。

  • JavaScriptの読み込み・実行が終わるまで、ユーザーには何も見えない(画面が真っ白になる)
  • 検索エンジンのクローラーが、中身のない空のHTMLしか読み取れないことがある(SEOへの影響)

SSR(Server-Side Rendering)は、サーバー側で事前にHTMLを生成してからブラウザに届けることで、これらの課題を解決します。

# SSR対応のAngularプロジェクトを新規作成する場合
ng new my-app --ssr

# 既存プロジェクトにSSRを追加する場合
ng add @angular/ssr

SSRによってサーバーから届いたHTMLは、見た目としてはすでに表示されていますが、この時点ではまだ「ボタンを押しても反応しない」という静的な状態です。

この静的なHTMLに対して、クライアント側でAngularのインタラクティブ性(クリックイベントの処理など)を後付けする処理をHydration(ハイドレーション)と呼びます。

SSRとHydrationの流れ:
1. ユーザーがページにアクセスする
2. サーバーがHTMLを事前に生成し、ブラウザへ送信する(この時点でコンテンツは見える)
3. ブラウザ側でAngularのJavaScriptが読み込まれる
4. Hydrationが実行され、静的なHTMLに対してクリック等のイベント処理が組み込まれる
5. ページが完全にインタラクティブになる

Incremental Hydration(インクリメンタルハイドレーション)

さらに、ページ全体を一度にHydrationするのではなく、必要な部分から段階的にHydrationしていくIncremental Hydrationという仕組みも用意されています。

以前の記事で解説した@deferブロックと組み合わせることで、「最初に見えている部分だけを素早くインタラクティブにし、画面外の部分は後回しにする」という制御が可能になり、ユーザーが実際に操作可能になるまでの時間(Time to Interactive)が改善されます。

@Component({
  selector: 'app-product-page',
  standalone: true,
  template: `
    <h1>{{ productName }}</h1>

    @defer (hydrate on viewport) {
      <!-- 画面に表示された時点でHydrationされる。それまではサーバー生成のHTMLのまま -->
      <app-review-section [productId]="productId" />
    }
  `,
})
export class ProductPageComponent {
  productName = 'ワイヤレスイヤホン';
  productId = 123;
}

パフォーマンス最適化の全体像

これまで本シリーズで解説してきた技術要素も含め、Angularアプリのパフォーマンスを改善する主な手段を整理します。

手段 効果 関連記事
Signals + Zoneless変更検知 無駄な再描画を削減する Signals編
@deferによる遅延読み込み 初期表示に不要な部分の読み込みを後回しにする テンプレート構文編
ルートの遅延読み込み(Lazy Loading) 使われていない画面のコードを最初に読み込まない ルーティング編
AOTコンパイル + Ivy ブラウザ側でのコンパイル処理を不要にし、バンドルサイズを削減する 本記事
SSR + Hydration 初期表示の体感速度・SEOを改善する 本記事

まとめ

用語 役割
Angular CLI プロジェクト作成・生成・ビルド・テストを統一コマンドで行うツール
esbuild / Vite Angular CLIが採用している、高速なビルド・開発サーバーの基盤
AOTコンパイル テンプレートをビルド時点で事前にJavaScriptへ変換する方式(現在の標準)
Ivy AOTコンパイルを支える、Angular 9以降のレンダリングエンジン
SSR サーバー側で事前にHTMLを生成し、初期表示・SEOを改善する仕組み
Hydration SSRで生成された静的HTMLに、クライアント側でインタラクティブ性を後付けする処理

次回は、Angularアプリの品質を支えるテストについて解説します。

学習に使った書籍

本記事の内容整理にあたっても、以下の書籍を参考にしました。

※上記リンクはアフィリエイトリンクを含みます。

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?