【Astro】ブログ記事を動的にルーティングする
目次
執筆時の作業環境は以下のとおりです。
- MacOS: Sonoma 14.2.1
- Node.js: v21.6.1
- npm: v10.2.4
- Astro: v4.4.0
はじめに
Astroでは、コンテンツコレクションを使ってブログの記事などのコンテンツを管理することができます。コンテンツコレクションについての詳細はこちらをご覧ください。
コンテンツコレクションはpages
ディレクトリ内にあるわけではないので、Webページとして表示するためにルーティングをする必要があります。AstroではgetStaticPath()
を使ってコンテンツコレクションを動的にルーティングできます。
ルーティングのためのファイルを作成する
まずはページをどの改装に作成するかを決めるため、ルーティング用のファイルを作成します。今回は/blog/post-1
のように作成したいので、src/pages/blog
ディレクトリ内に[slug].astro
というファイルを作成します。
ページ内で[slug]
の部分にパラメータを受け取ってルーティングをします。
ルーティングを実装する
ルーティングを実装するためのコードの全体像はこちらです。
---
// ①
import { getCollection } from 'astro:content'
// ②
export async function getStaticPaths() {
const blogEntries = await getCollection('blog')
return blogEntries.map((entry) => ({
params: { slug: entry.slug },
props: { entry },
}))
}
// ③
const { entry } = Astro.props
const { Content } = await entry.render()
---
<Content />
① getCollection
をインポートする
getCollection
はコンテンツコレクションからデータを取得するためのAPIです。
---
// ①
import { getCollection } from 'astro:content'
---
② getStaticPaths
を使ってパラメータを設定する
getStaticPaths
では、返り値にparams
とprops
のプロパティをもつオブジェクトを配列で渡すことで、params
の値をURLスラッグに変換してページを作成します。
このコードでは、getCollection
で取得したデータをmapで展開して、各データのslug
プロパティの値をparams
に格納しています。
また、props
に記事データを格納することでページ内で使用できるようにします。
---
// ①
import { getCollection } from 'astro:content'
// ②
export async function getStaticPaths() {
const blogEntries = await getCollection('blog')
return blogEntries.map((entry) => ({
params: { slug: entry.slug },
props: { entry },
}))
}
---
③ 記事をレンダリングする
記事をHTMLにレンダリングするために、render()
メソッドからContent
を定義します。
このContent
をテンプレートエリアで<Content />
と書くことでparams
で設定したURLのページに記事が表示されます。
---
// ①
import { getCollection } from 'astro:content'
// ②
export async function getStaticPaths() {
const blogEntries = await getCollection('blog')
return blogEntries.map((entry) => ({
params: { slug: entry.slug },
props: { entry },
}))
}
// ③
const { entry } = Astro.props
const { Content } = await entry.render()
---
<Content />
Content
でレンダリングされるのは、マークダウンファイルに書かれた部分だけです。
マークダウンのフロントマッターにlayout
というプロパティでレイアウトコンポーネントを指定して<head>
タグなどHTMLに必要な要素を組み込みましょう。
おわり
今回は単階層でのルーティングでしたが、複数の階層にまたがったルーティングをする場合にはレストパラメータを設定できるなど、柔軟な実装が可能です。とても便利ですね。
以上
参考
ルーティング
Astroのルーティングの紹介