Webサイトの表示速度が遅い…その原因の一つに、Webフォントのファイルサイズが大きいことが挙げられます。特に日本語フォントは多くの文字を含むため、データ量が膨大になりがちです。この記事では、人気のある日本語フォント「Noto Sans JP」を例に、必要な文字だけを抽出して軽量化する「サブセット化」を行い、ページ読み込み速度を改善する方法を解説します。
様々なツールがある中で、当初「サブセットフォントメーカー」を試しましたが、私の環境では表示崩れが発生しました。最終的にPythonライブラリ「FontTools」を用いることで、OTF情報(文字詰めなどの見た目を整える情報)を維持したまま、Noto Sans JPフォントをWOFF2形式にサブセット化し、ファイルサイズを50%以上削減、読み込み速度を向上させることに成功しました。その具体的な手順と注意点を備忘録としてまとめます。
この記事の内容
1. フォントのサブセット化とは?なぜページ速度改善に必要なのか
フォントのサブセット化とは、簡単に言うと、フォントファイルの中からWebサイトで実際に使用する文字だけを抜き出し、不要な文字データを削除してファイルサイズを小さくする技術のことです。「普段使わない難しい漢字や特殊記号まで全部読み込むのは無駄だよね?使う文字だけに絞って軽くすれば、サイトがもっと速く表示されるはず!」という考え方に基づいています。
このブログでも使用している定番の日本語フォント「Noto Sans JP」は、Google Fontsからも入手できる高品質なフォントですが、非常に多くの文字(ひらがな、カタカナ、常用漢字、人名漢字、記号など)を網羅しています。
Noto Sans Japanese (Google Fonts)
そのため、ダウンロードしてそのままWebフォント(例えばWOFF形式)としてサイトに組み込むと、標準の太さ(Regular)や太字(Bold)だけで、それぞれ約4MBものファイルサイズになってしまいます。これでは、ユーザーがページを開くたびに大きなデータをダウンロードする必要があり、表示速度のボトルネックになりかねません。

(↑サブセット化前のフォントファイル。サイズが大きいことがわかります。)
そこで重要になるのが、この巨大なフォントファイルを軽量化する「サブセット化」なのです。
2. 【失敗談】サブセットフォントメーカーでOTF情報が欠落し表示が崩れた件
フォントのサブセット化について調べると、「サブセットフォントメーカー」というGUIツールがよく紹介されています。私もいくつかの解説サイトを参考に、このツールと「WOFFコンバータ」を使ってNoto Sans JP(TTF形式)からサブセットWOFFフォントを作成してみました。

しかし、生成されたフォントをサイトに適用したところ、予期せぬ表示崩れが発生してしまいました。

(↑左が元の表示、右がサブセットフォントメーカーで変換後の表示。記事タイトル部分の文字間隔が不自然に広がっています。)
原因を調査したところ、どうやら「サブセットフォントメーカー」がフォント変換を行う過程で、Noto Sans JPに含まれる重要なOTF(OpenType Font)情報の一部、特に文字間隔の調整(カーニング、ペアカーニング)を行うための情報(GPOSテーブルなど)を削除してしまったようです。
OTF情報は、文字の形だけでなく、文字と文字の間のアキを自動調整したり、特定の文字の組み合わせで合字(リガチャ)に置き換えたり(GSUBテーブル)といった、フォントの見た目を美しく整えるための重要なデータです。これが失われたために、文字間隔がデフォルトのままになり、レイアウトが崩れてしまったと考えられます。
軽量化はできても、見た目が損なわれては意味がありません。そこで、OTF情報を維持したまま、高精度なサブセット化ができるツールを探し、Python製のライブラリ「FontTools」にたどり着きました。
3. 解決策!FontToolsを使った高精度なサブセット作成手順
FontToolsは、フォントファイルを操作するための強力なPythonライブラリ群です。オープンソースで開発されており、TTFやOTF形式のフォントに対して、サブセット化はもちろん、情報の編集、形式変換など、様々な高度な処理を行うことができます。コマンドラインから手軽に利用できるのも魅力です。
FontToolsを使ってNoto Sans JPのサブセットを作成する手順は以下の通りです。
3-1. FontToolsのインストール
FontToolsはPythonライブラリなので、まずお使いの環境にPythonがインストールされていることを確認してください。Pythonが利用できる環境であれば、ターミナル(コマンドプロンプト)で以下のpip
コマンドを実行してFontToolsをインストールします。
pip install fonttools brotli zopfli
※ WOFF2形式の扱いや、より高い圧縮率(--with-zopfli
オプション)を実現するために、brotli
と zopfli
も一緒にインストールしておくと良いでしょう。
3-2. サブセット化コマンドの実行
次に、ターミナルでpyftsubset
コマンドを使ってサブセット化を実行します。Noto Sans JPの元フォントファイル(例: NotoSansJP-Regular.ttf
)があるディレクトリで、以下のコマンドを実行してください。(ファイル名やパスはご自身の環境に合わせて変更してください。)
# NotoSansJP-Regular.ttf からサブセット NotoSansJP-Regular.woff2 を作成する例
pyftsubset NotoSansJP-Regular.ttf \
--output-file=NotoSansJP-Regular.woff2 \
--flavor=woff2 \
--layout-features='*' \
--unicodes='U+0020-007E,U+3000-30FF,U+4E00-9FAF,U+FF01-FF60,U+FF65-FF9F' \
--with-zopfli \
--verbose
同様に、Bold(太字)など他のウェイトのフォントもサブセット化する場合は、元ファイル名と出力ファイル名を変更してコマンドを実行します。
コマンドオプションの解説:
NotoSansJP-Regular.ttf
サブセット化の元となるフォントファイル(TTFまたはOTF)。
--output-file=NotoSansJP-Regular.woff2
出力するサブセットフォントのファイル名とパスを指定。
--flavor=woff2
出力形式をWOFF2に指定。WOFF2はWebフォント用に最適化された形式で、圧縮率が高くファイルサイズを小さくできます。
--layout-features='*'