Astroでトップページを最新記事にしたい
トップページは常に最新記事にしたい、つまりビルドするごとに内容が変わる(かも)という状態にしたい。 WordPressなんかでトップページを「最新の投稿」にする、みたいな設定がある思うんですが、ああいうイメージです。
Routing -> Rest parameters -> undefined でできる
結論からすると、[...slug].astro
で、path
にundefined
を指定するとトップレベルのindex.html
になりました。痒いところに手が届いてて助かる……。
ドキュメント:Routing 🚀 Astro Documentation
index.astroに書けば…?
pages/index.astro
に最新記事を取得して出力するコードを書いてももちろんできるんですが、個別記事を出力するファイル(つまりpages/posts/[slug].astro
みたいなやつ)とほぼ同じことを書くことになるので、1つのファイルで済ませたいな、というのが前提でした。
もうちょっと具体的に
pages/[...slug].astro
を用意するgetStaticPaths()
関数に、記事を取得してきて配列を返すコードを書く- 配列の最後に、最新記事をコピーして
params.path
をundefined
に変更した要素を入れておく
こんな感じ
const paths = posts.map(post => { //...なんか記事データの処理 return { params: {path: `posts/${post.id}`}, props: { // } } }) const lastItem = Object.assign({params: {}, props: {}}, paths[paths.length - 1]) lastItem.params = {path: undefined} paths.push(lastItem) return paths
こうすると、path
がundefined
な要素は親階層のパスになるので、/dist/index.html
に書き出される。