#はじめに
「100KBのJavaScriptファイルを30KBに圧縮できます」——これだけでページの読み込みが大幅に速くなります。
HTTP圧縮は、サーバーからクライアントへのデータ転送量を削減する技術です。テキストベースのファイル(HTML、CSS、JavaScript、JSON)は特に効果が高く、60-80%のサイズ削減が期待できます。
この記事を読むと、以下のことができるようになります:
- HTTP圧縮の仕組みを理解できる
- gzipとBrotliの違いがわかる
- 圧縮が有効になっているか確認できる
#HTTP圧縮の仕組み
#基本フロー
[ブラウザ] [サーバー]
| |
|------ GET /app.js ---------------->|
| Accept-Encoding: gzip, br |
| "gzipかBrotliで圧縮してね" |
| |
| 元のサイズ: 100KB
| 圧縮後: 30KB
| |
|<----- 200 OK ----------------------|
| Content-Encoding: gzip |
| [圧縮されたデータ: 30KB] |
| |
↓ ブラウザが自動的に解凍
#ネゴシエーション
- クライアント:
Accept-Encodingヘッダーで対応する圧縮形式を通知 - サーバー: 対応可能な形式で圧縮し、
Content-Encodingヘッダーで通知 - クライアント:
Content-Encodingを見て解凍
#主要な圧縮形式
#gzip
最も広く使われている圧縮形式です。
Content-Encoding: gzip
- 対応: ほぼすべてのブラウザとサーバー
- 圧縮率: 良好(テキストで60-80%削減)
- 速度: 高速
#Brotli(br)
Googleが開発した新しい圧縮形式です。
Content-Encoding: br
- 対応: 主要な最新ブラウザ(IE除く)
- 圧縮率: gzipより10-25%優れる
- 速度: 圧縮は遅いが、解凍は高速
- 制限: HTTPSでのみ使用可能
#deflate
古い形式で、現在はほとんど使われません。
Content-Encoding: deflate
#圧縮効果の目安
| ファイルタイプ | 元のサイズ | 圧縮後(gzip) | 圧縮後(Brotli) |
|---|---|---|---|
| JavaScript | 100 KB | 30 KB | 25 KB |
| CSS | 50 KB | 10 KB | 8 KB |
| HTML | 30 KB | 8 KB | 6 KB |
| JSON | 200 KB | 40 KB | 32 KB |
圧縮が効果的なファイル:
- HTML、CSS、JavaScript
- JSON、XML
- SVG
- プレーンテキスト
圧縮が効果的でないファイル:
- JPEG、PNG、WebP(すでに圧縮済み)
- 動画ファイル
- ZIPファイル
#サーバー設定
#nginx
gzip on;
gzip_types text/plain text/css text/javascript application/javascript application/json image/svg+xml;
gzip_min_length 1000;
gzip_comp_level 6;
# Brotli(モジュールが必要)
brotli on;
brotli_types text/plain text/css text/javascript application/javascript application/json image/svg+xml;
brotli_comp_level 6;
#Apache
# .htaccess
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/css
AddOutputFilterByType DEFLATE text/javascript application/javascript
AddOutputFilterByType DEFLATE application/json
</IfModule>
#Express.js
const compression = require('compression');
app.use(compression());
#CDN設定
多くのCDNは自動的に圧縮を適用します。
- Cloudflare: デフォルトでgzipとBrotliを適用
- CloudFront: 設定で圧縮を有効化
- Vercel/Netlify: 自動的に最適な圧縮を適用
#事前圧縮
サーバーでリアルタイムに圧縮する代わりに、ビルド時に圧縮済みファイルを生成する方法です。
#メリット
- サーバーのCPU負荷を軽減
- 最大圧縮率を使用可能
#Viteでの設定
// vite.config.js
import viteCompression from 'vite-plugin-compression';
export default {
plugins: [
viteCompression({ algorithm: 'gzip' }),
viteCompression({ algorithm: 'brotliCompress' }),
],
};
出力:
app.js
app.js.gz
app.js.br
#nginx での配信
# 事前圧縮ファイルがあれば使用
gzip_static on;
brotli_static on;
#DevToolsでの確認
#圧縮の確認
- DevToolsのNetworkタブを開く
- 任意のリクエストをクリック
- Headersタブで確認:
Content-Encoding: gzipまたはbr
#サイズの確認
Networkタブの「Size」列を確認:
Size: 30 KB / 100 KB
^^^^ ^^^^^^^
転送サイズ 実際のサイズ
転送サイズが実際のサイズより小さければ、圧縮が効いています。
#Response Headers
Content-Encoding: gzip
Content-Length: 30000
Vary: Accept-Encoding
Vary: Accept-Encodingは、圧縮形式によってレスポンスが異なることを示します。キャッシュが正しく動作するために重要です。
#圧縮レベルの選択
圧縮レベルは、圧縮率と処理速度のトレードオフです。
#gzip(1-9)
| レベル | 圧縮率 | 速度 | 用途 |
|---|---|---|---|
| 1 | 低 | 非常に速い | リアルタイム圧縮、高トラフィック |
| 6 | 中 | バランス | 一般的な用途(推奨) |
| 9 | 高 | 遅い | 事前圧縮 |
#Brotli(0-11)
| レベル | 圧縮率 | 速度 | 用途 |
|---|---|---|---|
| 4 | 中 | 速い | リアルタイム圧縮 |
| 6 | 中高 | バランス | 一般的な用途 |
| 11 | 最高 | 非常に遅い | 事前圧縮のみ |
#ベストプラクティス
#1. 適切なファイルタイプのみ圧縮
gzip_types text/plain text/css text/javascript
application/javascript application/json
image/svg+xml application/xml;
画像や動画は圧縮しない(すでに圧縮済み)。
#2. 小さすぎるファイルは圧縮しない
gzip_min_length 1000; # 1KB未満は圧縮しない
小さいファイルは圧縮のオーバーヘッドが効果を上回ることがあります。
#3. Brotliを優先
ブラウザが対応していれば、Brotliを優先して使用。
#4. Varyヘッダーを設定
Vary: Accept-Encoding
キャッシュが圧縮形式ごとに正しく分離されます。
#まとめ
- HTTP圧縮はテキストファイルのサイズを60-80%削減
- gzip: 広くサポート、バランスが良い
- Brotli: 圧縮率が高い、HTTPS必須
- すでに圧縮されたファイル(画像、動画)は対象外
- リアルタイム圧縮は中程度のレベルで
- 事前圧縮で最高の圧縮率を実現
#次のステップ
圧縮を理解したところで、次は画像最適化について学びましょう。画像はWebページのデータ量の大部分を占めることが多く、適切な最適化で大幅なパフォーマンス改善が期待できます。