Let's be more curious.

JavaScriptやCSSを遅延ロードする方法

JavaScriptやCSSを遅延ロードする方法

はじめに

defer.jsで外部のJavaScriptやCSSの遅延読み込みが出来たので、忘れないように備忘録としてまとめてみました。

defer.jsについて興味がある方は参考にご覧下さい。


defer.jsとは

defer.jsはShin氏が2019年3月にリリースしたJavaScript、CSS、画像、iframeを遅延読み込みするためのライブラリです。


defer.min.jsは超小型でサイズは1.81kB、現在の最新バージョンはv3.7.0です。

CDNで外部ファイルを読み込んでも良いし、JetThemeのようにインライン化して使用します。


defer.jsに関する解説や使用方法は下記記事をご覧下さい。


wenyanetの記事


GithubのREADME.md


アタルさんのDefer.js翻訳記事



リモさんのDefer.js使用方法記事


【Defer.js】SNS の埋め込み数が多い場合の対応方法 | リモスキ

【Defer.js】SNS の埋め込み数が多い場合の対応方法 | リモスキ

Twitter・Instagram の埋め込み数が多い場合に適した Defer.js の適用方法を紹介します。


上記記事を読んでもピンと来ない方は、このブログに組み込んでいるコードを後半に入れておいたので参考に見て下さい。


なぜdefer.jsを使用するのか

画像の遅延読み込みは loading="lazy"のクラスを追加することで、ブラウザでネイティブの遅延ロードができます。

また、JavaScriptで画像を遅延ロードする場合はclass="lazylode"等の追加で実施出来ます。

下記記事で少し解説しているので、興味のある方は参考に見て下さい。




一方、「AdScence」「YouTube」「Twitter」「ShareThis」等のコンテンツは表示前にJavaScriptが外部より読み込まれますが、それなりのファイルサイズなので、ページスピードを大きく低下させる原因になります。

ファーストビューに「AdScence」「Twitter」「YouTube」がないなら、重たいJavaScriptを呼び込まない工夫が必要です。

その為、管理人はJetThemeを使う迄は、zukooさんやq-Azさんが公開されている記事を参考に、JavaScriptの遅延読み込みをブログに埋め込んでました。

zukoo

pagespeedinsightsで『レンダリングを妨げるリソースの除外』する #1

pagespeedinsightsで『レンダリングを妨げるリソースの除外』する #1

京都市のホームページ制作会社です。お客様自身で簡単に更新できるホームページを制作いたします。 サイト公開後の運用サポートもお任せください。お見積もりは無料です、お気軽にご相談ください。


q-Az

JavaScriptファイルをスクロール発火で遅延読み込みさせる方法 | q-Az

JavaScriptファイルをスクロール発火で遅延読み込みさせる方法 | q-Az

JavaScriptのファイル自体を遅延読み込みする方法は色々ありますが、マウスのスクロールに反応してファイルを遅延読み込みさせる方法です。スクロールされることでファイル自体が初めて読み込まれるためファーストビューでそのJavaScriptコードは実行されません。結果としてファーストビューでの速度改



上記方法はイベント実行のタイミングでJavaScriptを遅延読み込みするもので、スクロールやクリックをトリガーに発火し遅延ロードするものです。

q-Azさんのコードが一番小さいので、</body>の前に入れて使ってました。

今まで使っていたコードを参考に載せておきます。

コード
<script>
//<![CDATA[ 
function lazyLoadScript(scriptSrc) {

    var scrollFirstTime = 1;

    //スクロールorマウスクリックor画面タッチで発火
    window.addEventListener("scroll", oneTimeFunction, false);
    //window.addEventListener("mousedown", oneTimeFunction, false);
    //window.addEventListener("touchstart", oneTimeFunction, false);
    //window.addEventListener("mousemove", oneTimeFunction, false);

    function oneTimeFunction() {
        if (scrollFirstTime === 1) {

            scrollFirstTime = 0;
            var adScript = document.createElement("script");
            adScript.src = scriptSrc;

            document.body.appendChild(adScript);
            window.removeEventListener("scroll", oneTimeFunction, false);
            //window.removeEventListener("mousedown", oneTimeFunction, false);
            //window.removeEventListener("touchstart", oneTimeFunction, false);
            //window.removeEventListener("mousemove", oneTimeFunction, false);

        }
    }
}

