Tailwind 使うのやめた

いまだに CSS の高速化の最適解がわからない

Published: Updated: 読むのに約 3 分Sources for LLMs: Typst | Markdown

ブログで Tailwind CSS を使うのをやめました

なぜ?

FCP, LCP を改善したかった

従来のブログでは /assets/build/tailwind.css から minify された Tailwind CSS 全体を読み込んでいましたが、これが FCP (First Contentful Paint)LCP (Largest Contentful Paint) のスコアを悪化させている可能性がありました。

ファーストビューに必要な CSS だけをブロッキングで読み込んで、それ以外の CSS は遅延読み込みすることで、FCP や LCP のスコアを改善できると考えたために、どうにかして Tailwind CSS を分割できないかと考えました。

それよりかは、Tailwind CSS を使わずに、必要なスタイルだけを手書きで書く方が効果的だと判断しました。

ビルドプロセスに npm が入ってくる問題

Tailwind CSS に現状 Rust 製の代替がないため、Tailwind CSS を使う場合はビルドプロセスに npm や Node.js が入ってきてしまいます。
ブログの他の部分は Rust と Typst で完結しているため、ビルドプロセスに npm や Node.js が入ってくるのは避けたかったです。

今も結局 esbuild を JavaScript の minify に使ってしまっているのでビルドプロセスに npm が入ってくるのは避けられていないけど。

やったこと

/assets/css/critical.css にファーストビューに必要なスタイルだけを書き、その他のスタイルは /assets/css/lazy.css に置きました。

/static/css/critical.css は HTML の <head> 内でブロッキングで読み込み、/static/css/lazy.cssmedia="print"data-unblock-css=1 を指定し最初は適用されないようにし、

const links=[...document.querySelectorAll('link[data-unblock-css="1"]')];
links.forEach(l => {
const enable= () => { l.media='all'; };
l.addEventListener('load', enable, { once:true });
requestAnimationFrame(() => { if (l.sheet) enable(); });
});

を実行して遅延読み込みするようにしました。

効果

Lighthouse で FCP と LCP のスコアが改善した…はず。実行前のスコアを忘れたのでわからない。