タスクランナーを使わないお手軽なCSSとJavaScriptの最小化(minify)


意外と効くCSSとJavaScriptのminify

CSSとJavaScriptの最小化(minify)は、データの削減量としては地味ですがPageSpeed Insightsのスコア改善に意外と効果があります。これはPageSpeed Insightsのスコアがレンダリングブロックの時間に敏感だからです(もちろん保証はありません!)。

PageSpeed Insightsの点数はどのように計算されているか。100点をとるための条件
https://qiita.com/miyanaga/items/d38124cdd64a1999fed9

minifyはタスクランナーやフレームワークのアセットパイプラインで自動化するのが常套手段ですが、複数のメンバーで運用中のサイトに後から導入するのは一苦労です。

そこでVisual Studio Codeの機能拡張と、.htaccessファイルで稼働中のサイトに途中からCSSとJavaScriptのminifyを開始する方法を紹介します。

JS & CSS Minifier 拡張機能

Visual Studio Codeに次の拡張機能をインストールします。

JS & CSS Minifier
https://marketplace.visualstudio.com/items?itemName=olback.es6-css-minify

ワークスペースの設定にes6-css-minify.minifyOnSaveを追加します。

{
  "folders": [
    { "path": "." }
  ],
  "settings": {
    "es6-css-minify.minifyOnSave": "yes"
  }
}

これで任意の.cssファイルまたは.jsファイルを保存すると、その瞬間にminifyされた.min.css.min.jsが作成されるようになります。

  • 例: sample.cssを保存 → minifyされたsample.min.cssがとなりに自動作成されます。

既存の.cssファイルや.jsファイルを一括でminifyする機能拡張を探したのですが、見当たりませんでした(もしあったら教えてください!)。

minifyされたファイルがあれば優先する.htaccessファイル

HTML側の参照を.min.css.min.jsファイルに変更するところですが、ここでは.htaccessでRewriteモジュールを設定して振り分けをしてみます。

DocumentRootの.htaccessファイルに次の記述を行います。

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}/$1.min.$2 -f
RewriteRule ^([^.]+)\.(css|js)$ $1.min.$2 [L,NC]

これでブラウザからsample.csssample.jsが参照されたとき、もしsample.min.csssample.min.jsがあればApacheは実際にはそれらを返すようになります。

「HTML側を変えた方が早い!」という場合はもちろんそれでも。
個人的には.min.css.min.jsを消せば元に戻して検証しやすい点が気に入っています。

DocumentRoot以外に.htaccessを記述する場合

もし、.css.jsファイルが/assets/以下にしか存在しないのであれば、/assets/.htaccessファイルとして次の記述を行うと効率がよいです。

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}/assets/$1.min.$2 -f
RewriteRule ^([^.]+)\.(css|js)$ /assets/$1.min.$2 [L,NC]

2箇所で/assets/を補う必要があるので注意してください。 RewriteCondでファイルの有無を確認する都合上、RewriteBaseがうまく使えません。

バンドリング(1ファイルへの結合)とPageSpeed Insightsのスコア

タスクランナーやアセットパイプラインでは、CSSやJavaScriptの最小化と同時に各々を1ファイルにまとめてくれます。

これはリクエスト数を減らして無駄なオーバーヘッドを削減する措置ですが、経験上、適度にファイルが分割されている方が並列ダウンロードによりPageSpeed Insightsのスコアが上がります。HTTP/2も一般的になってきてますし。

ここで紹介した方法では1ファイルへの結合は行われませんが、その意味で効果を期待できます。ぜひ試してみてください。