Claude CodeにブログをAstroへ移行してもらいました
「ブログをNext.js(SSG)に移行しました」で紹介した通り、このブログはNext.js + Reactで実装されていました。
4年ほど経っていくつか問題も抱えていたので、今度はAstroに移行しました。
また、その際Claude Codeを最大限活用し、その結果1日ほどで移行が完了しています。
移行に至った背景やどのようにAIを活用したのかについて紹介します。
背景
移行しようと思ったのは、新しい技術を触れてみたかったからです。
というのが純粋なモチベーションですが、このブログは多くの問題を抱えていました。
- 更新できていないフレームワーク(Next.js, React)やライブラリ
- 不要なインフラコスト
- ブログのコンテンツはサーバで管理していたため、データベースやAPIサーバの費用がかかっていました
- 記事の更新のしにくさ
- ブログ記事をサーバのデータベースに保存する必要があり、それが記事更新の一つのハードルになっていました
- 拡張性の低さ
- 多言語対応をしたい気持ちはありつつ、現状だと対応にコストがかかる状態でした
AIを使えばマイグレーションもすっとできるのでは?と思い立ち、早速フレームワークの選定からはじめました。
なぜAstroを選んだのか
まずはChat GPTにおすすめのフレームワークを聞いてみます。
ここではじめてAstroの存在を知りました。
AstroはできるだけJavaScriptをブラウザに送らないことで高速化していることを知り、こういったブログ記事には非常に向いていると感じました。
また、Markdownのコンテンツをサポートしていて、課題の一つである記事の更新のしにくさも改善できそうでした。
別の選択肢としてDocusaurusがあったのですが、こちらはカスタマイズが少ししにくいのと、Astroの目新しさに惹かれました。
マイグレーション手順
今回マイグレーションにあたってClaude Codeを最大限活用しました。
Proプラン(月額$20)を契約しており、モデルは「Claude Sonnet 4」を利用しています。
1. orphan branchを作る
今回は完全に新しいプロジェクトを作ることにしました。
新しいrepositoryを作っても良かったのですが、まっさらなgit branchを使うことにしました。
orphan branchと呼ぶらしいのですが、作り方を全く覚えてないのでClaude Codeに作ってもらいます。
完全に新しい空のディレクトリのブランチを作成してください
ブランチ名はastroにしてください
すると以下のコマンドが実行されました。
git checkout --orphan astro
git rm -rf . && git clean -fxd
良さそうです。
2. Astroの新規プロジェクトを作成する
Astroのプロジェクトの作り方を調べるのもめんどくさいので、ドキュメントへのリンクと、ブログサイトを作りたい旨をClaude Code伝えます。
以下のようにblog templateで新規作成してくれました。
npm create astro@latest -- --template blog
npm install
3. git worktreeで古いプロジェクトを参照できるようにする
既存のコードを参照するために、git worktreeを使って古いブランチを別ディレクトリで開きます。
ここだけは手動で行いました。
4. レイアウトを移行する
既存のファイルを指定しながら、TopページやContactページを作っていきます。
一気に色々やらせようとすると意図しない動作をするので、少しずつ細かく指示をしていきます。
5. コンテンツを移行する
ブログの内容はサーバに保存されていたので、これをマークダウンファイルに変換する必要がありました。
APIのエンドポイントを教えて変換して、と伝えると、フォーマットはあっているが内容が不正確なものになっていました。
一度ブログ内容を理解したうえで書き直そうとしていたようです。
そこで、移行するためのスクリプトを書いて実行して、と伝えるとうまくいきました。
動画や画像をダウンロードし、パスを書き換えるという作業も、スクリプトの作成を依頼するとスムーズに完了しました。
まとめ
そんなこんなで手を動かしたのは約8時間、1日で移行が完了しました。
爆速で移行が完了し、またサイトの動作も爆速なので非常に満足しています。
普段はAndroidをメインで書いているので、Webは本当にたまにしか読み書きしないのですが、そういう不慣れなプラットフォームを触るのにAIは非常に向いていると思います。
Astroも初めて触れましたが、AIの力もあり何も問題ありませんでした。
Reactと似た形でコンポーネントが定義できるので、理解しやすかったのもありそうです。
これくらいの規模のサイトであれば、作って壊してを繰り返すのがちょうど良いかもしれません。
今後の展望としては、今まであった人気のブログ記事がまだ表示できていないので、ちょっと仕組みを考えようと思っています。