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('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を実行して、開発モードでプレイグラウンドを開始します。

クレジット

これは以下の協力なしには不可能でした

ライセンス

❤️を込めて作られました

MITライセンスの下で公開されています。