PageSpeed Insightsで高得点を出そう!
ということで、自作のWordPressテーマのレンダリングブロックを0にした方法をご紹介しています。
前回は「CSS編」ということで、外部CSSの非同期読み込みやインライン化について詳しくお話ししました。
今回は「JavaScript編」です。
簡単に非同期読み込みが可能
CSSと違い、JavaScriptのレンダリングブロック排除は簡単です。
それぞれの違いは割愛しますが、「async」と「defer」という属性のどちらかをファイルの読み込みで使えばあっという間にレンダリングブロックが0になります。
サンプルコード
こちらは内部で読み込まれるJSファイルにasync属性を付与するコードです。
add_filter('script_loader_tag',function( $tag ) {
return str_replace( ' src', ' async src', $tag );
}, 10, 2);
これでwp_enqueue_scriptsなどの関数を使って読み込んでいるファイルがすべて非同期で読み込まれるようになるのでレンダリングブロックがなくなります。
また、ファイルに直接コードを記述している場合も同様に<script async src="〜>
のようにするだけでOKです。
同期読み込みと非同期読み込みをわけるのがベスト
すべてのJSファイルを非同期で読み込んで対策完了…と言いたいところですが、実はこれはベストなやり方ではありません。
なぜなら、jQueryのライブラリなどは非同期で読み込むと上手く動作しないからです。
ではどうすればいいのかと言うと、同期的に読み込むファイルと非同期で読み込むファイルを別にすればOKです。
参考[WordPress] script要素にdefer/asyncを付与する方法
サンプルコード
こちらがサンプルコードです。
add_action( 'wp_enqueue_scripts', function() {
wp_deregister_script( 'jquery' ); //WordPress本体が読み込むjQueryを解除
wp_enqueue_script( 'jquery', '//ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js', [], false, true); //jQueryのライブラリをフッターで読み込む
wp_enqueue_script( 'highlight-js', '//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js', [], false, true); //highlight.jsをフッターで読み込み
});
add_filter('script_loader_tag',function( $tag, $handle ) {
if($handle=='jquery') return $tag; //jQueryライブラリは非同期で読み込まない
if($handle=='highlight-js') return $tag; //highligjt.jsは非同期で読み込まない
return str_replace( ' src', ' async src', $tag );
}, 10, 2);
コメントにて解説してますが、jQueryライブラリなどはフッターで同期的に読み込み、非同期処理のコードでそれらを除外しています。
こうすることでレンダリングをブロックせずに、なおかつ、正しく処理が行われます。
プラグインが読み込んでいるJavaScript対策
CSS編でも解説しましたが、プラグインが読み込むJavaScriptも対策が必要です。
詳細はCSS編の記事を読んでいただきたいですが、簡単に言うと、Contact Form7やDownload Managerなどの特定のページでしか使わないファイルがすべてのページで読み込まれているので、それを最適化しよう!ということです。
サンプルコード
こちらがサンプルコード。コメントを見ていただければやっていることがわかるかと思います。
add_action( 'wp_enqueue_scripts', function() {
if(!in_category('download') || is_archive()) { //ダウンロードカテゴリーに属する記事以外では読み込まない
wp_deregister_script( 'wpdm-bootstrap' );
wp_deregister_script( 'frontjs' );
wp_deregister_script( 'jquery-choosen' );
}
if(!is_page('contact')) { //お問い合わせページ以外では読み込まない
wp_deregister_script( 'contact-form-7' );
}
});
まとめ
レンダリングブロックリソースの排除はこれにて終了です。
- ブラウザキャッシュ
- 画像の圧縮
など、その他にもまだまだやれることはありますが、レンダリングブロックをなくすことがPageSpeed Insightsで高得点を獲得する近道なので、真っ先に対応してみてはいかがでしょうか。