![今のところinput[type=”number”]を使わない方が良い理由と代替案 アイキャッチ](https://www.fourier.jp/storage/blog/post-outline/jLh85zUW8RaWiVlX9MATwpSprFDEYZw5.jpg)
⚠️ この機能は今後変わる可能性があり、2023/11/09現在の状況で実験して書いた物です。
はじめに
以前、JavaScript呼び出し時のasyncにていての記事を書きました。
要約すると、JavaScriptのコードの内容によっては、deferやasyncで読み込むとFOUC(ちらつき)が発生してしまうことがあるという内容になります。
特に React や Vue.js を使ったサイトでは、ローディング画面を作って FOUC を防止することが多いと思いますが、閲覧者にとっては(ブラウザの)ローディングした後にローディングとなってしまいます。
なんとかする方法は無いかと Chrome の開発ブログを見ていましたが、ついに出ました!
FOUCへの救世主 blocking=”render”
Feature proposal: `blocking="render"` attribute on <link>, <script> and <style> · Issue #7131 · whatwg/html
(Edit: The syntax is changed into blocking="render" for extensibility. ) (Please refer to the full proposal for formal details and more discussion) Explainer All current browsers already have a ren...
https://github.com/whatwg/html/issues/7131
<script async blocking="render" src="async-script.js"></script>
blocking=”render”
を付けることにより、レンダリングの開始前に評価されます。
今まではレンダリングされた後に評価・実行されてしまっていたのでFOUCが発生していましたが、これで防ぐことが出来ます!
軽く実験
以下のようなJavaScriptを書いたとします。
'use strict';
{
 const root = document.getElementById('root');
 const div = document.createElement('div');
 div.style.paddingBlock = '1000px';
 root.appendChild(div);
}
同じコードをheadタグ内から様々な方法で読み込んでみます。
-
同期的に読み込みます。
<script src="/js/app.js"></script>
-
deferで読み込みます。
<script defer src="/js/app.js"></script>
-
asyncで読み込みます。
<script async src="/js/app.js"></script>
-
2.にblocking=”render”を付けて読み込みます。
<script defer blocking="render" src="/js/app.js"></script>
Performance InsightsでCumulative Layout Shift (CLS)の値を図ってみると、以下のような結果になりました。
レンダリング方法 | Cumulative Layout Shift (CLS) |
同期的に読み込む | 0.436 |
deferで読み込む | 0.436 |
asyncで読み込む | 0.436 |
blocking=”render”を付けて読み込む | 0 |
濫用に注意
blocking=”render”
を使えばレンダリングブロックを意図的に行える事が分かりました。
ただし、レンダリングが遅くなるため、UXやSEO的には弱くなります。
そのため blocking=”render”
が必要なリソースかどうか見極める必要があります。
まとめ
blocking=”render”
が使えるようになれば、簡単にFOUCを防ぐ事が出来ます。
執筆時では対応しているブラウザが少ないですが、非常に便利な機能なので対応ブラウザが増えて欲しいところです。