⛵️

next/fontのweightを指定すると遅くなる!?

2023/09/17に公開

結論から

Next.jsの next/font でWebフォントを使う時は、そのフォントが Variable fonts であれば、 weight を指定しない方がCSSサイズを削減できるようです。

前提

  • Next.js 13.4.19
  • App Router使用

実験

Next.jsアプリを立ち上げ、今回は Noto Sans JP を以下のように使用します。

app/layout.tsx
import { Noto_Sans_JP } from 'next/font/google'

const notojp = Noto_Sans_JP({
  weight: ['200', '400', '700'], // 使用するfont-weightを指定する
  subsets: ['latin']
});

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="ja">
      <body className={notojp.className}>{children}</body>
    </html>
  )
}
app/page.tsx
export default function Home() {
  const text =
    "人類社会のすべての構成員の固有の尊厳と平等で譲ることのできない権利とを承認することは";

  return (
    <main>
      <div>Font-weight: 200</div>
      <p style={{ fontWeight: 200 }}>{text}</p>

      <hr />

      <div>Font-weight: 400(デフォルト)</div>
      <p>{text}</p>

      <hr />

      <div>Font-weight: 700</div>
      <p style={{ fontWeight: 700 }}>{text}</p>
    </main>
  );
}

これで、以下のように各font-weightで表示することができます。

実はweightは不要

ですが、実は Noto Sans JPVariable fonts のため、上記の weight: ['200', '400', '700'] の指定はしなくても、全く同じように表示できます。

app/layout.tsx
const notojp = Noto_Sans_JP({
  subsets: ['latin']
});
Variable fontsとは

可変フォント (Variable fonts) は幅、太さ、スタイルごとに個別のフォントファイルを用意するのではなく、書体のさまざまなバリエーションを 1 つのファイルに組み込むことができる OpenType フォント仕様の進化版です

https://developer.mozilla.org/ja/docs/Web/CSS/CSS_fonts/Variable_fonts_guide

Lighthouseスコアへの影響

weight指定ありが99点、なしが100点でした。指定なしの方が描画が0.3秒速くなっています。

weight指定ありの場合

weight指定なしの場合

CSSファイルサイズの違い

この違いの原因は、フォント用のCSSファイルサイズがweight指定ありだと3倍になっているためです。

weight指定ありの場合

cssファイルの中身の例

200, 400, 700それぞれの指定がある

weight指定なしの場合

cssファイルの中身の例

100から900がまとめられている

Variable fontsでない場合

ちなみに、例えば Noto Serif JP のようにVariable fontsでない場合は、 weight を指定しないと型エラーを出してくれるようです。

まとめ

以上のように、weightの指定1つでパフォーマンスを改善できる場合があるため、見直してみると良いかもしれません💡

GitHubで編集を提案

Discussion