Font Optimization
next/font
将自动优化你的字体 (包括自定义字体),并移除外部网络请求以提高隐私性和性能。
🎥 观看: 了解更多关于使用 next/font
的信息 → YouTube (6 分钟)。
next/font
包含 内置的自动自托管功能,适用于 任何 字体文件。这意味着你可以以零布局偏移的方式最佳地加载网页字体,这要归功于底层使用的 CSS size-adjust
属性。
这个新的字体系统还允许你方便地使用所有 Google Fonts,同时考虑到性能和隐私。CSS 和字体文件在构建时下载,并与你的其他静态资源一起自托管。浏览器不会向 Google 发送任何请求。
自动自托管任何 Google Font。字体包含在部署中,并从与你的部署相同的域名提供服务。浏览器不会向 Google 发送任何请求。
首先,从 next/font/google
中将你想使用的字体作为函数导入。我们建议使用 可变字体 以获得最佳的性能和灵活性。
要在所有页面中使用字体,请将其添加到 /pages
下的 _app.js
文件 中,如下所示:
如果你不能使用可变字体,你将 需要指定字重:
你可以通过使用数组来指定多个字重和/或样式:
值得注意的是:对于由多个单词组成的字体名称,请使用下划线 (_)。例如,Roboto Mono
应该导入为 Roboto_Mono
。
你也可以在不使用包装器和 className
的情况下使用字体,只需将其注入到 <head>
中,如下所示:
要在单个页面上使用字体,请将其添加到特定页面中,如下所示:
Google Fonts 会自动进行 子集化。这可以减小字体文件的大小并提高性能。你需要定义要预加载的子集。如果在 preload
为 true
时未指定任何子集,将会出现警告。
你可以通过将其添加到函数调用中来实现这一点:
查看 字体 API 参考 以获取更多信息。
你可以在应用程序中导入和使用多种字体。有两种方法可以实现这一点。
第一种方法是创建一个实用函数,导出字体,导入它,并在需要时应用其 className
。这确保只有在渲染时才会预加载字体:
在上面的例子中,Inter
将全局应用,而 Roboto Mono
可以根据需要导入和应用。
另外,你可以创建一个 CSS 变量 并使用你喜欢的 CSS 解决方案:
在上面的例子中,Inter
将全局应用,而所有 <h1>
标签将使用 Roboto Mono
样式。
建议: 谨慎使用多种字体,因为每种新字体都是客户端需要下载的额外资源。
导入 next/font/local
并指定你的本地字体文件的 src
。我们建议使用 可变字体 以获得最佳性能和灵活性。
如果你想为单个字体家族使用多个文件,src
可以是一个数组:
查看 字体 API 参考 以获取更多信息。
next/font
可以通过 CSS 变量 与 Tailwind CSS 一起使用。
在下面的例子中,我们使用 next/font/google
中的 Inter
字体 (你可以使用任何来自 Google 或本地字体的字体)。使用 variable
选项加载你的字体以定义 CSS 变量名称,并将其分配给 inter
。然后,使用 inter.variable
将 CSS 变量添加到你的 HTML 文档中。
最后,将 CSS 变量添加到你的 Tailwind CSS 配置:
现在你可以使用 font-sans
和 font-mono
工具类来将字体应用到你的元素上。
当在你网站的某个页面上调用字体函数时,它不会全局可用并在所有路由上预加载。相反,字体只会根据使用它的文件类型在相关路由上预加载:
- 如果是 唯一页面,它会在该页面的唯一路由上预加载
- 如果是在 自定义 App 中,它会在
/pages
下的网站的所有路由上预加载
每次调用 localFont
或 Google 字体函数时,该字体都会作为一个实例托管在你的应用程序中。因此,如果你在多个文件中加载相同的字体函数,同一字体的多个实例将被托管。在这种情况下,建议执行以下操作:
- 在一个共享文件中调用字体加载器函数
- 将其导出为常量
- 在每个你想使用这种字体的文件中导入该常量