Blog
Portfolio Devlog/2 minutes read

microCMSをやめてEmDashに移行した

microCMSを引退してAstroとEmDashでポートフォリオを作り直した

このウェブサイトのブログ部分をmicroCMSからEmDashに移行したので適当に書きます。おそらくこのウェブサイトで一番適当な記事です。

もともとはNext.js + microCMSの構成でしたが、なんとなくデータが手元にないことを不安に思い、自前でデータを管理できるCMSないかなぁ~と考えていました。

それでちょっと考えたら、ある。そういえば私の愛してやまないCloudflareがなんか出してたわ。それこそがEmDashです。Astroベースで、管理画面もあって、MCPも内蔵されてて、なんかWordPressの後継を名乗ってるらしい。でもちろんCloudflareエコシステムと相性がいい。

じゃあ使ってみるか、となりました。

Astro←❓️

EmDashを使うにあたって1つの懸念はAstroでした。Astro触ったことない。なんかJavaScriptを明示宣言で使うらしい???ブログ部分以外の箇所はせっかく作ったので作り直したくない、作り直してデザインが再現できるか不安。

というわけで、一旦はモノレポにして、portfolioとEmDashを分けました。EmDashで記事管理して、portfolio側からAPI叩く作戦です。

完成してから、これportfolioもAstroでよくないか、と思い始めました。モノレポめんどいし。せっかくEmDashを使うなら、Next.jsを残すより、使ったことないAstroを触ってみるのも楽しそうだと思ったからです。

少しリサーチしたところ、幸いなことにReact integrationがありました。既存のコンポーネントを全部捨てる必要はなさそうです。

ここからNext.jsを消して、Astroに移す作業がはじまりました。

まあ動かん

もちろん一発では動きません。

まずReactのhookで怒られました。Invalid hook call←なに???

Astro上でReactコンポーネントを動かすとき、普通に読み込むだけだとReactの実行環境と合わない?みたいな話らしいです。結局、React islandとして client:only="react" を明示して動かす形にしました。非推奨の実装なのかもしれませんが、まあAstro初心者だしいいでしょう。良くなかったら教えてください。

次にEmDashのデータ取得。EmDashとポートフォリオを同じアプリで管理することになったので、予定通りEmDashのコレクション取得を直接使う形に変えました。

次にハマったのが画像です。

コンテンツ側には画像の id を入れてたので、それを使ってリクエストを叩いたら、画像が404。

実際にAPIが受け取るのは meta.storageKey でした。

/_emdash/api/media/file/{id} では404で、正しくは

/_emdash/api/media/file/{storageKey} にしないといけないらしいです。謎。

Docsを読まずにCodexに適当な指示をだしたぼくがわるいです。

結果

最終的に、構成はかなりすっきりしました。

Next.jsは消えて、portfolioは完全にAstroになりました。ブログにはEmDashネイティブの構成を使ってるので、ページ上から編集もできてかなりWordPressっぽい。満足です。

まだ細かい調整は必要かもしれませんが、とりあえず動くようになったので激アツ。