どんなことができるなったかというと、こんな感じの HTML を、
<html>
<head>
<link class="drop-inline-css" rel="stylesheet" href="inefficient.css"></link>
<link class="inline-css" rel="stylesheet" href="efficient.css"></link>
<link rel="stylesheet" href="keep.css"></link>
</head>
<body>
<p>styled</p>
</body>
</html>
こんな感じに inline 化します。drop-inline-css クラスは HTML 構造を見ながら不要な CSS を drop するように最適化し、inline-css クラスはそのままインライン化し、keep.css には適用しないようにしました。
<html>
<head>
<style>p { text-decoration: underline; }</style>
<style>pre { color: red; }</style>
<link rel="stylesheet" href="keep.css"></link>
</head>
<body>
<p>styled</p>
</body>
</html>
なぜこのような実装を入れたか。
CSS は最適化を考えた時、最適化の可能性は大まかに 3種類に分けられます。
- 静的な HTML から要不要が判断できる CSS
- 動的な HTML ではあるものの事前記述で要不要が判断できる CSS
- JavaScript をよく見ないと要不要が判断しにくかったり設定が面倒な CSS
- Bootstarp の CSS だけで動く大部分のコード
- Bootstrap の JavaScript が必要なコンポーネント
- autocompletr や simple-keyboard などのライブラリ
また上記 2-3 の CSS は遅延ロードが可能で、その最適化は 3種類に分けられます。
- <link rel="stylesheet" href="base.css" media="print" onload="this.media='all';this.onload=null;">
- template タグ内で style を load
- template タグ内で link タグを load
こうして考えてみると、CSS の最適化には (1) drop-inline-css する、(2) drop-inline-css した上で遅延ロード1する、 (3) inline 化する、(4) 何もしないの 3つが考えられ、それらを選択できる必要があります。 これまで drop-inline-css では 1,2 ばかり考えていたのですが、 2 は実装がやや面倒なので deprecated でも良さそうで、 代わりに 3,4 ができると嬉しいなと思って実装してみました。
具体的には link タグに drop-inline-css クラスがある時には drop-inline-css し、 inline-css クラスがある時には平凡にインライン化し、何もないときは何もしないようにしました。 この改良によっていくつかのアプリの実装がかなりシンプルになるとわかりました。 破壊的変更で更新が大変でしたが…。
0 件のコメント:
コメントを投稿