Font モジュール
next/font はフォント(カスタムフォントを含む)を自動的に最適化し、プライバシーとパフォーマンス向上のために外部ネットワークリクエストを削除します。
ビルトインの自動セルフホスティング機能により、任意のフォントファイルを最適に読み込むことができます。これにより、レイアウトシフトを発生させることなくWebフォントを読み込めます。
また、すべてのGoogle Fontsを簡単に利用できます。CSSとフォントファイルはビルド時にダウンロードされ、他の静的アセットと共にセルフホストされます。ブラウザから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>
)
}🎥 動画:
next/fontの使い方について詳しく学ぶ → YouTube (6分).
リファレンス
| キー | font/google | font/local | タイプ | 必須 |
|---|---|---|---|---|
src | String または Objectの配列 | Yes | ||
weight | String または Array | Required/Optional | ||
style | String または Array | - | ||
subsets | 文字列の配列 | - | ||
axes | 文字列の配列 | - | ||
display | String | - | ||
preload | Boolean | - | ||
fallback | 文字列の配列 | - | ||
adjustFontFallback | Boolean または String | - | ||
variable | String | - | ||
declarations | Objectの配列 | - |
src
フォントローダー関数が呼び出されるディレクトリからの相対パスで、フォントファイルのパスを文字列またはオブジェクトの配列(Array<{path: string, weight?: string, style?: string}> 型)で指定します。
next/font/local で使用
- 必須
例:
src:'./fonts/my-font.woff2'-my-font.woff2はappディレクトリ内のfontsディレクトリに配置src:[{path: './inter/Inter-Thin.ttf', weight: '100',},{path: './inter/Inter-Regular.ttf',weight: '400',},{path: './inter/Inter-Bold-Italic.ttf', weight: '700',style: 'italic',},]- フォントローダー関数が
app/page.tsxで呼び出され、src:'../styles/fonts/my-font.ttf'を使用する場合、my-font.ttfはプロジェクトルートのstyles/fontsに配置
weight
フォントのウェイトを以下のいずれかで指定:
- 特定のフォントで利用可能なウェイト値の文字列、または可変フォントの場合は値の範囲
- 可変Googleフォントでない場合のウェイト値の配列(
next/font/googleのみ)
next/font/google と next/font/local で使用
- 使用するフォントが可変フォントでない場合に必須
例:
weight: '400': 単一のウェイト値(Interフォントの場合、'100','200','300','400','500','600','700','800','900'またはデフォルトの'variable'が可能)weight: '100 900': 可変フォントの100から900までの範囲weight: ['100','400','900']: 可変フォントでない場合の3つの可能な値の配列
style
フォントのスタイルを以下のいずれかで指定:
- デフォルト値
'normal'の文字列値 - 可変Googleフォントでない場合のスタイル値の配列(
next/font/googleのみ)
next/font/google と next/font/local で使用
- オプション
例:
style: 'italic': 文字列 -next/font/googleではnormalまたはitalicstyle: 'oblique': 文字列 -next/font/localでは任意の値を取れるが、標準フォントスタイルからの値が期待されるstyle: ['italic','normal']:next/font/google用の2つの値の配列 - 値はnormalとitalicから
subsets
プリロードしたい各サブセットの名前を文字列値の配列で定義。subsets で指定されたフォントは、preload オプションが true(デフォルト)の場合、head にリンクプリロードタグが注入されます。
next/font/google で使用
- オプション
例:
subsets: ['latin']:latinサブセットを含む配列
使用するフォントのすべてのサブセットのリストは、Google Fontsのページで確認できます。
axes
一部の可変フォントには追加の axes を含めることができます。デフォルトでは、ファイルサイズを抑えるためにフォントウェイトのみが含まれます。axes の可能な値は特定のフォントによって異なります。
next/font/google で使用
- オプション
例:
axes: ['slnt']:Inter可変フォント用のslnt値を含む配列(こちらで確認可能)。使用するフォントの可能なaxes値は、Google可変フォントページでwght以外の軸をフィルタリングして確認できます
display
フォントの表示方法を文字列値で指定。可能な値は 'auto', 'block', 'swap', 'fallback', 'optional' で、デフォルトは 'swap'。
next/font/google と next/font/local で使用
- オプション
例:
display: 'optional':optional値を割り当てた文字列
preload
フォントをプリロードするかどうかを指定するブール値。デフォルトは true。
next/font/google と next/font/local で使用
- オプション
例:
preload: false
fallback
フォントが読み込めない場合に使用するフォールバックフォント。デフォルトはなく、フォールバックフォントの文字列の配列で指定。
next/font/google と next/font/local で使用
- オプション
例:
fallback: ['system-ui', 'arial']: フォールバックフォントをsystem-uiまたはarialに設定
adjustFontFallback
next/font/googleの場合: 累積レイアウトシフトを減らすために自動フォールバックフォントを使用するかどうかのブール値。デフォルトはtrue。next/font/localの場合: 文字列またはブール値falseで、累積レイアウトシフトを減らすために自動フォールバックフォントを使用するか指定。可能な値は'Arial','Times New Roman'またはfalse。デフォルトは'Arial'。
next/font/google と next/font/local で使用
- オプション
例:
adjustFontFallback: false:next/font/google用adjustFontFallback: 'Times New Roman':next/font/local用
variable
CSS変数メソッドでスタイルを適用する場合に使用するCSS変数名を定義する文字列値。
next/font/google と next/font/local で使用
- オプション
例:
variable: '--my-font': CSS変数--my-fontが宣言される
declarations
生成される @font-face をさらに定義するフォントフェース記述子のキーと値のペアの配列。
next/font/local で使用
- オプション
例:
declarations: [{ prop: 'ascent-override', value: '90%' }]
使用例
Google Fonts
Googleフォントを使用するには、next/font/google から関数としてインポートします。最高のパフォーマンスと柔軟性のために可変フォントの使用を推奨します。
すべてのページでフォントを使用するには、以下のように _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 Fontsは自動的にサブセット化されます。これによりフォントファイルのサイズが縮小され、パフォーマンスが向上します。プリロードするサブセットを定義する必要があります。preload が true の状態でサブセットを指定しないと、警告が表示されます。
関数呼び出しに追加することで指定できます:
const inter = Inter({ subsets: ['latin'] })詳細についてはFont APIリファレンスを参照してください。
複数のフォントを使用する
アプリケーションで複数のフォントをインポートして使用できます。2つのアプローチがあります。
最初のアプローチは、フォントをエクスポートし、必要な場所でその 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 と Roboto_Mono フォントを使用しています(任意のGoogleフォントまたはローカルフォントを使用できます)。variable オプションを使用してCSS変数名(例: inter と roboto_mono)を定義します。次に、inter.variable と roboto_mono.variable を適用してHTMLドキュメントにCSS変数を含めます。
知っておくと良いこと: これらの変数は、好みやスタイリングのニーズ、プロジェクトの要件に応じて
<html>または<body>タグに追加できます。
import { Inter } from 'next/font/google'
const inter = Inter({
subsets: ['latin'],
variable: '--font-inter',
})
const roboto_mono = Roboto_Mono({
subsets: ['latin'],
display: 'swap',
variable: '--font-roboto-mono',
})
export default function MyApp({ Component, pageProps }) {
return (
<main className={`${inter.variable} ${roboto_mono.variable} font-sans`}>
<Component {...pageProps} />
</main>
)
}最後に、CSS変数をTailwind CSS設定に追加します:
Tailwind CSS v4
Tailwind v4 以降、デフォルトでは設定は不要です。設定が必要な場合は、公式ドキュメントに従ってグローバルCSSファイルを設定できます。
@import "tailwindcss";
@theme inline {
--font-sans: var(--font-inter);
--font-mono: var(--font-roboto-mono);
}Tailwind CSS v3
/** @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 ユーティリティクラスを使用して要素にフォントを適用できます。
<p class="font-sans ...">The quick brown fox ...</p>
<p class="font-mono ...">The quick brown fox ...</p>スタイルの適用
フォントスタイルは3つの方法で適用できます:
className
読み取り専用のCSS className を返し、HTML要素に渡します。
<p className={inter.className}>Hello, Next.js!</p>style
読み取り専用のCSS style オブジェクトを返し、フォントファミリー名とフォールバックフォントを含む style.fontFamily をHTML要素に渡します。
<p style={inter.style}>Hello World</p>CSS変数
外部スタイルシートでスタイルを設定し、そこで追加のオプションを指定したい場合は、CSS変数メソッドを使用します。
フォントをインポートするだけでなく、CSS変数が定義されているCSSファイルもインポートし、フォントローダーオブジェクトの variable オプションを次のように設定します:
import { Inter } from 'next/font/google'
import styles from '../styles/component.module.css'
const inter = Inter({
variable: '--font-inter',
})import { Inter } from 'next/font/google'
import styles from '../styles/component.module.css'
const inter = Inter({
variable: '--font-inter',
})フォントを使用するには、テキストの親コンテナの className をフォントローダーの variable 値に設定し、テキストの className を外部CSSファイルの styles プロパティに設定します。
<main className={inter.variable}>
<p className={styles.text}>Hello World</p>
</main><main className={inter.variable}>
<p className={styles.text}>Hello World</p>
</main>component.module.css CSSファイルで text セレクタクラスを次のように定義します:
.text {
font-family: var(--font-inter);
font-weight: 200;
font-style: italic;
}上記の例では、Hello World というテキストは Inter フォントと生成されたフォントフォールバックを使用して、font-weight: 200 と font-style: italic でスタイルされています。
フォント定義ファイルの使用
localFont またはGoogleフォント関数を呼び出すたびに、そのフォントはアプリケーション内で1つのインスタンスとしてホストされます。したがって、同じフォントを複数の場所で使用する必要がある場合は、1つの場所でロードし、関連するフォントオブジェクトを必要な場所にインポートする必要があります。これはフォント定義ファイルを使用して行われます。
例えば、アプリディレクトリのルートに styles フォルダ内に fonts.ts ファイルを作成します。
次に、次のようにフォント定義を指定します:
import { Inter, Lora, Source_Sans_3 } from 'next/font/google'
import localFont from 'next/font/local'
// 可変フォントを定義
const inter = Inter()
const lora = Lora()
// 非可変フォントの2つのウェイトを定義
const sourceCodePro400 = Source_Sans_3({ weight: '400' })
const sourceCodePro700 = Source_Sans_3({ weight: '700' })
// stylesフォルダに格納されているGreatVibes-Regular.ttfのカスタムローカルフォントを定義
const greatVibes = localFont({ src: './GreatVibes-Regular.ttf' })
export { inter, lora, sourceCodePro400, sourceCodePro700, greatVibes }import { Inter, Lora, Source_Sans_3 } from 'next/font/google'
import localFont from 'next/font/local'
// 可変フォントを定義
const inter = Inter()
const lora = Lora()
// 非可変フォントの2つのウェイトを定義
const sourceCodePro400 = Source_Sans_3({ weight: '400' })
const sourceCodePro700 = Source_Sans_3({ weight: '700' })
// stylesフォルダに格納されているGreatVibes-Regular.ttfのカスタムローカルフォントを定義
const greatVibes = localFont({ src: './GreatVibes-Regular.ttf' })
export { inter, lora, sourceCodePro400, sourceCodePro700, greatVibes }これらの定義を次のようにコードで使用できます:
import { inter, lora, sourceCodePro700, greatVibes } from '../styles/fonts'
export default function Page() {
return (
<div>
<p className={inter.className}>Interフォントを使用したHello world</p>
<p style={lora.style}>Loraフォントを使用したHello world</p>
<p className={sourceCodePro700.className}>
ウェイト700のSource_Sans_3フォントを使用したHello world
</p>
<p className={greatVibes.className}>Great Vibesフォントのタイトル</p>
</div>
)
}import { inter, lora, sourceCodePro700, greatVibes } from '../styles/fonts'
export default function Page() {
return (
<div>
<p className={inter.className}>Interフォントを使用したHello world</p>
<p style={lora.style}>Loraフォントを使用したHello world</p>
<p className={sourceCodePro700.className}>
ウェイト700のSource_Sans_3フォントを使用したHello world
</p>
<p className={greatVibes.className}>Great Vibesフォントのタイトル</p>
</div>
)
}コード内でフォント定義に簡単にアクセスできるようにするには、tsconfig.json または jsconfig.json ファイルで次のようにパスエイリアスを定義できます:
{
"compilerOptions": {
"paths": {
"@/fonts": ["./styles/fonts"]
}
}
}これで、次のように任意のフォント定義をインポートできます:
import { greatVibes, sourceCodePro400 } from '@/fonts'import { greatVibes, sourceCodePro400 } from '@/fonts'プリロード
サイトのページでフォント関数が呼び出されると、それはグローバルに利用可能ではなく、すべてのルートでプリロードされません。代わりに、フォントは使用されるファイルのタイプに基づいて関連するルートでのみプリロードされます:
バージョン変更
| バージョン | 変更内容 |
|---|---|
v13.2.0 | @next/font が next/font に改名されました。インストールが不要になりました。 |
v13.0.0 | @next/font が追加されました。 |