🚀

Astroでローカルフォントを使うときは一手間加えよう!

に公開

Astroの公式ドキュメントにはローカルフォントを使うときは以下のCSSだけが方法として書かれています

https://docs.astro.build/en/guides/fonts/

@font-face {
  font-family: 'DistantGalaxy';
  src: url('/fonts/DistantGalaxy.woff') format('woff');
  font-weight: normal;
  font-style: normal;
  font-display: swap;
}

これだけでも十分なのですが、ここで一手間加えるともっと良くなります

すること

レイアウトを書いている .astro ファイルの head 部分に以下のタグを書き足します

<link rel="preload" as="font" type="font/woff2" href=[path] crossorigin="anonymous" />

[path] の部分は @font-facesrc と同じものを入力してください

フォントは必ず public フォルダ内に置いてください、それ以外の場所に置くと正常に動きません

具体例

サンセリフに Inter を、等幅フォントに JetBrains Mono を使う場合

ファイル構造

/public
  /fonts
    InterVariable.woff2
    JetBrainsMono.woff2
/src
  /style
     app.css
  /pages
     index.astro

app.css

@font-face {
  font-family: "Inter";
  src: url("/fonts/InterVariable.woff2");
}

@font-face {
  font-family: "JetBrains Mono";
  src: url("/fonts/JetBrainsMono.woff2");
}

body {
  font-family: "Inter", sans-serif;
}

code {
  font-family: "JetBrains Mono", monospace;
}

index.astro

---
import '../style/app.css'
---

<!doctype html>
<html>
  <head>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <link rel="preload" as="font" type="font/woff2" href="/fonts/InterVariable.woff2" crossorigin="anonymous" />
    <link rel="preload" as="font" type="font/woff2" href="/fonts/JetBrainsMono.woff2" crossorigin="anonymous" />
    <title>フォント</title>
  </head>
  <body class="antialiased px-5 py-4">
    <p>サンセリフに Inter を</p>
    <p>等幅フォントに <code>JetBrains Mono</code></p>
  </body>
</html>

結果

どんな良いことがあるのか

目に見える変化は少ないです

WebサイトはほとんどがHTMLファイルの読み込みから始まります

CSSファイルしかフォントに関する情報が書かれてないと、HTMLを読み込んだあとにさらにCSSを読み込まれるまでフォントも読み込まれません

そこで、HTMLにフォントに関することを書いておいて、一緒にプリロードすることでフォントがより早く読み込まれて、初回アクセス時の動作がいい感じになります

また、最初の読み込み時に全てのフォントがまとめてキャッシュされるため、等幅フォントが最初にアクセスされたページで使われてなくても、別のページを開くときにフォントの表示がスムーズになります

私はDevtoolsを見るのが趣味なのですが、ソースとネットワークがこのようにいい感じになります

ソース


ソース

ここはどっちの場合でも同じです

ちなみに _astro というフォルダ名は変更することが出来ます

https://docs.astro.build/en/reference/configuration-reference/#buildassets

例えばCloudflareは _willow という誰かの名前みたいな単語になってます

ネットワーク

CSSのみの場合です


ネットワーク、CSSのみ

HTMLを読み込んだあとに、CSSを読み込み、そのときにフォントを読み込むので時間もかかってしまいます(フォント自体が少し重いので結局変わらないかもしれない)


ネットワーク

いいね!

ローカルサーバーで動かしてる関係でそもそもの速度が早すぎるので違いはあまりわかりませんが、それでも1.5倍くらい早くなりました!

ちなみにこれはNextjsのフォント最適化でも行われています


ネットワーク、Nextjs

Nextjsは動作もソースもお洒落です

終わり

ここまで書いてみて、別にやらなくてもいいんじゃないかと思うくらいしょぼく見えてきましたが、それでもタグをひとつふたつ追加するだけで、成果に見合うくらい簡単に出来ることなので、Astroでローカルフォントを使ってフォントにこだわりたいなと思っている方はぜひ試してみてください!

GitHubで編集を提案

Discussion