Nuxt Nation 大会即将到来。加入我们,时间为 11 月 12 日至 13 日。

fontaine
@nuxtjs/fontaine

基于字体度量自动优化字体回退

Nuxt Fontaine

npm versionnpm downloadsGithub ActionsCodecov

用于 Nuxt 3 的字体度量回退实现

特性

⚠️ @nuxtjs/fontaine 处于积极开发中。⚠️

  • 💪 通过使用精心设计的字体度量的本地字体回退来减少 CLS。
  • ✨ 自动生成字体度量和回退。
  • ⚡️ 纯 CSS,零运行时开销。

在游乐场项目中,启用/禁用此模块会使以下差异呈现 /,无需任何自定义

之前之后
CLS0.340.013
性能8898

下一步

为了获得最佳性能,您需要内联所有 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 以在开发模式下启动 游乐场

鸣谢

如果没有以下内容,这将是不可能的

许可证

用心制作 ❤️

根据 MIT 许可证 发布。