🌏

Browserslistを更新してNext.jsのビルドサイズを少し減らす

2023/03/20に公開

サイトのパフォーマンスを改善したいと思い、「Browserslist」の設定を行ったら少しだけビルド後のサイズが改善されたので、その時に行ったことのメモになります。

検証したサイト

今回は個人で開発している以下のもので検証を行いました。

https://witman.vercel.app

環境

  • next: 12.1.6
    • 全ページ(5ページ)SSGでビルド
  • react: ^18.2.0
  • @emotion/react: ^11.10.6
  • typescript: ^4.9.5

サイト上で対応させるブラウザについて(2023/03/20時点)

  • > 2% in JP
  • ios >= 15
  • not dead

https://browsersl.ist/#q=>+2%25+in+JP%2C+ios+>%3D+15%2C+not+dead

対応しているbrowserlistの内容

検証結果

Next.jsのビルドサイズを検証したい場合、以下のパッケージを利用することで検証を行うことができます。

https://www.npmjs.com/package/@next/bundle-analyzer

変更前

.next/analyze/client.html

全体: 382.93KB

analyze client 変更前

.next/server/analyze/server.html

全体: 327.41KB

analyze server 変更前

変更後

.next/analyze/client.html

全体: 353.37KB

analyze client 変更後

.next/server/analyze/server.html

全体: 327.41KB

analyze server 変更後

修正内容

.babelrc
{
  "presets": [
    [
      "next/babel",
      {
        "preset-env": {
          // ここにBrowserslistで対応する内容を記載
          "targets": [ "> 2% in JP", "ios >= 15", "not dead" ]
        }
      }
    ],
    "@emotion/babel-preset-css-prop"
  ]
}

対応した内容について

1. Next.jsでのBrowserslistの対応している内容の確認

https://nextjs.org/docs/basic-features/supported-browsers-features

Next.jsがデフォルトでサポートしているブラウザについては以下になります。(2023/03/20時点)

  • Chrome 64+
  • Edge 79+
  • Firefox 67+
  • Opera 51+
  • Safari 12+

https://browsersl.ist/#q=Firefox+>%3D+67%2C+chrome+>%3D+64%2C+edge+>%3D79%2C+opera+>%3D+51%2C+safari+>%3D+12

全体を見たい場合は、上記のリンクをクリックしてください。

Next.jsが対応しているbrowserlistの内容

2. 公式の通りに修正してみる

https://nextjs.org/docs/basic-features/supported-browsers-features

package.jsonに対応したいブラウザの内容を記載します。

package.json
{
  "browserslist": [
    "> 2% in JP",
    "ios >= 15",
    "not dead"
  ]
}

この時点での結果

.next/analyze/client.html

全体: 382.93KB

analyze client 変更前

.next/server/analyze/server.html

全体: 327.41KB

analyze server 変更前

3. 更新されていないので、調査

「2」の内容を更新してもうまくいかなったため、以下のdiscussionsを見つけたため、それを行ってみます。

https://github.com/vercel/next.js/discussions/12826

今回はemotionも使用しているため、@emotion/babel-preset-css-propも記載していますが、emotionを使用していない場合は不要です。

.babelrc
{
  "presets": [
    [
      "next/babel",
      {
        "preset-env": {
          "targets": [ "> 2% in JP", "ios >= 15", "not dead" ]
        }
      }
    ],
    "@emotion/babel-preset-css-prop"
  ]
}

この時点での結果

.next/analyze/client.html

全体: 353.37KB

analyze client 変更後

.next/server/analyze/server.html

全体: 327.41KB

analyze server 変更後

結論

今回削減されたサイズについては以下になります。

  • client: 382.93KB → 353.37KB、29.56KB下がった!
  • server: 変化なし

規模が小さいサイトということもあってビルドの結果は少ししか変わらなかったですが、一度Next.jsのパフォーマンス改善として、不要なターゲットブラウザのものも入っていないか見てみるのもよいと思います。

Discussion