はじめに
みなさま、 JavaScript コードの呼び出しはどうしていますか?
以下のように async
属性や defer
属性を付けることによって、 JavaScript によるパーサーブロッキングを防ぐことが出来ます。
大体の JavaScript コードを呼び出す際はこれで良いのですが、一部例外があります。
その一つが Web Components におけるCustom Elementsの定義時です。
Custom Elementsの定義時に注意すること
Custom Elementsの定義時とは、つまり customElements.define()
のことです。
https://developer.mozilla.org/ja/docs/Web/API/CustomElementRegistry/define
例えばシンプルな Web Components のコードを /js/app.js
に書いたとします。
これを踏まえて以下のことに気を付けましょう。理由は後述します。
asyncまたはdeferでコードを呼び出さない
前述した通りです。
Custom Elementsを使うコードより前に定義する
Custom Elementsを使う前に、Custom Elementsを定義しましょう。
基本的には <head>
内に書いておけば問題ありません。
イベントを使って呼び出さない
何かの癖で、DOMContentLoadedリスナー内に書かないようにしましょう。
jQueryについても同じです。
パーサーブロッキングさせる理由
理由は簡単です。
Web Components が呼び出された際に、 Layout Shift
と判定される可能性があるからです。 結果的にCore Web Vitalsの Cumulative Layout Shift (CLS)が悪くなってしまいます。
💡
上記の注意事項を守らなくても、ブラウザの処理順の関係によって`Layout Shift`と判定されない事もあります。
推奨する管理方法
パーサーブロッキングが必要な JavaScript コードは、他のコードとは別ファイルにしましょう。
コードが短い場合では、インライン化してしまうのもアリです。
まとめ
Core Web Vitalsの中でも、特にCLSはサーバーの処理性能が絡みにくいところです。そのため対策は楽な方だと思います。
常に Layout Shift
が起きないように、注意深くコーディングしていきましょう。