//遅延読み込みするjavascript
lazyLoadScript("https://platform-api.sharethis.com/js/sharethis.js#property=xxxx&product=inline-reaction-buttons");
lazyLoadScript("https://xxxx/prism121.js");
lazyLoadScript("https://platform.twitter.com/widgets.js");
//]]>
</script>


JavaScriptの遅延読み込みは上記コードで十分なのですが、スクロールイベントで一気に読み込みが発生することと、CSSの遅延読み込みには未対応なのが不満でした。


JetThemeはdefer.jsを使って「AdSecnce」「YouTube」を遅延読み込みしてますが、よく調べてみるとDOMの実行に合わせてJavaScriptやCSSを遅延読み込みできることが分かりました。

こんな便利なライブラリは使わないと損なので、さっそくJetThemeに組み込んでみました。


defer.jsで遅延読み込みさせるコード

管理人が遅延読み込みしたいと思ったコードは7つです。

・X(旧Twitter)のJavaScript

・ShareThisのJavaScript

・prismのJavaScriptとCSS

・font-awesomeのCSS

・CodepenのJavaScript

・広告ブロックによる損失収益の回復タグのJavaScript

Embed BlueskyのJavaScript


参考にブログに組み込んでいるコードを載せておきます。

JetThemeをお使いの方はfunction jtCallback(){下の/*Your Script is here to maintain performance.*/以降にコードを置いて下さい。

なお、構文はGithubのREAD.meに詳しく書かれているので熟読下さい。

コード
/*Your Script is here to maintain performance.*/

//Defer.jsで遅延読込みさせる外部参照ファイル
var deferUrl1 = 'https://platform.twitter.com/widgets.js';
var deferUrl2 = 'https://platform-api.sharethis.com/js/sharethis.js#property=5f4aad10ec6f5100126117d9&product=inline-reaction-buttons';
var deferUrl3 = 'https://code.heavy-peat.com/prism121.js';
var deferUrl4 = 'https://code.heavy-peat.com/prismJS118.css';
var deferUrl5 = 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css';
var deferUrl6 = 'https://cpwebassets.codepen.io/assets/embed/ei.js';
var deferUrl7 = 'https://fundingchoicesmessages.google.com/i/pub-5860764237864409?ers=1';
var deferUrl8 = 'https://assets.bluesky.lol/js/b1.js';

//遅延表示させるクラス
const selector1 = 'lazy-twitter-tweet'; // 遅延読み込みさせるダミーのクラス
const selector2 = 'lazy-twitter-timeline'; // 遅延読み込みさせるダミーのクラス
const selector3 = 'sharethis-inline-reaction-buttons';
const selector4 = 'twitter-tweet';
const selector5 = 'twitter-timeline';
const selector6 = 'lbluesky-widget';

const embed1 = document.getElementsByClassName(selector1);
const embed2 = document.getElementsByClassName(selector2);
const embed3 = document.getElementsByClassName(selector3);
const embed4 = document.querySelectorAll('[class*="language-"]');
const embed5 = document.getElementsByClassName('fas');
const embed6 = document.getElementsByClassName('codepen');
const embed7 = document.getElementsByClassName(selector6);

try {
    //TwitterのJavaScriptとDomの遅延読込み
    if (embed1.length !== 0 || embed2.length !== 0) {
        Defer.js(deferUrl1, 'widgets-js', 1000, function() {
            Defer.dom('.lazy-twitter-tweet, .lazy-twitter-timeline', 200, null, function(node) {
                if (node.className === 'lazy-twitter-tweet') {
                    node.className = 'twitter-tweet tw-align-center'; // 遅延読み込みさせるオリジナルのクラスに置き換える
                } else {
                    node.className = 'twitter-timeline'; // 遅延読み込みさせるオリジナルのクラスに置き換える
                }
                twttr.widgets.load(node.parentNode);
            }, { rootMargin: "200%" });
        });
    }
    //sharethisのJavaScriptの遅延読込み
    if (embed3.length !== 0) {
        Defer.js(deferUrl2, 'sharethis-js', 1000);
    }
    //prismのJavaScriptとcssの遅延読込み
    if (embed4.length !== 0) {
        Defer.js(deferUrl3, 'prism-js', 1000, function() {
            Defer.dom('pre code', 200, 'scroll-loaded-prism', Prism.highlightElement, { rootMargin: "120%" });
        }, true);
        Defer.css(deferUrl4, 'prism-css', 1000);
    }
    //font-awesomeのcssを遅延読込み
    if (embed5.length !== 0) {
        Defer.css(deferUrl5, 'font-awesome-css', 1000);
    }
    //CodepenのJavaScriptの遅延読込み
    if (embed6.length !== 0) {
        Defer.js(deferUrl6, 'codepen-js', 1000);
    }
    //広告ブロックによる損失収益の回復タグのJavaScript遅延読込み
    Defer.js(deferUrl7, 'ad-blocker-js', 1000);
    //BlueSkyのJavaScriptとDomの遅延読込み
    if (embed7.length !== 0) {
        function createWidget(node) {
            var id = node.getAttribute('id');
            Defer.js(deferUrl8, {
                'data-handle': id.replace(/-[^-]+$/, ''),
                'data-skeet': id.replace(/^.*-/, '')
            });
        }
        Defer.dom('.bluesky-widget', 0, 'shown', createWidget, {
            rootMargin: "120%"
        });
    }
} catch (error) { console.log(error) }


2023年2月21日 追記

当ブログに埋め込んでいる[email protected]はアタルさんがカスタマイズされたものを使用しておりDefer.dom2で設定してます。



まとめ

今まではページで使ってないJavaScriptやCSSを無駄に読み込んでましたが、要素が表示されるタイミングでコードを読み込むので、大変エコな方法だと思います。

JavaScriptやCSSを遅延読み込みする方法としては、とても簡単なのでオススメです。


気軽に足跡残してね!

この記事が「気になった・参考になった」と感じた方は、リアクションボタンか、ツイッターで♡いいねを押して、足跡を残して頂けると嬉しいです。

https://t.co/kmpFNGDO5h

ブログでのJavaScriptやCSSの遅延読み込みは、defer.jsを使用する方法に変更しました。

とても便利なので、JetThemeユーザはオススメしまーす。#Blogger #JetTheme #JavaScript #CSS #遅延読み込み

— heavy-peat (@AfterWork_Lab) February 13, 2022

それでは今回の記事はこれでおしまい。

Next Post Previous Post
6 Comments
  • りも
    りも 5/30/2022

    defer.js 今さらながら導入してみたら、すごく良かったです!
    ご紹介ありがとうございます。

    • あトん
      あトん 6/02/2022

      りもさん、コメントありがとうございます。
      defer.jsはとても素晴らしいのに利用者が少なくもったいなー、と思ってました。
      defer.jsを作られたShinさんが一番喜んでいるのでは、と思ってます。

  • Ruu
    Ruu 6/24/2022

    あトんさんのprism.jsの遅延読み込みコードを使わせて頂きました。
    とても助かりました。ありがとうございます。

    • あトん
      あトん 6/26/2022

      お役に立てて良かったです。

  • アタル
    アタル 2/25/2023

    Defer.dom2() の宣伝、ありがとうございます‼️

    たぶん、JetTheme 対応後のJS Defer.dom() で4つめの引数を null にしても動作するかと思いますが、(Defer.js v3.4.0 時点では変更されていた) Shin さんオリジナルコードが『Defer.dom2()』となります。

    ドキュメント通りに利用できますし、不具合があるといけないので…

    • あトん
      あトん 2/27/2023

      アタルさん、コメントありがとうございます。Defer.dom() の使い方は、少し理解が進んだので、もっと活用できたらと思ってます。

Please Enter Comments in Light mode
comment url