Font Preview
Google Fontsの読み込み方法|実務での割り切りポイント
2025-11-10
:::note ※Google Fontsの読み込みを最適化したい人向けの「実装ガイド」記事です :::
結論(私の判断基準)
- 基本形:link タグ + preconnect
- @import は避ける:CSSパース完了までブロックされる
- ウェイトは2種類に絞る:400 と 700 で十分なことが大半
💡 フォントを選んでから最適化したい → Font Preview で見た目を確認
私の実装パターン(これをコピペしてる)
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;700&display=swap" rel="stylesheet">
preconnect を付けることで DNS解決・TLS接続を事前に行い、高速化できる。
毎回これを書いている。変えるのはフォント名とウェイトだけ。
読み込み方法の比較
| 方法 | 並列読み込み | ブロッキング | 私の判断 |
|---|---|---|---|
| link タグ | ○ | なし | これを使う |
| @import | × | CSSパース完了まで | 使わない |
| JavaScript API | ○ | なし | 動的用途のみ |
@import を使わない理由
/* ❌ これは遅い */
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;700&display=swap');
CSS のパース完了までフォント読み込みがブロックされる。link タグより確実に遅い。
特別な理由がない限り @import は使わない。
font-display の選択
| 値 | FOUT | FOIT | 私の使い方 |
|---|---|---|---|
| swap | あり | なし | 本文はこれ |
| optional | なし | なし | 見出し・装飾 |
| fallback | 短い | 短い | 使ったことない |
- FOUT: Flash of Unstyled Text(フォント切り替え時のチラつき)
- FOIT: Flash of Invisible Text(フォント読み込み中にテキストが見えない)
**私は swap 一択。**ユーザーがテキストを読めない時間を最小限にしたい。チラつきは許容する。
軽量化テクニック
テクニック1:ウェイトを絞る
<!-- ❌ 全ウェイト(数MB) -->
<link href="...?family=Noto+Sans+JP:wght@100;200;300;400;500;600;700;800;900&display=swap" rel="stylesheet">
<!-- ✅ 必要なウェイトだけ(軽い) -->
<link href="...?family=Noto+Sans+JP:wght@400;700&display=swap" rel="stylesheet">
多くの場合、400 と 700 の2つで十分。
テクニック2:サブセット化(限定的に使う)
<link href="...?family=Noto+Sans+JP&text=あいうえお" rel="stylesheet">
使用する文字を限定すると軽くなる。ロゴやキャッチコピー向け。
**本文には使わない。**どの文字が出てくるか分からないから。
Next.js での最適化
Next.js 13以降は next/font で自動最適化される。
import { Noto_Sans_JP } from 'next/font/google';
const notoSansJP = Noto_Sans_JP({
weight: ['400', '700'],
subsets: ['latin'],
display: 'swap',
});
export default function Layout({ children }) {
return (
<body className={notoSansJP.className}>
{children}
</body>
);
}
メリット:
- ビルド時にフォントをダウンロード
- セルフホスティングで外部リクエスト不要
- CLS(レイアウトシフト)の自動対策
Next.js を使っているなら、これ一択。
実務での割り切りポイント
| 悩み | 私の割り切り |
|---|---|
| 全ウェイト欲しい | 400/700 で我慢する。3種類以上は本当に必要か疑う |
| チラつきが気になる | swap で許容する。FOIT より FOUT の方がマシ |
| 速度を追求したい | システムフォントに切り替える選択肢も検討 |
| サブセット化すべきか | 本文には使わない。ロゴだけ |
迷ったときの判断
| 迷い | 私の判断 |
|---|---|
| どの読み込み方法 | link タグ + preconnect |
| font-display | swap |
| ウェイトの数 | 400/700 の2種類 |
| Next.js 使ってる | next/font 一択 |
この記事で解決しない場合
- フォールバック指定で事故りたくない → font-familyのフォールバック指定
- 可変フォントを使うか迷っている → Variable Fonts入門
Google Fontsは便利だが、読み込めないこともある。フォールバックを書いて、swap を指定して、それで終わり。