パフォーマンス最適化とビルドデプロイメント

1. コース紹介

(1) 前提条件

(2) 🎯 学習内容


(3) ペインポイント

アリスはBootstrapポートフォリオサイトを完成させましたが、ページの読み込みに3秒かかり、ユーザーはページが完全に読み込まれる前に離脱する可能性がありました。Lighthouseのスコアも低い状態です。

(4) 解決策

ページを作成することは第一步に過ぎません。高速に読み込み、優れたエクスペリエンスを提供すること が最終目標です。このレッスンでは、Bootstrapプロジェクトにおけるパフォーマンス最適化とビルドデプロイメントのベストプラクティスをまとめます: CSS圧縮、JSオンデマンド読み込み、画像最適化、CDN事前ウォームアップ。最適化により、読み込み時間を0.8秒に短縮します。

理解: パフォーマンス最適化とは、ウェブサイトの「ダイエット」です。不要なコードを削除し、リソースを圧縮し、ブラウザにキャッシュ結果を保持させることで、ページを1秒以内に読み込めるようにします。

(5) メリット

アリスのBootstrapポートフォリオサイトは3秒から0.8秒に最適化され、Lighthouseスコアが大幅に向上し、ユーザーエクスペリエンスが大幅に改善。結果として、ウェブサイトのコンバージョン率が向上しました。


2. Bootstrapのサイズ分析

リソース 非圧縮 Gzip 圧縮 備考
bootstrap.min.css ~250KB ~28KB フルフレームワーク
bootstrap.bundle.min.js ~205KB ~22KB Popper 含む
bootstrap.min.js ~170KB ~19KB Popper 除外
Bootstrap Icons CSS ~220KB ~25KB 2000以上のアイコン

重要な結論: フルBootstrapのCSS + JSを圧縮すると約50KBで、現代のネットワークでは小さいサイズです。実際のパフォーマンスに影響するのは、画像、フォント、サードパーティのスクリプトです。

▶ サンプル 最適化前 vs 最適化後

100%
graph LR
    subgraph "最適化前 (3s)"
        A1[HTML] --> B1[フルBootstrap CSS]
        B1 --> C1[フルBootstrap JS]
        C1 --> D1[未最適化画像]
        D1 --> E1[Google Fonts CSS]
        E1 --> F1[読み込み時間 3s]
    end

    subgraph "最適化後 (0.8s)"
        A2[HTML] --> B2[パージ済みCSS ~30KB]
        B2 --> C2[遅延読み込み画像]
        C2 --> D2[遅延JS]
        D2 --> E2[CDNキャッシュウォーム済み]
        E2 --> F2[読み込み時間 0.8s]
    end

出力: Bootstrap 5.3 スタイルのコンポーネント(例: ボタン、カード、カルーセル、コラプス)、デフォルトのBootstrapテーマ(ライト)とレスポンシブグリッドを使用。


3. CSS最適化

(1) オンデマンドコンパイル (Sass)

SCSS
// 使用するモジュールのみをインポート
@import "bootstrap/scss/functions";
@import "bootstrap/scss/variables";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/root";

@import "bootstrap/scss/reboot";
@import "bootstrap/scss/type";
@import "bootstrap/scss/grid";
@import "bootstrap/scss/buttons";
@import "bootstrap/scss/card";
@import "bootstrap/scss/navbar";
@import "bootstrap/scss/forms";

@import "bootstrap/scss/utilities";
@import "bootstrap/scss/utilities/api";
▶ 試してみよう

出力: Bootstrap 5.3 スタイルのコンポーネント(例: ボタン、カード、カルーセル、コラプス)、デフォルトのBootstrapテーマ(ライト)とレスポンシブグリッドを使用。

(2) PurgeCSSによる冗長性除去

PurgeCSSは、HTML/JSで実際に使用されているクラスを分析し、未使用のCSSを削除できます:

BASH
npm install -D purgecss
JAVASCRIPT
// purgecss.config.js
module.exports = {
  content: ['.//*.html', './/*.js'],
  css: ['./dist/style.css'],
  safelist: ['show', 'active', 'fade', 'collapse', 'modal-open']
}
▶ 試してみよう

出力: Bootstrap 5.3 スタイルのコンポーネント(例: ボタン、カード、カルーセル、コラプス)、デフォルトのBootstrapテーマ(ライト)とレスポンシブグリッドを使用。

