とあるサイトを例にした PSI改善フロー

# LCPパーツを把握しましょう
https://pagespeed.web.dev/analysis/https-kekkon-kuraveil-jp-ranking/kthygq6q5j?form_factor=mobile

PSI計測ツールにまず、LCPパーツがどれなのかが記載されているのでこれを把握しましょう
PSIスコアを上げる＝LCPパーツの読み込みを最速で行うことなので
LCPパーツが把握できて居ないと何をすればいいのかもわかりません。

そして多くの場合LCPパーツは画像だったりするので、画像の読み込み最適化が必要になってきたりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/7d7b4624-052f-1acc-c5ea-0e12ff32b94c.png)

### サイト内ですとこのパーツですね、これを最速で読み込みましょう
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/f456c644-7c8a-5a89-1357-275c7b550bd9.png' width=300px>


## 現状のレンダリング順を知ろう
現状どのような順序でレンダリングされているかを把握しましょう。
Chromeのパフォーマンス分析タグでネットワーク速度を低速回線にするとわかりやすいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/7668b8c0-dc67-501e-8fdf-e75fe240cd0b.png)

また、下の追加ボタンを押して、PageSpeedInsightsのBOTと同等の読み込み速度を実現することも可能です。
GoogleのBOTさんは 上下 1.6Mbit/s　での通信を行なっているようですので
私は以下のように設定して居ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/50c3fe4d-cfaa-acc1-ce0f-6a265459cf6e.png)


その状態でページの読み込みを開始しましょう

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/9fcce027-91ee-cf5c-ab6b-028734431005.png
' width=200px>

# 現状のページがどのような順序で読み込まれているかを把握しよう
右のInsightsタブでは、PSIのBOTがどのタイミングでFCPと判断し
どのタイミングがLCPだったのかというのを表して居ます。

画面左下のタイムライン情報を横にスクロールすると
どの時点でどのようなパーツがレンダリングされたのかを把握することができます。
FCPやLCPにカーソルを合わせると、そのタイミングの時間軸の線が現れます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/97b250de-8ce9-d3a3-ca98-394bae383a0d.png)

## 現状のレンダリング順
* FCP
    * メインコンテンツ
    * フッターオーバーレイメニュー
* 2番目
    * ハンバーガーメニューレンダリング（レイアウトシフトも発生）
    * ハンバーガーメニューの中の画像
    * TOPへ戻るボタンの画像
* 3番目
    * フッターメニューの画像
    * メインコンテンツの画像ロード開始
    * LCPパーツの読み込み開始
    * 就活支援金ロゴの読み込み開始
* 4番目
    * ヘッダーサイトロゴ
    * パンクズ下の赤いライン画像
* 5番目
    * LCPパーツのレンダリング開始
* 6番目
    * 就活支援金レンダリング完了
    * LCPパーツのレンダリング完了

<div style='width:100%'>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/4dd82ae6-cb6b-cb87-a9cf-99e4e1676d3d.png' width=200px>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/eac1db1b-6a56-e5eb-2aa1-01c543dbe034.png' width=200px>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/35406052-af81-ce76-ef81-872ce445c2a1.png' width=200px>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/1ac969b4-02ff-d422-ad90-b34f4a41a5a5.png' width=200px>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/946281a9-04c6-8919-7ee3-a78c6a81531d.png' width=200px>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/363c3164-e3aa-3004-3fd1-16e4e4f6594a.png' width=200px>
</div>

# 理想のレンダリング順（ゴール）

* FCPでLCPパーツがレンダリングされていること

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/2a50193a-6d35-6094-30ad-2a2c8a280b15.png' width=200px>

* FCP
    * LCPコンテンツの preload を実施
    * LCPコンテンツのレンダリング完了
    * メインコンテンツレンダリング完了
* 2番目以降
    * スコアの計測は終わっているので、もう好きにして良い

# そのために何をするのかを考えるのがPSI改善
LCPレンダリングまでにかかっている課題に関しては
最初のパフォーマンス分析情報のタブで確認できます。

LCPの前にある処理の中で、後回しにしても良い処理は全て後回しにしましょう。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/814eec63-826b-bcc7-3e53-e80c4bf9b6e9.png' width=300px>


## まずは。FCPの段階で不要なパーツを読み込まないようにしましょう
先ほどのレンダリング順をもう少し細かく分解して、無駄をなくしていこう。

## レンダリングを後回しにできる要素
HTMLの構造としても複雑でCSSのレンダリングにも結構コストがかかるため
こういった初期のページ表示に不要なパーツを読み込まないようにしましょう。

無理矢理かもしれませんが fotter タグ以降に書いてしまって
読み込みを可能な限り遅らせましょう、DOM Content Loadedが出てから
非同期で読み込んでも良いコンテンツかもしれませんね。

