フォント最適化
next/font
はフォント(カスタムフォントを含む)を自動的に最適化し、プライバシーとパフォーマンスを向上させるために外部ネットワークリクエストを削除します。
🎥 動画で学ぶ:
next/font
の使用方法 → YouTube (6分)
next/font
には、あらゆるフォントファイルの組み込み自動セルフホスティングが含まれています。これは、基盤となるCSSの size-adjust
プロパティのおかげで、レイアウトシフトをゼロに抑えながらウェブフォントを最適に読み込めることを意味します。
この新しいフォントシステムでは、パフォーマンスとプライバシーを考慮して、すべてのGoogleフォントを便利に使用できます。CSSとフォントファイルはビルド時にダウンロードされ、他の静的アセットと一緒にセルフホストされます。ブラウザからGoogleにリクエストが送信されることはありません。
Googleフォント
任意のGoogleフォントを自動的にセルフホストできます。フォントはデプロイに含まれ、デプロイと同じドメインから提供されます。ブラウザからGoogleにリクエストが送信されることはありません。
使用したいフォントを next/font/google
から関数としてインポートします。最高のパフォーマンスと柔軟性を得るために、可変フォントの使用を推奨します。
すべてのページでフォントを使用するには、以下のように /pages
配下の _app.js
ファイル に追加します:
import { Inter } from 'next/font/google'
// 可変フォントを読み込む場合、フォントの重さを指定する必要はありません
const inter = Inter({ subsets: ['latin'] })
export default function MyApp({ Component, pageProps }) {
return (
<main className={inter.className}>
<Component {...pageProps} />
</main>
)
}
可変フォントを使用できない場合は、重さを指定する必要があります:
import { Roboto } from 'next/font/google'
const roboto = Roboto({
weight: '400',
subsets: ['latin'],
})
export default function MyApp({ Component, pageProps }) {
return (
<main className={roboto.className}>
<Component {...pageProps} />
</main>
)
}
配列を使用して複数の重さやスタイルを指定できます:
const roboto = Roboto({
weight: ['400', '700'],
style: ['normal', 'italic'],
subsets: ['latin'],
display: 'swap',
})
知っておくと良いこと: 複数の単語を含むフォント名にはアンダースコア(_)を使用します。例:
Roboto Mono
はRoboto_Mono
としてインポートします。
<head>
にフォントを適用
ラッパーや className
を使用せずに、<head>
内にフォントを注入することもできます:
import { Inter } from 'next/font/google'
const inter = Inter({ subsets: ['latin'] })
export default function MyApp({ Component, pageProps }) {
return (
<>
<style jsx global>{`
html {
font-family: ${inter.style.fontFamily};
}
`}</style>
<Component {...pageProps} />
</>
)
}
単一ページでの使用
特定のページでフォントを使用するには、以下のようにそのページに追加します:
import { Inter } from 'next/font/google'
const inter = Inter({ subsets: ['latin'] })
export default function Home() {
return (
<div className={inter.className}>
<p>Hello World</p>
</div>
)
}
サブセットの指定
Googleフォントは自動的にサブセット化されます。これによりフォントファイルのサイズが縮小され、パフォーマンスが向上します。プリロードするサブセットを定義する必要があります。preload
が true
なのにサブセットを指定しないと警告が表示されます。
関数呼び出しに追加することで指定できます:
const inter = Inter({ subsets: ['latin'] })
詳細はフォントAPIリファレンスをご覧ください。
複数のフォントを使用
アプリケーションで複数のフォントをインポートして使用できます。2つのアプローチがあります。
1つ目のアプローチは、フォントをエクスポートし、インポートして必要な場所に className
を適用するユーティリティ関数を作成する方法です。これにより、フォントがレンダリングされるときにのみプリロードされます:
import { Inter, Roboto_Mono } from 'next/font/google'
export const inter = Inter({
subsets: ['latin'],
display: 'swap',
})
export const roboto_mono = Roboto_Mono({
subsets: ['latin'],
display: 'swap',
})
import { Inter, Roboto_Mono } from 'next/font/google'
export const inter = Inter({
subsets: ['latin'],
display: 'swap',
})
export const roboto_mono = Roboto_Mono({
subsets: ['latin'],
display: 'swap',
})
上記の例では、Inter
はグローバルに適用され、Roboto Mono
は必要に応じてインポートして適用できます。
別の方法として、CSS変数を作成し、好みのCSSソリューションで使用できます:
html {
font-family: var(--font-inter);
}
h1 {
font-family: var(--font-roboto-mono);
}
上記の例では、Inter
がグローバルに適用され、すべての <h1>
タグが Roboto Mono
でスタイルされます。
推奨事項: 新しいフォントごとにクライアントがダウンロードする必要があるリソースが増えるため、複数のフォントの使用は控えめにしてください。
ローカルフォント
next/font/local
をインポートし、ローカルフォントファイルの src
を指定します。最高のパフォーマンスと柔軟性を得るために、可変フォントの使用を推奨します。
import localFont from 'next/font/local'
// フォントファイルは `pages` 内に配置できます
const myFont = localFont({ src: './my-font.woff2' })
export default function MyApp({ Component, pageProps }) {
return (
<main className={myFont.className}>
<Component {...pageProps} />
</main>
)
}
単一のフォントファミリーに複数のファイルを使用したい場合、src
は配列にできます:
const roboto = localFont({
src: [
{
path: './Roboto-Regular.woff2',
weight: '400',
style: 'normal',
},
{
path: './Roboto-Italic.woff2',
weight: '400',
style: 'italic',
},
{
path: './Roboto-Bold.woff2',
weight: '700',
style: 'normal',
},
{
path: './Roboto-BoldItalic.woff2',
weight: '700',
style: 'italic',
},
],
})
詳細はフォントAPIリファレンスをご覧ください。
Tailwind CSSとの併用
next/font
はCSS変数を通じてTailwind CSSと併用できます。
以下の例では、next/font/google
から Inter
フォントを使用します(Googleフォントまたはローカルフォントのいずれでも使用可能です)。variable
オプションでフォントを読み込み、CSS変数名を定義して inter
に割り当てます。次に、inter.variable
を使用してHTMLドキュメントにCSS変数を追加します。
import { Inter } from 'next/font/google'
const inter = Inter({
subsets: ['latin'],
variable: '--font-inter',
})
export default function MyApp({ Component, pageProps }) {
return (
<main className={`${inter.variable} font-sans`}>
<Component {...pageProps} />
</main>
)
}
最後に、CSS変数をTailwind CSS設定に追加します:
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
'./pages/**/*.{js,ts,jsx,tsx}',
'./components/**/*.{js,ts,jsx,tsx}',
'./app/**/*.{js,ts,jsx,tsx}',
],
theme: {
extend: {
fontFamily: {
sans: ['var(--font-inter)'],
mono: ['var(--font-roboto-mono)'],
},
},
},
plugins: [],
}
これで、font-sans
と font-mono
ユーティリティクラスを使用して要素にフォントを適用できます。
プリロード
サイトのページでフォント関数が呼び出されると、そのフォントはグローバルに利用可能ではなく、すべてのルートでプリロードされません。代わりに、フォントが使用されるファイルのタイプに基づいて、関連するルートでのみプリロードされます:
フォントの再利用
localFont
またはGoogleフォント関数を呼び出すたびに、そのフォントはアプリケーション内で1つのインスタンスとしてホストされます。したがって、複数のファイルで同じフォント関数を読み込むと、同じフォントの複数のインスタンスがホストされます。このような状況では、以下の方法を推奨します:
- 共有ファイルでフォントローダー関数を呼び出す
- 定数としてエクスポートする
- このフォントを使用したい各ファイルで定数をインポートする