Menu

Mobile navigation

v2.1.0 リリースノート: タグクラウドの追加

先日、v2.0.0 をリリースしたばかりであるが、間髪を入れず v2.1.0 を公開する運びとなった。 ここまでスムーズに実装が進んだのは、ひとえに開発環境を整えたおかげである。

目に見えない部分であるがゆえに軽視されがちな開発環境。 しかし、その整備がもたらす効果と、ストレスなく作業が進むこの感覚を、コードに触れない人々にどうわかりやすく伝えるかが今後の課題だ。

さて、今回のリリースではタグページとタグクラウドを作成した。 これらはすべて SSG(静的サイト生成)で Frozen してあるため、表示速度と安定性に優れる点が特徴である。

以下に、いくつかのポイントをまとめておく。

タグクラウドの生成方法

このブログの記事は Contentlayer(正確にはフォーク版の Contentlayer2)を使い、MDX 形式で書かれている。 MDX は柔軟性が高く、拡張することで Frontmatter と呼ばれるメタデータを定義できるため、そこに tags を仕込んでいる。

以下はその例。

index.mdx

---
title: "v2.1.0 リリースノート: タグクラウドの追加"
emoji: 🚀
category: Tech
tags: ["Release note"]
status: draft
publishedAt: 2025-01-13
---
 
[//]: # (記事について...)

タグ一覧用のオブジェクト は別に定義してあるため、そのデータを使ってタグクラウドを生成していく。

ここで少し背景の話をしておこう。 Contentlayer では、すべての記事データを 1 つのオブジェクトにまとめてくれる便利機能がある(たとえば post であれば allPosts というオブジェクトに)。

だが、その内部にはトランスパイルされた MDX データが詰め込まれており、驚くほど重い。 これをそのまま利用すれば、ビルド時間が増大するし、Client Components で扱えば、Lighthouseのスコアは悪化する。 ゆえに、記事データを扱う際には細心の注意が必要だ。

話を戻すと、allPosts を生成する前にはバリデーションを行い、間違ったタグが紛れ込まないよう対策している(ソースはこちら)。 これにより、正確なデータを元にタグページを生成することが可能になる。

そして、記事追加時に以下のコード(抜粋)を npm スクリプトで実行し、タグクラウド用のデータを生成してキャッシュしておく。

pre-build.ts

const generateTagCloudItems = async () => {
  const tagCloudItems = (await Promise.all(
    flatTags.map(async ({ title, slug, emoji }) => ({
      title,
      slug,
      emoji,
      emojiSvg: await generateEmojiSvg({ emoji, isColored: true }),
    })),
  )) satisfies TagCloudItem[];
  writeToFile(
    FILE_PATHS.TAG_COULD_ITEMS,
    "tagCloudItems",
    tagCloudItems,
    "TagCloudItem",
  );
};

絵文字の SVG 化

前述の generateEmojiSvg 関数は、今回のタグクラウド生成の中核となる処理である。 絵文字を SVG に変換するという見た目に関わる大事な部分を担っているが、この処理が意外と重い。 そのため、頻繁に実行するのは避け、生成されたデータをキャッシュすることで効率化を図っている。

絵文字を SVG 化する際は Satori というライブラリを使用している。 以前の記事 では Satori を使って同様に絵文字(Noto Emoji)を SVG に変換していたが、今回使用するのはカラーフォントなので、前回のように簡単にはいかなかった。

このプロセスの肝は loadAdditionalAsset 関数である。 この関数を使い、必要なデータを API 経由で取得し、それを元に絵文字を SVG 化している。

具体的な実装は以下のコードを参照いただきたい。

今回は Microsoft の Fluent Emoji という絵文字に変換しているが、他にも以下の絵文字に変換することも可能。

1 つ注意しなければならないのは、絵文字の SVG 化を支える API の URL が変更された場合である。 このような事態が発生すると、当然ながら絵文字が正しく表示されなくなる。 その際は手動で修正する必要があるが、問題に気づくタイミングはおそらく「なんか絵文字が表示されない…」という状況になってからだろう。

これを未然に防ぐため、特定の部分に Visual Regression Testing を導入するのも一つの手かもしれない。

さいごに

今まで面倒で避けていたが、実装してみると意外と便利なものだ。

これまで記事を書くときにタグを深く考えていなかったが、これを機にちゃんと分類することにした。 制約は創作の幅を広げると言うし、タグを活用すれば記事も書きやすくなりそうだ。