Astro製のサイトにPagefindを導入する
Astroで構築された静的サイトに検索ライブラリであるPagefindを導入します
Pagefindとは?
Pagefindは、静的サイト向けの全文検索ライブラリ・UIライブラリです。
本サイトの記事検索機能はこのPagefindを用いて実装されています。
HugoやNext.js、SvelteKit、Astroなどの静的サイトジェネレータによってビルドされた後のHTMLに対してインデックスを作成し、検索をかけることができます。また同時にUIライブラリも提供されており、10行程度のコードを書き加えるだけで簡単にWebサイトへ検索機能が追加できます。
Astro製サイトに導入する
Pagefind公式が提供するライブラリを用いても良いですが、本記事(本サイト)ではastro-pagefind
を使用しています。このライブラリには、開発モード(npm run dev
した場合)でも検索機能を使用できる1、Astroの提供するViewTransitionsに対応している、などの利点があります。
導入手順は以下の通り。
astro-pagefind
をインストール
astro.config.mjs
に設定を追加
Search
コンポーネントを追加
pnpm run dev
でローカルサーバを起動する
検索対象を指定する
data-pagefind-body
をつけると、その要素以下が検索の対象になります。本サイトでは、markdownの記事本文のみを検索対象に指定しています。
なお、検索から除外したい要素にはdata-pagedind-ignore
を追加します。
メタデータを設定する
Pagefindでは、data-pagefind-meta
属性を指定することでメタデータを指定できます。このメタデータは検索結果と共に表示されます。
デフォルトでは、title
、image
、image_alt
の3種類を自動で抽出します。
image
メタデータは、ページの中で最初に登場する画像が設定され、検索結果画面でのサムネイルに使用されます。本サイトでは、image
メタデータをOG画像として使用している画像と同じものに設定するため、以下のような実装をしてメタデータを上書きしています。(メタデータがdata-pagefind-body
で指定した要素の内にある必要はないようです。)
また、data-pagefind-meta
属性にkey:value
構文で好きなメタデータを追加することができます。本サイトでは記事のカテゴリをメタデータとして追加しています。このほかメタデータとしては執筆日時・更新日時・執筆者・タグなどが考えられるでしょうか。
フィルターを設定する
Pagefindでは以下の画像のように、記事の検索結果についてさらにフィルターをかけることができます。
data-pagefind-filter
属性を用いることで、ページをフィルター名に関連付けることができ、要素の内容(以下の例ではeno1220
)がフィルタの値として扱われます。
本サイトでは以下のように記事につけられたタグに対してフィルター値を設定しています。
スタイルを変更する
初期時点では、pagefindの提供するデフォルトのスタイルが適用されています。CSSのカスタム変数を上書きするかオリジナルのCSSを当てることで、このスタイルを変更することができます。
本サイトのカスタム変数は以下の通りです。参考までに…
おわりに
Pagefindを用いることで、非常に手軽にWebサイトにリッチな検索機能を追加することができました。
今回紹介した機能の他にも、検索結果の重み付けやソート等の便利な機能があるようなので、ぜひ試してみてください。
参考文献
脚注
-
本来は、ビルドした後に
npx pagefind --site dist
でインデックスを作成してやる必要があり、開発モードでは検索機能が使用できない。 ↩
記事の要約を生成(beta)
※要約はGemini Nanoによって生成されたものです。内容の正確性を保証するものではありません。
Chrome組み込みのLLM「Gemini Nano」を利用して記事の要約を生成します。 生成には数十秒程度かかることがあります。 デバイスのCPUやメモリ、バッテリーの使用率が上昇することがありますのでご注意ください。
eno1220
Webフロントエンドや低レイヤー(OSや言語処理系等)が好きな18歳です。
42Tokyoでプログラミングの勉強をしています。