GulpにてCritical CSSを生成し、PHPで<head>内に出力する簡素な方法
ページの描画速度を上げる1つの手段として、<head>
内にCSSを直接記述する方法があります。俗に言うCritical CSS(クリティカルレンダリングパスの最適化)です。
クリティカルレンダリングパスとはブラウザがレンダリングする際のペイントを実行するまでの多くのステップの事を指しますが、外部CSS等は読み込みまでの間レンダリングを阻害する為、その後のペインティング作業が遅れてしまいます。
これを解決する為に、外部CSSではなく直接<head>
内にファーストビュー分のCSSを記述し描画速度を高め、残りは外部CSSより読み込むといった最適化を行うわけです。
勿論外部CSSのSizeやネットワーク環境、サーバー環境にもよるので一概に外部CSS is 悪とはなりません。
ただしページの描画速度を高める必要性がある場合にはCritical CSSの効果はある程度期待ができます。
Gulp環境でCritical CSSを生成する
まずCritical CSSを生成するにはファーストビュー分のCSSが必要になります。
外部サービス等を利用して毎度コピペする方法もありますが、Gulp環境で構築している場合は自動化してしまうと楽です。
プラグインは様々な物がありますが、今回はgulp-penthouseを利用する方法です。以下のステップを踏みます。
- gulp環境で通常通りscssをcssにコンパイルする
- コンパイルされたcssを元に
gulp-penthouse
でファーストビュー分のcssを生成。この時background-image
の様にcssで外部ファイルを読み込む場合はURLを置換してあげる。 - 対象のphpファイルにて
file_get_contents
で読み込む
インストール
まずはgulp-penthouseをインストールします。background-image
の様にCSSで外部ファイルを読み込む場合は置換用プラグインもインストールしておきます。(必要な場合)
gulpfileよりタスクを追加していきます。既にgulpやgulp-sass等主要プラグインは読み込んでいるものとします。
後は通常通りのタスクでgulpを実行し、scssファイルを更新するとCritical CSSを生成することが出来ます。
上記gulpfile.jsではscssファイルの更新時にタスクが走りますが、Critical CSSの生成には若干時間が掛かる為ある程度の規模の案件であれば別タスクにしてしまうといいでしょう。
Critical CSSを埋め込む
後は生成されたCritical CSSを<head>
に埋め込んであげるだけです。file_get_contents
等で直接埋め込んでしまうといいでしょう。
残りのCSSは</body>
付近に移動
<head>
内に外部ファイルのcssが存在したままだとレンダリングブロックが発生してしまうので、</body>
付近まで移動します。
同時にjs等も<head>
内にあるとレンダリングブロックの原因に繋がる為、同じく</body>
付近まで移動してあげます。
以上がCritical CSSを生成し、実際に<head>
内に出力する簡素な方法でした。
上記例以外にもCritical CSSを用いたクリティカルレンダリングパスの最適化の方法は幾つかあります。案件に合わせて適切な方法を採用していくといいでしょう。
ただしCritical CSSで出力したCSSの量が物凄く多くては今度は読み込みスピードにも影響してきます。必ずしもCritical CSSがページ描画速度を上げるベストプラクティスでは無い点には注意しておきたいです。