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('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 を有効にするpnpm installを使用して依存関係をインストールするpnpm dev:prepareでモジュールをスタブ化pnpm devを実行して、開発モードでプレイグラウンドを開始します。
クレジット
これは以下の協力なしには不可能でした
- capsizecssによる素晴らしいツールと生成されたメトリクス
- Google AuroraチームのKatie HempeniusとKara Ericksonからの提案とアルゴリズム - フォントメトリクスオーバーライドの計算に関するメモを参照してください。
ライセンス
❤️を込めて作られました
MITライセンスの下で公開されています。