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ライセンスに従って公開しています。