Cover Image for Next.js の Local Fonts は高パフォーマンス

Next.js の Local Fonts は高パフォーマンス

NEXT.js
WordPress
PageSpeed Insights
SEO

はじめに

筆者のWebサイトは、2024年1月中旬位までは WordPress で公開していました。キャッシュを使って高速化できるのは、「WordPress に LiteSpeed Cache を利用して高速化を実現」でも紹介しました。しかし、もっと高速化したいと思いました。

そこで、Next.js をフロントとして使う構成に変える作業をしています。(筆者注:2024年1月中旬以降は Next.js アプリに代わっています)WordPress は、ヘッドレスCMS として使用して記事を書きます。記事執筆に使い勝手の良い WordPress と、サイト高速化に有利な Next.js を組み合わせる構成です。この記事は、その過程で発生したパフォーマンス問題をどうやって解決したかを紹介します。

環境について

Next.js など、変化が激しいので筆者の使用しているコンポーネントのバージョンを念のため記しておきます。使用するバージョンが異なると、この記事の結果とは異なるかもしれません。

$ npm list --depth=0 | grep -e react -e next
nextjs-wordpress@ /home/ychan/next/nextjs-wordpress
├── @fortawesome/react-fontawesome@0.2.0
├── @types/react-dom@18.2.18
├── @types/react@18.2.45
├── next@14.0.4
├── react-dom@18.2.0
├── react@18.2.0
$

Next.js のフロントアプリは、Vercel のホスティングサービスで稼働します。

Vercel にアプリをデプロイするだけで、エッジネットワークを利用でき、CDNとしても動作します。筆者の主観ですが、パフォーマンスが高く、安定していると思います。

Next.js Local Fonts を使ったきっかけ

開発中のフロントアプリを「PageSpeed Insights」でパフォーマンス確認をしてみました。デスクトップは100~99点ですが、携帯電話は 79点前後となりました。携帯電話のパフォーマンスを改善しようと思いました。

PageSpeed Insight は、改善できる項目を教えてくれます。親切ですね。

指摘された CSS ファイルを調べてみました。この CSS ファイルは、フォント情報が大部分で未使用部分が多い事が分かりました。しかし、なぜデスクトップでは問題なくて、携帯だと問題になるのか?筆者は通信速度の違いのせいと考えています(間違っているかもしれませんが)。次のキャプチャ画像の左側が携帯、右側がデスクトップです。通信速度がかなり違います。

筆者は Webフォント(Google Fonts)を導入しています。Next の公式ドキュメントには、フォントの最適化について説明があります。もう一度良く読んでみると、Local Fonts についても記述があったので、この方式に変更したところパフォーマンス問題は解決しました。何やら良く分かっていなくて申し訳ないですが、ともかくレンダリングブロックは解消できました。

筆者の Local Fonts 利用方法紹介

変更前と変更後のサンプルソースコードを示します。

変更前 (app/layout.tsx)

import { Noto_Sans_JP } from 'next/font/google'

const myFont = Noto_Sans_JP ({
  subsets: ['latin'],
  display: 'swap',
})

export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <html lang="jp" className={myFont.className}>
      <body>{children}</body>
    </html>
  )
}

変更後 (app/layout.tsx)

import localFont from 'next/font/local'

const myFont = localFont({
  src: './noto-serif-jp-v21-latin-regular.woff2',
  display: 'swap',
})

export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <html lang="jp" className={myFont.className}>
      <body>{children}</body>
    </html>
  )
}

ローカルフォントファイルは、以下から入手しました。

google-webfonts-helper

A Hassle-Free Way to Self-Host Google Fonts

https://gwfh.mranftl.com/fonts

zipファイルでダウンロードできるので、解凍したフォントファイルをサーバーに置きます。サンプルコードでは、app ディレクトリ直下に noto-serif-jp-v21-latin-regular.woff2 を置いています。

計測結果

Local Fonts 導入で、携帯スコア100点のキャプチャは次になります。

Local Fonts 適用後の感想

Web開発ツールの「カバレッジ」で、Local Fonts 導入前後を比較すると、導入後では CSS ファイルの最適化が良く出来ていると思いました。CSS ファイルのサイズ自体がだいぶ小さくなり、かつ未使用部分も少なく無駄がないという感じです。筆者が持っているガラホ(INFOBAR)でサイトを見ると、導入後は少し速くなったように感じました。

【おまけ】本記事のアイキャッチ

この記事のアイキャッチは、実家で元気に過ごしている「さくら」です。記事内容とは全く関係ありません。

ある日、捨て猫だった「さくら」を筆者の父が拾ってきました。筆者は別のところに住んでいたので、当時のことは良く知りませんが、生まれたばかりの子猫を哺乳瓶などを使って育てました。撮影は、良く世話をした姪っ子です。筆者がサイトを開設したので写真提供してもらいました。今はすっかり大人猫に成長しています。椅子に寝そべるのが好きなようで、筆者が座ろうとする椅子に寝そべっていたりします。可愛がられていて、さくらは幸せ猫ですね。


More Stories

Cover Image for 高品質なスロー静止画アニメーションプログラム(html カスタム要素)を作ってみた

高品質なスロー静止画アニメーションプログラム(html カスタム要素)を作ってみた

NEXT.js
SvelteKit
WordPress
実験
animation
drawImage
requestAnimationFrame

静止画(主に写真を想定)がゆっくりと移動する落ち着いたアニメーションプログラム(html カスタム要素)を作ってみました。静止画(写真)を利用して、手軽にアニメーションできます。高品質な静止画(写真)を高品質なまま、『カクカクしないで滑らかに』アニメーションします。

Cover Image for PageSpeed Insights で携帯パフォーマンススコアを満点 (100) にした

PageSpeed Insights で携帯パフォーマンススコアを満点 (100) にした

実験
AVIF
LCP
PageSpeed Insights
srcset
TBC

実験として PageSpeed Insights の携帯(スマホ)パフォーマンスを満点 (100) になるまでチューニングしたので、その作業内容について記事にしてみました。主に LCP と TBT について改善しています。少しでもパフォーマンスチューニングの参考になれば幸いです。