BASH
npx purgecss --config purgecss.config.js --output dist/style.min.css

(3) CDN経由の圧縮版を使用する

HTML
<!-- 本番環境では常に .min.css / .min.js を使用 -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
▶ 試してみよう

出力: Bootstrap 5.3 スタイルのコンポーネント(例: ボタン、カード、カルーセル、コラプス)、デフォルトのBootstrapテーマ(ライト)とレスポンシブグリッドを使用。


4. JavaScript最適化

(1) 必要なコンポーネントのオンデマンドインポート

JAVASCRIPT
// 必要なJSコンポーネントのみをインポート
import Alert from 'bootstrap/js/dist/alert'
import Button from 'bootstrap/js/dist/button'
import Carousel from 'bootstrap/js/dist/carousel'
import Collapse from 'bootstrap/js/dist/collapse'
import Dropdown from 'bootstrap/js/dist/dropdown'
import Modal from 'bootstrap/js/dist/modal'
import Offcanvas from 'bootstrap/js/dist/offcanvas'

// すべてのツールチップを初期化
document.querySelectorAll('[data-bs-toggle="tooltip"]')
  .forEach(el => new bootstrap.Tooltip(el))
▶ 試してみよう

出力: Bootstrap 5.3 スタイルのコンポーネント(例: ボタン、カード、カルーセル、コラプス)、デフォルトのBootstrapテーマ(ライト)とレスポンシブグリッドを使用。

(2) 重要でないJSを遅延させる

HTML
<!-- 重要でないJSを遅延 -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" defer></script>
▶ 試してみよう

出力: Bootstrap 5.3 スタイルのコンポーネント(例: ボタン、カード、カルーセル、コラプス)、デフォルトのBootstrapテーマ(ライト)とレスポンシブグリッドを使用。

(3) アイコンのオンデマンドインポート

HTML
<!-- 使用するアイコンが少ない場合、アイコンフォントの代わりにインラインSVGを使用 -->
<svg class="bi" width="16" height="16" fill="currentColor">
  <use href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/bootstrap-icons.svg#house"/>
</svg>

<!-- または、必要なSVGをローカルにダウンロードして、CDNリクエストを回避 -->
▶ 試してみよう

出力: Bootstrap 5.3 スタイルのコンポーネント(例: ボタン、カード、カルーセル、コラプス)、デフォルトのBootstrapテーマ(ライト)とレスポンシブグリッドを使用。


5. 画像最適化

HTML
<!-- 常に width + height を指定してレイアウトシフトを防止 -->
<img src="photo.webp" width="800" height="450" class="img-fluid" alt="Photo"
     loading="lazy">

<!-- モダンフォーマットを使用 -->
<picture>
  <source srcset="photo.avif" type="image/avif">
  <source srcset="photo.webp" type="image/webp">
  <img src="photo.jpg" class="img-fluid" alt="Photo">
</picture>
▶ 試してみよう

出力: Bootstrap 5.3 スタイルのコンポーネント(例: ボタン、カード、カルーセル、コラプス)、デフォルトのBootstrapテーマ(ライト)とレスポンシブグリッドを使用。


6. ビルドとデプロイメント

(1) 本番ビルドプロセス

JSON
// package.json
{
  "scripts": {
    "dev": "sass scss/custom.scss:dist/style.css --watch",
    "build:css": "sass scss/custom.scss:dist/style.css --style compressed",
    "build:purge": "purgecss --config purgecss.config.js --output dist/style.min.css",
    "build": "npm run build:css && npm run build:purge",
    "serve": "npx live-server --port=3000"
  }
}
BASH
npm run build    # コンパイル + パージ
npm run serve    # ローカル開発サーバー

(2) デプロイメントチェックリスト

アイテム チェックポイント ツール
CSS 圧縮済み、パージ済み、クリティカルCSSのインライン化 PurgeCSS, Critical
JS 圧縮済み、オンデマンド読み込み、defer terser, webpack
画像 圧縮済み、webp/avif、遅延読み込み sharp, squoosh
フォント プリロード済み、font-display: swap @font-face
キャッシュ CDNキャッシュ、ETag、Cache-Control Cloudflare, Nginx
分析 Lighthouse スコア >= 90 Lighthouse

(3) Lighthouseターゲット

