すぐできる！レガシーなサービスでサイトパフォーマンスを改善するためのTips集

サイトパフォーマンスを改善するためのTipsを紹介します。
実際に改善するかはサイトの状況によるので1つの手法として受け取っていただけたら幸いです。

:::note info
【こんな方にオススメ！】
・パフォーマンスを低下している原因がわからず打ち手がない…
・あまり工数がかけられないので、改善が滞っている…
:::

小さなことですが意外な改善効果が見込めるかもしれませんのでよろしければ一読ください！

## 画像の最適化
imgタグに属性を付与することでメインスレッドのブロックを抑えられます。

### loading="lazy"
画像がビューポートに達するまで画像の読み込みを遅延させます。
それによりレンダリングブロックを防ぐのでファーストビューに入らない画像には`loading="lazy"`を付与することでコンテンツのパフォーマンスを向上できます。

`loading="lazy"`の対応状況は下記の通りです。
対応状況からおおよそのブラウザには対応していますが、Safariには対応できてないので
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/090e6623-115b-b050-d48d-31931078ef10.png)

### decoding="async"
画像を非同期的に読み込みます。
非同期的に読み込みレンダリングブロックを防ぐことでパフォーマンスの向上が期待できます。

`decoding="async"`の対応状況は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/7cdccffd-fbee-218f-b17b-f92f3a9490bb.png)

現在のブラウザシェア(日本)は下記の通りでした。
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/3ae46587-12d6-b961-6b88-34d235a8f96b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/f12efa87-33d6-8d3d-ad37-651be297feae.png)
引用元サイト:[https://www.qbook.jp/column/20220720_1391.html](https://www.qbook.jp/column/20220720_1391.html)

どんなサイドでもモバイルユーザーの方が多いと仮定すると`decoding="async"`をつけておく方が無難な気がします。
ファーストビューはdecoding、それ以外はloadingをつける運用が良いと思いました！

:::note warn
decodingとloadingは併用することが可能です。
ただ、スクロールで対象画像の位置に達したとしてもdecodingが終わるまでは画像が表示されないことが発生するそうなので検討の必要はありそうです…。
:::

https://twitter.com/addyosmani/status/1115812423108153345?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1115812423108153345%7Ctwgr%5Ef0b6c3e8f021a67616166fa0ac1d00e72981a1ca%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fembed.zenn.studio%2Ftweetzenn-embedded__3fdb20c4edc97

### 画像をWebPにする
画像の圧縮はもちろんですが、最新のフォーマットであるWebP形式にすることです。
全てを一度に置き変えることは難しいと思いますが、メインのページからでも置き換えていくのも良いと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/33081b83-0a21-3bde-dbb0-df39978556ca.png)

## フォントの最適化
日本語も含まれるフォントファイルは意外にページパフォーマンスのネックになることがあります。
最小フォーマットを使用することやサブセット化することでファイルサイズを減らし読み込みの負担を減らせます。

### フォントファイルの最新フォーマットを使う
一番軽いとされるのが`woff2`でフォーマットされたファイルです。
IEに対応する必要がなければ`woff2`だけで十分なことがわかるのでもしそれ以外のフォーマットを読み込んでいるのであれば改善ポイントだと考えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/8af78bd2-f608-67c0-7b75-1c18d6f5fb19.png)

`@font-fase`を使ってフォントファイルの読み込みを指定します。
リスト内で始めに定義されたフォーマットを読み込むので記述の順番には注意して下さい。

```css
@font-face {
  font-family: 'hoge';
  src: url('hoge.woff2') format('woff2'),
    url('hoge.woff') format('woff');
  font-display: swap;
}
```

:::note alert
`font-display`が指定されていないとフォントのダウンロードしている間文字が表示されなくなってしまうので必ず指定してください。値はいくつかありますが`swap`の指定が無難だと考えています。
:::

font-displayの説明は下記の記事が分かりやすかったです。

https://laboradian.com/show-text-immediately-using-font-display/

### フォントのサブセット化
フォントのサブセット化とは、必要な分だけを分離して小さいファイルにして先に読み込むことを言います。
フォントをサブセットするには下記のwebサービスを利用するのが良いと思います。

https://everythingfonts.com/subsetter

:::note info
日本語の場合は考慮すべきことが多いので効果のほどはやってみないとわかりませんが、パフォーマンス改善の手立ての1つとして検討されても良いと考えます。
:::

## CSSやJavaScriptへの対策
レガシーなサイトではCSSやJavaScriptはサイトパフォーマンスの悪化の原因になることが多いです。
肥大がしたCSSやJavaScriptへの対策のヒントにしていただければと思います。

### CSSの分割読み込み
いわゆる「CriticalCSS」と言われる対策です。
必要なCSSを先に読み込んで、それ以外は後で読み込むことでレンダリングブロックを防ぎます。

やり方はいろいろありますが、一般的なものはファーストビューのCSSを抽出して`<style>`タグで`<head>`の中に記載する方法です。

npmやwebサービス、gulpでも抽出可能です。
状況にあった方法で実施していただければと思います。

:::note alert
時間がかかってもnpmやgulpなどで変更に応じて自動で抽出する仕組みを作ることをオススメします。
自力で抽出して貼り付ける運用は必ず忘れますし、そうなると表示が一瞬くずれてしまうのでCLSの原因になります。
:::

とはいえ自動抽出をレガシーな環境で実現させるのには難しいと思うので、一番簡単なのはwebpackやgulpでファースビューに必要なCSSだけをコンパイルしてhead内で読み込みそれ以外をbodyの閉じタグ付近で読み込ませるのが手軽です。

:::note info
元のCSSファイルサイズが大きい場合はこれでも十分に効果が出るので試してみてください！
:::

#### scriptタグにdefer属性の付与
サイトの状況にもよりますが、defer属性をつけるのがベターではないかと考えています。
設定の説明は下記の記事が非常にわかりやすいかったです。

https://qiita.com/phanect/items/82c85ea4b8f9c373d684

実際試したところbodyの閉じタグ付近で読み込んでいたのですが、さらにタイミングを遅らせられました。

:::note alert
処理の実行が遅れるので、ファーストビューでJSの処理が必要になる場合は考慮が必要です…。
:::

## まとめ
まだやっていないことがいくつかあったなら幸いです。
恥ずかしながら画像については盲目的に`lazyload`やっとけばとりあえずいいでしょ！って思っていたので盲点でした…。

画像の多いページであればそれほど工数がかからず一定の効果がでると考えています。

レガシーなサイトでは肥大化したCSSやJSに注目しがちですが、フォントや画像も意外に侮れないです。

:::note info
小さいかもしれませんが積み重ねることで今より10点以上は改善できるのではないかと思います。
:::

一度試してみてください！