yuw27b’s blog

技術メモと雑記

Astroでトップページを最新記事にしたい

トップページは常に最新記事にしたい、つまりビルドするごとに内容が変わる(かも)という状態にしたい。 WordPressなんかでトップページを「最新の投稿」にする、みたいな設定がある思うんですが、ああいうイメージです。

Routing -> Rest parameters -> undefined でできる

結論からすると、[...slug].astroで、pathundefinedを指定するとトップレベルのindex.htmlになりました。痒いところに手が届いてて助かる……。

ドキュメント:Routing 🚀 Astro Documentation

index.astroに書けば…?

pages/index.astro に最新記事を取得して出力するコードを書いてももちろんできるんですが、個別記事を出力するファイル(つまりpages/posts/[slug].astroみたいなやつ)とほぼ同じことを書くことになるので、1つのファイルで済ませたいな、というのが前提でした。

もうちょっと具体的に

  1. pages/[...slug].astroを用意する
  2. getStaticPaths()関数に、記事を取得してきて配列を返すコードを書く
  3. 配列の最後に、最新記事をコピーしてparams.pathundefinedに変更した要素を入れておく

こんな感じ

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

こうすると、pathundefinedな要素は親階層のパスになるので、/dist/index.htmlに書き出される。