コース一覧
Next.js公開設計:SEO・画像最適化・デプロイ
フォント最適化

Next.js公開設計:SEO・画像最適化・デプロイ

metadata、動的metadata、OGP、Image、フォント最適化、本番ビルド、マネージド環境・自サーバーへの公開、公開前チェックを扱う全13レッスンの公開プロジェクトです。fleamaを検索・SNS・表示速度まで整え、公開URLを持つ本番サービスとして完成させます。

1
メタデータ・OGP・画像
01. メタデータ15分
02. 動的メタデータ15分
03. OGP15分
04. 画像最適化15分
05. フォント最適化15分
06. つくる - 検索とSNSに強く20分
07. 第7章クイズ15分
2
デプロイと総合制作
01. 本番ビルド15分
02. マネージドへ公開15分
03. 自サーバー案15分
04. 公開前チェック15分
05. 自由拡張20分
06. 完成と次のステップ10分

フォント最適化

あとから書体が入れ替わる

文字が一瞬入れ替わる、あれ

Web フォントを使ったページを開くと、最初は見慣れた書体で出て、少し遅れて狙った書体に入れ替わることがあります。行の幅まで変わるので、読み始めた場所が動いて落ち着きません。

原因は、フォントのファイルを外部のサーバーから取ってくるところにあります。CSS を読んで、そこに書かれたフォントの場所を知って、そこから取りに行く、という順番になるので、文字が出てからフォントが届くまでの空白が生まれます。

next/font に任せる

Next.js は next/font でこれを解きます。Google Fonts なら next/font/google から、使いたい書体の名前をそのまま読み込みます。

TypeScript (JSX)

import { Inter } from "next/font/google"; const inter = Inter({ subsets: ["latin"] });

ビルドのときにフォントのファイルを自分のサイトに取り込むので、外部サーバーへ取りに行く往復が無くなります。取ってくる URL がユーザーの環境ごとに変わらないため、外部への通信そのものも減ります。

subsets は、その書体のうちどの文字を使うかです。英数字だけなら latin を指定しておくと、要らない文字のぶんを持ってこずに済みます。太さを選べる書体では weight も渡します。

返ってくるのは className

呼び出した結果は、className を持つオブジェクトです。これを付けた要素とその中身に、その書体が効きます。

TypeScript (JSX)

<body className={inter.className}>

サイト全体を同じ書体にしたいならルートレイアウトの body に付けます。見出しだけ別の書体にしたいときは、その見出しに別の className を付けます。文字列をつなぐときは、いつもの className と足し算でつなげます。

TypeScript (JSX)

<h1 className={notoSansJp.className + " site-title"}>fleama</h1>

書体を呼び出す行は、関数の外側に1回だけ書きます。描くたびに呼ぶ書き方は Next.js が受け付けません。

演習

fleama の本文と見出しに、それぞれ別の書体を当てます。

ヒント

const inter = Inter({ subsets: ["latin"] }); のように、関数として呼び出します

戻り値の className を使います。inter.className です

className を2つ付けたいときは notoSansJp.className + " site-title" のようにつなぎます

Noto_Sans_JP は下線付きの名前です。import する名前をそのまま書きます

layout.tsx
page.tsx
プレビュー

できているか

  • next/font/google から書体を読み込んでいる
  • subsets を渡して呼び出している
  • 本文全体に Inter の className を付けている
  • サイト名に Noto Sans JP が当たっている
  • 元からある site-title も残っている
  • サイト名がそのまま出ている
エディタを読み込んでいます