Nuxt Fontaine
用于 Nuxt 3 的字体度量回退实现
特性
⚠️ @nuxtjs/fontaine
处于积极开发中。⚠️
- 💪 通过使用精心设计的字体度量的本地字体回退来减少 CLS。
- ✨ 自动生成字体度量和回退。
- ⚡️ 纯 CSS,零运行时开销。
在游乐场项目中,启用/禁用此模块会使以下差异呈现 /
,无需任何自定义
之前 | 之后 | |
---|---|---|
CLS | 0.34 | 0.013 |
性能 | 88 | 98 |
下一步
为了获得最佳性能,您需要内联所有 CSS,而不仅仅是字体回退规则(此模块会自动执行此操作),否则在样式表加载时仍然会出现布局偏移(这就是上面数字不为零的原因)。
此 PR 旨在将此功能引入 Nuxt 本身。
安装
npx nuxi@latest module add fontaine
使用
export default defineNuxtConfig({
modules: ['@nuxtjs/fontaine'],
// If you are using a Google font or you don't have a @font-face declaration
// for a font you're using, you can declare them here.
//
// In most cases this is not necessary.
//
// fontMetrics: {
// fonts: ['Inter', { family: 'Some Custom Font', src: '/path/to/custom/font.woff2' }],
// },
})
就是这样!
Tailwind CSS
如果您使用 Tailwind CSS 并通过配置文件使用自定义字体,则需要手动添加回退字体。
import type { Config } from 'tailwindcss'
import { fontFamily } from 'tailwindcss/defaultTheme'
export default <Partial<Config>> {
theme: {
extend: {
fontFamily: {
sans: ['Roboto', 'Roboto fallback', ...fontFamily.sans],
},
},
},
}
工作原理
Nuxt 将扫描您的 @font-face
规则并生成具有正确度量的回退规则。例如
@font-face {
font-family: 'Roboto';
font-display: swap;
src: url('/fonts/Roboto.woff2') format('woff2'), url('/fonts/Roboto.woff') format('woff');
font-weight: 700;
}
/* This will be generated. */
@font-face {
font-family: 'Roboto fallback';
src: local('BlinkMacSystemFont'), local('Segoe UI'), local('Roboto'), local('Helvetica Neue'),
local('Arial'), local('Noto Sans');
ascent-override: 92.7734375%;
descent-override: 24.4140625%;
line-gap-override: 0%;
}
然后,每当您使用 font-family: 'Roboto'
时,Nuxt 都会将回退添加到字体系列中
:root {
font-family: 'Roboto';
/* This becomes */
font-family: 'Roboto', 'Roboto fallback';
}
在 Nuxt 之外使用
此模块的核心可以在 Nuxt 之外工作,并且已分离到一个单独的库中:fontaine
。查看它!
💻 开发
- 克隆此存储库
- 使用
corepack enable
启用 Corepack(对于 Node.js < 16.10,请使用npm i -g corepack
) - 使用
pnpm install
安装依赖项 - 使用
pnpm dev:prepare
存根模块 - 运行
pnpm dev
以在开发模式下启动 游乐场
鸣谢
如果没有以下内容,这将是不可能的
- 来自 capsizecss 的惊人的工具和生成的度量
- 来自 Google Aurora 团队的 Katie Hempenius 和 Kara Erickson 的建议和算法 - 请参阅 有关计算字体度量覆盖的说明。
许可证
用心制作 ❤️
根据 MIT 许可证 发布。