指標 ターゲット
First Contentful Paint < 1.5s
Largest Contentful Paint < 2.5s
Total Blocking Time < 200ms
Cumulative Layout Shift < 0.1
Speed Index < 3.0s

7. Bootstrap vs Tailwind 選択レビュー

次元 Bootstrap Tailwind CSS
学習曲線 ⭐⭐⭐ ⭐⭐⭐⭐⭐
開発速度 高速(すぐに使えるコンポーネント) 中程度(ユーティリティを組み合わせる必要あり)
ファイルサイズ 28KB gzip(フル) オンデマンドコンパイル、通常 < 10KB
カスタマイズ性 中程度(Sass変数) 高い(デザインシステム)
コンポーネントエコシステム 70以上の組み込み なし(Headless UIが必要)
アップグレードコスト 低い(セマンティッククラス) 中程度(クラスの変更)
適したプロジェクト 管理パネル、MVP、中小企業ウェブサイト デザインシステム、ブランドカスタマイズ

8. 最適化実践例

▶ サンプル PurgeCSS設定の最適化

JAVASCRIPT
// purgecss.config.js — 完全な本番設定
module.exports = {
  content: [
    './src/**/*.html',
    './src/**/*.js',
    './src/**/*.php',
  ],
  css: [
    './dist/style.css',
    './node_modules/bootstrap-icons/font/bootstrap-icons.css',
  ],
  safelist: {
    standard: [
      // Bootstrapの動的クラス
      /^bs-/,            // すべてのBootstrap CSS変数
      /^data-bs-/,       // すべてのdata属性
      'active', 'show', 'fade', 'collapsing',
      'modal-open', 'modal-backdrop',
      'carousel-item-start', 'carousel-item-end',
      'tooltip', 'popover', 'toast',
      /^btn-/,           // ボタンバリアントクラス
      /^bg-/,            // 背景クラス
      /^text-/,          // テキストカラークラス
      /^border-/,        // ボーダークラス
      /^alert-/,         // アラートバリアント
      /^badge-/,         // バッジバリアント
    ],
    deep: [
      /^theme$/,
    ],
    greedy: [
      /dark/,
    ],
  },
  blocklist: [
    /^bi-/,              // 未使用のBIアイコンをオプションで削除
  ],
  variables: true,
};

// 実行: npx purgecss --config purgecss.config.js --output dist/style.purged.css
▶ 試してみよう

出力: Bootstrap 5.3 スタイルのコンポーネント(例: ボタン、カード、カルーセル、コラプス)、デフォルトのBootstrapテーマ(ライト)とレスポンシブグリッドを使用。

JSON
// 最適化ビルド用のpackage.jsonスクリプト
{
  "scripts": {
    "dev": "sass scss/custom.scss dist/style.css --watch",
    "build:css": "sass scss/custom.scss dist/style.css --style compressed",
    "build:purge": "purgecss --config purgecss.config.js --output dist/style.purged.css",
    "build:copy": "cp dist/style.purged.css dist/style.min.css",
    "build": "npm run build:css && npm run build:purge && npm run build:copy",
    "build:all": "npm run build && npx terser dist/script.js -o dist/script.min.js",
    "serve": "npx live-server --port=3000 --no-browser"
  }
}

▶ サンプル Lighthouse最適化チェックリスト

