Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Webサイト高速化の基本と Next.jsでの ヘッドレスCMS実装パターン

Webサイト高速化の基本と Next.jsでの ヘッドレスCMS実装パターン

RyoSogawa

May 08, 2023
Tweet

More Decks by RyoSogawa

Other Decks in Programming

Transcript

  1. 自己紹介 • 十川 涼(RyoSogawa) ◦ フロントエンドエンジニア ◦ アーキテクト / UIデザイナー

    • any株式会社 / ONE SWORD株式会社 • 好きな技術 ◦ React ◦ GraphQL ◦ Qwik • 趣味 ◦ ロックンロールミュージック ◦ ストリートファイター ◦ ダーツ https://bento.me/ryo-sogawa
  2. 1. loading="lazy" a. 画像がスクリーンに入るまで読み込まない 2. decoding="async" a. メインスレッドをブロックせずに読み込む 3. fetchpriority="high"

    a. 読み込み優先度を上げる(主に FVの画像用) 画像最適化② 読み込みタイミングの制御
  3. 1. レスポンシブによる画像の切り替え a. 複数読み込んで1つしか使わなければ無駄になる b. loading="lazy" と display: none; を併用するのが簡単でオススメ

    2. CSSのbackground-imageは使わない a. 諸々の制御ができない 3. width / height 属性の指定(CLS対策) 4. プレースホルダーの表示(遅延読み込みのUX向上) 画像最適化③ その他
  4. Webサイト=文字なのでだいたい諦められない • サブセット / ダイナミックサブセット • CDN • next/font •

    FontPlus といった対策もあるが万全なものはまだなさそう フォント最適化
  5. Next.jsでの実装パターン 1. Client Side Rendering (CSR) 2. Server Side Rendering

    (SSR) 3. Static Site Generator (SSG) a. fallback b. Incremental Static Re-Generation (ISR) 4. React Server Components (RSC) 5. Static Exports with app router ←New!
  6. クライアント側でデータフェッチする 1. Client Side Rendering (CSR) • 👍データがリアルタイム • 👎遅い

    ◦ マウントされてからAPI実行 ◦ バンドルサイズ • 👎OGP系の情報が取得できない ことがある • 👎APIアクセス過多
  7. 2. Server Side Rendering (SSR) サーバーでデータをフェッチしてクライアン トには生成済みのコンテンツを送る • 👍データがリアルタイム •

    👍OGP • 👎遅い ◦ リクエストを受けてから APIアクセス ◦ レンダリングまで完全にストップする • 👎APIアクセス過多
  8. 3. Static Site Generator (SSG) ビルドタイムでデータを取得し、予めコンテ ンツを生成しておく • 👍早い ◦

    静的ファイル ◦ アクセス前にページが生成されている • 👍APIアクセスがビルド時のみ • 👎データがリアルタイムでない • 👎コンテンツ更新に時間がかかる →欠点を補う技術がある
  9. サーバーサイドでデータを取得してレン ダーまで行った状態のコンポーネントを生 成する 4. React Server Components (RSC) • 👍

    早い ◦ バンドルサイズが小さくなる ◦ 部分的に採用できる ◦ fetchしたデータをキャッシュしたり revalidateしたりもできる • 👎 設計/実装が難しそう
  10. 5. Static Exports with app router • 👍 早い ◦

    不要なJSがある程度取り除かれる • 👍 インフラの制約がほぼない • 👎 Next.jsの一部機能が使えない • 👎 設計/実装が難しそう • 👎 記事の更新に時間がかかりそう RSCを使いビルドタイムに静的なファイル を生成する https://nextjs.org/docs/app/building-your-application/deploying/static-exports
  11. Q&A

  12. • 全記事データを持った状態でクライアント側で絞り込みをするのはちょっと無駄があ り勿体無い • 記事数が少なければどうやってもあまり変わらないが、あえて推すならURLで切り 替える方法 ◦ カテゴリ絞り込み … `/blog/category/XXXX`

    ◦ ページネーション … `/blog/category/XXXX/2` etc... • この方法にすると、各ページには表示する記事データのみがある ◦ →クライアント側で絞り込みが不要 →クライアントのコード削減 →高速化につながるはず Q. SSGの場合のブログのカテゴリーによる絞り込みや、ペー ジネーションの作り方について知りたい
  13. ヘッドレス化する大きな目的の一つは高速化なのでそのための選択肢 • Tailwind CSS / UnoCSS ◦ Atomic-CSSはアプリケーションが大型になればなるほど有利 • CSS

    Modules ◦ 無難 • Zero-runtime CSS in JS ◦ Linaria / Vanilla Extract / macaron ◦ 結構癖があるので好みに応じて ◦ near-zero-runtimeのStitchesも CSSライブラリ選定