* ハンバーガーメニュー
* フッターオーバーレイメニュー

## LCPパーツが画像の場合は読み込み方にも気をつけよう

現状読み込みは以下のようなタグで行なっている

* LCP画像に lazyload　付与しないようにしましょう
* 画像は webp　形式で 50kb 以下に目視で正しく圧縮しましょう
* 画像の preload 対応を行う

実際は 20 kb でしたが、lazyloadがついてしまっているのでレンダリングが後回しにされてます。
最優先でレンダリングされるように lazyload はつけないようにしましょう。

```html: LCPパーツの読み込み方（タグは一部省略）
<img class="main-img lazyloaded" 
　　　　　　　　　　data-src="/images/ranking/main.webp" 
    　　alt="結婚相談所大手13社の料金、成婚率、会員数を徹底比較" 
    　　width="2918" height="1943" 
    　　src="/images/ranking/main.webp"
>
```

また画像の高さ（height)が正しく設定されて居ないため、レイアウトシフトも発生していますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/db25bb60-4aff-3004-9e09-55c50bba9c4b.png)


### Preload 対応

HTMLのheadタグの中に preload を記述することで、他のリソースよりもこの画像を優先して読み込むことをしてくれるようになります。

FCPの状態で、すでに画像がレンダリングされた状態というのを実現するには
この処理を記述する必要があるかもしれません。

* FCP
    * LCPコンテンツの preload を実施
    * LCPコンテンツのレンダリング完了
    * メインコンテンツレンダリング完了

LCP画像やフォントなどは preload しておきましょう。

```html: 画像の preload 対応
<head>
  <link rel="preload" href="/images/ranking/main.webp" as="image">
  <link rel="preload" href="/path/to/font.woff2" as="font" type="font/woff2" crossorigin="anonymous">
</head>
```

# その他細かいチューニング
LCPパーツが最速でレンダリングされればそれで9割良いので
もしかしたら、そのほかは細かいチューニングになるかもしれません。

### TBT対応
BlockingTime、最近この指標が重要視されていますね。
レンダリングブロックリクエストなどにカーソルを合わせるとどのファイルがレンダリングをブロックしているかわかります。

このファイルがないと正常にレンダリングができずに UI が大きく変わってしまうなどの問題がない場合は
このファイル自体を優先的に読み込む必要がないので遅延読み込みするなどをしてあげましょう。

このサイトの場合は layout や mainコンテンツのCSSファイルなどとfontの読み込みだったのでレンダリングに必要なファイルだと思われます。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/78f67a08-487b-d955-d60f-a85631b7eb58.png' width=400px>


### レイアウトシフト
LCP完了前にあるレイアウトシフトは減点の対象となるので
画像などを読み込む前から高さなどを指定しておくなど難しい改善点ではないので早めに対応してしまいましょう。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/b3c5acba-9578-c363-e88e-35485f2bd7ee.png' width=200px>

## ネットワークタブの使い方
ネットワークタブはLCPパーツをより早く読み込むための障害を把握するために有用です
LCPパーツより早く読み込まれてしまっている、無駄な画像はどれなのかを徹底的に洗い出す最後にりようします。

この画面を最初に見ても特に改善点は思い浮かばないかもしれません。


以下のようにリソースが読み込まれて居て

* 最初の1本線はHTMLファイルをサーバから受け取った処理です
* 次200ミリ秒以降から4ファイルくらい読み込まれているのが次のロードです
* HTMLファイルを解析した結果ブラウザが優先順位が高いと判断したファイルです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/1c42f05f-b12c-2d40-0ed8-5758a536120d.png)


## 見るのは3段階目くらいまで
* HTMLファイル
* 優先リソース
* 次に読み込まれるファイル群

ウォーターフォールの部分を見てどんなファイルがどのタイミングで読み込まれているのか確認しましょう。
もし優先的に読み込む必要がないのに、優先的に読み込まれているものがあれば
遅延読み込みさせるにはどうしたら良いか考え、適宜適応していきましょう。

今回の例のサイトを分析するなら

* 優先リソースとして読み込まれている画像が多くLCPパーツが含まれて居ない
    * 記事本文の画像が lagyload対応されて居ないからだと思われる
* サイトの表示に関わらない、挙動のための js　が読み込まれている
    * 挙動に関わるファイルはページのLCPパーツ読み込み後に読んでも問題ない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/3c1c8929-75e9-655a-1280-83a573a039e6.png)

このようにLCPパーツを読み込む前に無駄なものを多く読み込んでいるので
いくら調整してもスコアが上がりきらない場合はこちらも見てみると良いかもしれません。


## スコア変化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/b83cb77b-f228-ea5b-edb1-415f4a23d6e2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/d70c7ad6-454f-aea6-93a1-c933e3d16709.png)