Astro を使ってポートフォリオを作った

2025/11/24

Astro を一度触ってみたかったので、新しいポートフォリオを Astro で作ってみた。

前のポートフォリオを作ったときは Next.js を使ってたけど、その時に比べてよりミニマムな構成で軽量なページを作ることに関心が増えてきたので、Astro に興味が湧いてきた感じ。

作る過程で触った機能とか工夫した点をまとめておく。

ブログ記事の管理

以前のポートフォリオでは、ブログは Notion で書いて Super で公開する形にしていた。

ただ、ブログも含めてポートフォリオ内で管理したいよなあと思ったので、Astro の Content Collection を使って管理することにした。

Content Collection を使うと、Markdown ファイルを HTML に変換してくれたりメタデータを型安全に扱えたりするので、ブログの管理が楽になった。

const blog = defineCollection({
  loader: glob({ pattern: '**/*.md', base: './src/content/blog' }),
  schema: blogSchema,
})

また、例えば↑みたいなコードのシンタックスハイライトはデフォルトで Shiki が入っているので、特にカスタマイズせずに表示できるのは嬉しかった👨‍🎨

OGP の生成

ブログも含めて全てのページに OGP を設定したかったので、ビルド時に各ページの OGP を生成する方法を採った。

OGP 画像の作成には、JSX から画像を生成できる satori を使っている。

ブログの追加などにも対応できる形で OGP を生成するには SSR をして動的に生成するしかないと思っていたが、SSG でも対応できる方法があるというのが学びだった📝

View Transition

View Transition を使って、ページ遷移時のアイコンの移動をスムーズにしたかった。

Astro で View Transition を使うための方法 の一つとして <ClientRouter /> を使う方法があり、このコンポーネントを使うだけで View Transition が有効になるのでこれを利用した。

これにより、ページ移動時の全体の繊維がスムーズに行われるようになった。

便利な一方で、このコンポーネントを使うと MPA ではなく SPA として動作するようになるという制約がある⚠️

アイコンの移動をスムーズにする実装は、アイコンのクラスに transition:name="portrait" を追加するだけで完了した。

MCP の活用

Astro では MCP を提供しているので利用した。

普段使っている Claude Code に MCP をセットアップすることで、Astro の仕様や API についての質問も AI に聞けるようになり便利だった。