← Angular コース
109. 通信と画像の最適化 — 減らす・まとめる・待たせ方を工夫する
画像はページの中で最も重い資産になりがちです。Angularでは img タグの src を ngSrc に替えて NgOptimizedImage を使うのが基本で、画面外の画像の遅延読み込みや、優先すべき画像への priority 指定が半自動で手に入ります。width と height の指定が必須なので、読み込み時に画面がガタつくずれも防げます。
通信は回数を減らすのが第一です。同じAPIを複数のコンポーネントがそれぞれ呼んでいないかをNetworkタブで確認し、共有サービスに寄せて shareReplay で結果をキャッシュすれば、1回の取得を全員で使い回せます。マスタデータのような滅多に変わらないものほど効果が大きい定番の手です。
それでも消せない待ち時間は、見せ方で短く感じさせます。データ取得中はスケルトン(灰色の枠)を出す、@defer には @placeholder と @loading を添える、といった工夫で体感は大きく変わります。ただしキャッシュは「古いデータをいつまで見せてよいか」とセットで設計しないと、更新されない画面という別の不具合になります。
サンプルコード(フレームワーク環境が必要なため表示のみ)
import { Component } from '@angular/core';
import { NgOptimizedImage } from '@angular/common';
@Component({
selector: 'app-hero',
imports: [NgOptimizedImage],
// src の代わりに ngSrc を使う。width / height は必須で、
// 指定するとレイアウトのずれ(ガタつき)も防げる
template:
'<img ngSrc="/assets/hero.jpg" width="800" height="400" priority />' +
'<img ngSrc="/assets/footer.jpg" width="800" height="200" />',
})
export class HeroComponent {}
// priority を付けた画像は最優先で読み込まれる(ファーストビューの主役用)。
// 付けない画像は画面に近づくまで読み込みが遅延される
サンプルコードで身につける(5本) →
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