HTML
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <!-- SEO メタ -->
  <title>最適化されたBootstrapページ</title>
  <meta name="description" content="Bootstrapで構築されたLighthouseスコア95以上のページ。">

  <!-- CDNへの事前接続 -->
  <link rel="preconnect" href="https://cdn.jsdelivr.net">
  <link rel="dns-prefetch" href="https://cdn.jsdelivr.net">

  <!-- クリティカルCSSのインライン化(最初に読み込む) -->
  <style>
    /* ファーストビューのコンテンツ用の最小限のクリティカルCSS */
    .hero { background: #0d6efd; color: #fff; padding: 4rem 0; }
    .container { max-width: 1140px; margin: 0 auto; padding: 0 1rem; }
    @media (max-width: 768px) { .hero { padding: 2rem 0; } }
  </style>

  <!-- 重要でないCSS(遅延読み込み) -->
  <link rel="preload" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
  <noscript><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"></noscript>

  <!-- ヒーロー画像のプリロード -->
  <link rel="preload" href="hero.webp" as="image" fetchpriority="high">
</head>
<body>
  <div class="hero">
    <div class="container">
      <h1 class="display-4 fw-bold">最適化されたBootstrap</h1>
      <p class="lead mb-4">Lighthouseスコア: パフォーマンス98、アクセシビリティ100、ベストプラクティス95</p>
      <a href="#" class="btn btn-light btn-lg px-4">開始する</a>
    </div>
  </div>

  <div class="container py-5">
    <div class="row g-4">
      <!-- 遅延読み込み画像付きカード -->
      <div class="col-md-4">
        <div class="card p-4 h-100">
          <img src="placeholder.svg" data-src="card1.webp" class="card-img-top lazy" alt="Card 1" width="400" height="250" loading="lazy">
          <h5 class="card-title mt-2">最適化されたカード</h5>
          <p class="card-text text-body-secondary">遅延読み込みWebP画像、適切なアスペクト比。</p>
        </div>
      </div>
      <div class="col-md-4">
        <div class="card p-4 h-100">
          <img src="placeholder.svg" data-src="card2.webp" class="card-img-top lazy" alt="Card 2" width="400" height="250" loading="lazy">
          <h5 class="card-title mt-2">高速読み込み</h5>
          <p class="card-text text-body-secondary">フォントディスプレイのスワップが有効。</p>
        </div>
      </div>
      <div class="col-md-4">
        <div class="card p-4 h-100">
          <img src="placeholder.svg" data-src="card3.webp" class="card-img-top lazy" alt="Card 3" width="400" height="250" loading="lazy">
          <h5 class="card-title mt-2">アクセシブル</h5>
          <p class="card-text text-body-secondary">アクセシビリティスコア100を保証。</p>
        </div>
      </div>
    </div>
  </div>

  <!-- 遅延Bootstrap JS -->
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" defer></script>

  <!-- 画像の遅延読み込み -->
  <script>
    document.addEventListener('DOMContentLoaded', function() {
      const lazyImages = document.querySelectorAll('.lazy');
      if ('IntersectionObserver' in window) {
        const observer = new IntersectionObserver(function(entries) {
          entries.forEach(function(entry) {
            if (entry.isIntersecting) {
              const img = entry.target;
              img.src = img.dataset.src;
              img.classList.remove('lazy');
              observer.unobserve(img);
            }
          });
        });
        lazyImages.forEach(function(img) { observer.observe(img); });
      }
    });
  </script>
</body>
</html>
▶ 試してみよう

出力: Bootstrap 5.3 スタイルのコンポーネント(例: ボタン、カード、カルーセル、コラプス)、デフォルトのBootstrapテーマ(ライト)とレスポンシブグリッドを使用。

▶ サンプル CDNマルチソースフォールバック読み込み

HTML
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>フォールバック付きCDN</title>

  <!-- プライマリCDN: jsDelivr -->
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"
        id="bootstrap-css"
        integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH"
        crossorigin="anonymous">

  <!-- フォールバック: プライマリCDNが失敗した場合、unpkgから読み込む -->
  <script>
    window.onload = function() {
      var css = document.getElementById('bootstrap-css');
      if (css && !css.sheet) {
        var fallback = document.createElement('link');
        fallback.rel = 'stylesheet';
        fallback.href = 'https://unpkg.com/bootstrap@5.3.3/dist/css/bootstrap.min.css';
        document.head.appendChild(fallback);
      }
    };
  </script>
</head>
<body>
  <div class="container py-5">
    <h1>CDNマルチソースフォールバック</h1>
    <div class="alert alert-success">
      <i class="bi bi-check-circle-fill me-2"></i> Bootstrapの読み込みに成功しました!
    </div>
    <p class="text-body-secondary">jsDelivrがダウンした場合、自動的にunpkgにフォールバックします。</p>

    <div class="card p-4 shadow-sm">
      <h5>CDNソースチェーン</h5>
      <ol class="mb-0">
        <li class="mb-1"><strong>プライマリ:</strong> cdn.jsdelivr.net</li>
        <li class="mb-1"><strong>フォールバック1:</strong> unpkg.com</li>
        <li><strong>フォールバック2:</strong> cdnjs.cloudflare.com</li>
      </ol>
    </div>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"
          integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz"
          crossorigin="anonymous"
          defer></script>
  <script>
    // JSフォールバック
    if (typeof bootstrap === 'undefined') {
      var script = document.createElement('script');
      script.src = 'https://unpkg.com/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js';
      script.defer = true;
      document.body.appendChild(script);
    }
  </script>
</body>
</html>
▶ 試してみよう

出力: Bootstrap 5.3 スタイルのコンポーネント(例: ボタン、カード、カルーセル、コラプス)、デフォルトのBootstrapテーマ(ライト)とレスポンシブグリッドを使用。

▶ サンプル 完全なビルドスクリプト

JSON
// package.json — フルビルドパイプライン
{
  "name": "bootstrap-production-build",
  "version": "1.0.0",
  "scripts": {
    "clean": "rimraf dist",
    "sass:compile": "sass scss/custom.scss:dist/css/style.css --style compressed",
    "sass:watch": "sass scss/custom.scss:dist/css/style.css --watch",
    "prefix": "postcss dist/css/style.css --use autoprefixer -o dist/css/style.prefixed.css",
    "purge": "purgecss --config purgecss.config.js --output dist/css/style.min.css",
    "js:bundle": "esbuild src/js/main.js --bundle --minify --outfile=dist/js/main.min.js",
    "img:min": "imagemin src/images/* --out-dir=dist/images",
    "copy:html": "cp src/*.html dist/",
    "build:dev": "npm run clean && npm run sass:compile && npm run copy:html",
    "build:prod": "npm run build:dev && npm run prefix && npm run purge && npm run js:bundle && npm run img:min",
    "serve": "lite-server --baseDir='dist'",
    "deploy": "npm run build:prod && gh-pages -d dist"
  },
  "devDependencies": {
    "autoprefixer": "^10.4.17",
    "esbuild": "^0.20.0",
    "imagemin-cli": "^7.0.0",
    "lite-server": "^2.6.1",
    "postcss": "^8.4.33",
    "postcss-cli": "^11.0.0",
    "purgecss": "^6.0.0",
    "rimraf": "^5.0.5",
    "sass": "^1.70.0"
  },
  "dependencies": {
    "bootstrap": "^5.3.3",
    "bootstrap-icons": "^1.11.3"
  }
}
BASH
# フルビルドコマンド

# 開発
npm run build:dev     # SCSSのコンパイル + HTMLのコピー

# 本番
npm run build:prod    # コンパイル → オートプレフィックス → パージ → JSの圧縮 → 画像の最適化

# ローカルプレビュー
npm run serve         # dist/を自動リロードで配信

# GitHub Pagesへのデプロイ
npm run deploy        # ビルド + パブリッシュ

# 個別のステップ
npx sass scss/custom.scss dist/css/style.css --style compressed
npx postcss dist/css/style.css --use autoprefixer -o dist/css/style.prefixed.css
npx purgecss --css dist/css/style.prefixed.css --content dist/**/*.html --output dist/css/
npx esbuild src/js/main.js --bundle --minify --outfile=dist/js/main.min.js

(1) 最適化優先度マトリクス

100%
graph TD
    A[パフォーマンス最適化の優先度] --> B[🛡️ P0: クリティカル]
    A --> C[🔥 P1: 高]
    A --> D[⚡ P2: 中]
    A --> E[📋 P3: 低]

    B --> B1[Gzip/Brotli圧縮を有効化]
    B --> B2[画像フォーマットのWebP/AVIF最適化]
    B --> B3[未使用CSSの削除]
    B --> B4[CDNキャッシュの有効化]

    C --> C1[重要でないJSを遅延]
    C --> C2[クリティカルCSSのインライン化]
    C --> C3[サードパーティドメインへの事前接続]

    D --> D1[フォントディスプレイ:swap]
    D --> D2[画像の遅延読み込み]
    D --> D3[リソースのプリロード/プリフェッチ]

    E --> E1[Service Workerキャッシュ]
    E --> E2[HTTP/2 Server Push]
    E --> E3[スケルトンスクリーン読み込み]

出力: Bootstrap 5.3 スタイルのコンポーネント(例: ボタン、カード、カルーセル、コラプス)、デフォルトのBootstrapテーマ(ライト)とレスポンシブグリッドを使用。

(2) 最適化優先度マトリクス表

優先度 最適化項目 推定効果 実装難易度 Lighthouse指標
P0 (クリティカル) Gzip/Brotliの有効化 サイズ70-80%削減 低 (サーバー設定) FCP, LCP
P0 (クリティカル) WebP/AVIF画像フォーマット 画像サイズ30-50%削減 中 (ビルドスクリプト) LCP
P0 (クリティカル) PurgeCSSによる未使用スタイル削除 CSS60-80%削減 低 (設定ファイル) FCP
P1 (高) クリティカルCSSのインライン化 ファーストビューのレンダリングブロック削減 中 (ツールが必要) FCP
P1 (高) JS読み込みの遅延 JSブロックの削減 低 (属性の追加) TBT
P1 (高) CDN事前ウォームアップ 初回訪問の高速化 中 (手動操作) LCP
P2 (中) フォントディスプレイ:swap FOITの排除 低 (CSSプロパティ) CLS
P2 (中) 画像の遅延読み込み 初期読み込みの削減 低 (属性の追加) LCP
P3 (低) Service Workerキャッシュ 超高速な2回目の訪問 高 (SWを書く必要あり) 再利用指標

(3) デプロイメントプラットフォーム比較表

プラットフォーム 無料枠 カスタムドメイン HTTPS デプロイメント方法 CI/CD 適したシナリオ
GitHub Pages 無制限 (パブリックリポジトリ) git push GitHub Actions 個人/オープンソースプロジェクト
Netlify 月100GB Git接続 / CLI 自動 静的サイト、Jamstack
Vercel 月100GB Git接続 / CLI 自動 Next.js、フロントエンドプロジェクト
Cloudflare Pages 無制限 Git接続 / CLI 自動 グローバルCDN優先
AWS S3 + CloudFront 従量課金 CLI / SDK 設定可能 エンタープライズ本番
Aliyun OSS + CDN 従量課金 CLI / SDK 設定可能 中国地域ユーザー

❓ よくある質問

Q PurgeCSSは動的クラスを誤って削除しますか?
A おそらく。動的クラス(JSで連結されたbtn-${color}など)はセーフリストに追加する必要があります。PurgeCSSの設定セーフリストには、動的に出現する可能性のあるすべてのクラス名を列挙することをお勧めします。
Q Bootstrap 5を使用するにはBabel/Webpackが必要ですか?
A いいえ。CDN方法は完全に使用可能です(最初の19レッスンで使用しました)。Webpack/Viteなどのビルドツールは、Sassのカスタマイズとオンデマンドコンパイルのためだけのものであり、必須ではありません。
Q CDNからSassデプロイメントに切り替える際の注意点は何ですか?
A (1) すべてのCDNリンクをローカルでコンパイルされたCSSに置き換える; (2) JSが引き続きCDNまたはローカルバンドルを参照していることを確認する; (3) すべてのコンポーネント機能が正常であることを検証する; (4) ページのスタイルの前後を比較して一貫性を確認する。
Q 本番環境では、CDNとnpmビルドのどちらを使用すべきですか?
A それぞれに長所と短所があります: CDN方法 - 長所: ビルドツールが不要、CDNキャッシュを活用、複数のサイト間で共有キャッシュ; 短所: カスタマイズ不可、外部依存のリスク。npm + ビルド方法 - 長所: 完全にカスタマイズ可能、PurgeCSSが可能、独立したデプロイメント; 短所: ビルドプロセスが必要、キャッシュを自分で処理する必要あり。推奨: プロトタイプにはCDN、公式プロジェクトにはnpm + ビルドを使用。
Q HTTP/2はBootstrapプロジェクトの最適化にどのように役立ちますか?
A HTTP/2の多重接続機能により、複数の小さなファイルを並行してより速く読み込むことができるため、すべてのCSSを1つのファイルに結合する必要はありません。オンデマンドでモジュールを分割できます。また、HTTP/2のServer PushはクリティカルCSSを先に送信できます。ただし、Bootstrap自体はgzipで28KBと小さいため、HTTP/2のメリットは大規模プロジェクトでより顕著です。

📖 まとめ


📝 練習問題

  1. ⭐ 既存のBootstrapプロジェクトでLighthouse監査を実行し、FCP、LCP、CLSの指標を記録してから、目標を達成するまで項目ごとに最適化してください。
  2. ⭐⭐ PurgeCSSを構成してください: Bootstrapを使用するHTMLファイルでPurgeCSSを実行し、パージ済みと未パージのCSSのサイズの違いを比較してください。
  3. ⭐⭐⭐ dev (watch)、build (sass + purge)、serveの3つのコマンドを含む完全なpackage.jsonスクリプトを作成してください。

前のレッスン: ダークモード

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%