クリティカルなんとかの関係やウェブ・フォントにおいて、CSSの遅延読み込みを行う気運は高まっている。様々なアイディアがあって、普通にCSSの内容を読み込んでhead
要素に追加するものや、link
要素を動的に追加するもの、予めlink
要素をrel=stylesheet
なしで書いておいて後で追加するものなどがその主なものだ。最後の手法ではrel=subresource
を追加して書いておくと、一部ブラウザーでダウンロードが速く始まるんじゃないかというアイディアを持った。
サポートが広いのでprefetch
かなと思ったけど、書いたそのページ内で使うリソースの先読みに使うものではないような印象で、すぐさま使う場合はsubresource
の方が適切なようだ。Chromeがそういうイメージで実装してるという話で、ウェブ標準では特に細かく規定はないようではある。
<html>
<head>
<style>
/* Critical Styles */
</style>
<link class="async-css" href="main.css" rel="subresource">
</head>
<body>
...
<script>
var css = document.querySelectorAll('.async-css');
for (var i = 0, l = css.length; i < l; i++) {
css[i].rel = 'stylesheet';
}
</script>
</body>
</html>
特に難しいことはない。rel=subresource
で即キャッシュに持ってきてくれるはずなので、ドキュメントのパース(レンダリングではない)と平行してダウンロードされることが期待できる。つまりbody
要素の最後やDOMContentLoaded
イベントでCSSを追加する場合よりも速くにダウンロードが開始されるのではないだろうか。
rel=stylesheet
に入れ替える時点でダウンロードが終わってない時にどうなるかは謎(下手をするとリクエストがやり直されたりしそう)なので、実際に使う時はちゃんと検証する必要がある。
遅延読み込みそのものは、その後襲うリペイントやリフローに比べればさほどコストの高いものでもないのでどうやっても良さそうだが、保守性が高そうなのはlink
要素を予め書いておく方法だと思う。その上で更に早期に読み込みを開始させるためにrel=subresource
を併用するのは悪くなさそうだ。