パフォーマンス最適化とビルドデプロイメント
1. コース紹介
(1) 前提条件
- Bootstrap ダークモードとテーマ切り替え(レッスン21)
- フロントエンドのパフォーマンス指標の基本概念
- HTMLとCSSのリソース読み込みメカニズム
(2) 🎯 学習内容
- Bootstrapプロジェクトのリソースサイズと読み込みパフォーマンスを分析する
- PurgeCSSを使用して未使用のCSSを削除する
- JavaScriptのオンデマンド読み込みと遅延読み込みを最適化する
- 画像最適化とCDNデプロイメントのベストプラクティスをマスターする
- 完全な本番ビルドとデプロイメントワークフローを構成する
(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 最適化後
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)
// 使用するモジュールのみをインポート
@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を削除できます:
npm install -D purgecss
// purgecss.config.js
module.exports = {
content: ['.//*.html', './/*.js'],
css: ['./dist/style.css'],
safelist: ['show', 'active', 'fade', 'collapse', 'modal-open']
}
出力: Bootstrap 5.3 スタイルのコンポーネント(例: ボタン、カード、カルーセル、コラプス)、デフォルトのBootstrapテーマ(ライト)とレスポンシブグリッドを使用。
npx purgecss --config purgecss.config.js --output dist/style.min.css
(3) CDN経由の圧縮版を使用する
<!-- 本番環境では常に .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) 必要なコンポーネントのオンデマンドインポート
// 必要な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を遅延させる
<!-- 重要でない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) アイコンのオンデマンドインポート
<!-- 使用するアイコンが少ない場合、アイコンフォントの代わりにインライン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. 画像最適化
<!-- 常に 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) 本番ビルドプロセス
// 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"
}
}
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設定の最適化
// 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テーマ(ライト)とレスポンシブグリッドを使用。
// 最適化ビルド用の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最適化チェックリスト
<!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マルチソースフォールバック読み込み
<!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テーマ(ライト)とレスポンシブグリッドを使用。
▶ サンプル 完全なビルドスクリプト
// 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"
}
}
# フルビルドコマンド
# 開発
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) 最適化優先度マトリクス
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 | 設定可能 | 中国地域ユーザー |
❓ よくある質問
btn-${color}など)はセーフリストに追加する必要があります。PurgeCSSの設定セーフリストには、動的に出現する可能性のあるすべてのクラス名を列挙することをお勧めします。📖 まとめ
- CSS最適化: Sassのオンデマンドコンパイル + PurgeCSSによる冗長性除去、CDN経由で
.min版を使用 - JS最適化: コンポーネントのオンデマンドインポート +
deferによる遅延読み込み - 画像最適化:
loading="lazy"+ WebP/AVIFフォーマット + 固定幅と高さ - ビルドプロセス:
sassコンパイル >purgecssでクリーンアップ > デプロイ - Lighthouseターゲット: FCP < 1.5s、LCP < 2.5s、CLS < 0.1
📝 練習問題
- ⭐ 既存のBootstrapプロジェクトでLighthouse監査を実行し、FCP、LCP、CLSの指標を記録してから、目標を達成するまで項目ごとに最適化してください。
- ⭐⭐ PurgeCSSを構成してください: Bootstrapを使用するHTMLファイルでPurgeCSSを実行し、パージ済みと未パージのCSSのサイズの違いを比較してください。
- ⭐⭐⭐ dev (watch)、build (sass + purge)、serveの3つのコマンドを含む完全な
package.jsonスクリプトを作成してください。
前のレッスン: ダークモード