StudioのCMS記事をEmDashやAstroへ移すにはどうしますか?

結論

Studioには記事を書き出す機能がないため、公開中のページからURLと本文を集め、移行先で記事を作り直すことになります。編集者が画面から更新したいならEmDash、開発者だけでファイルを管理するならAstro単体が合いますね。

EmDashへの移行更新日

EmDashとAstro単体はどう違い、どちらを選べばいいですか?

開発者がコードで更新を完結させるAstro単体と、ブラウザの管理画面から記事を編集できるEmDashでは、想定する運用の役割がはっきり分かれます。

Astro単体だと記事はMarkdownしか使えない、と思われがちです。実際には、ローカルファイルのほかにCMSやデータベース、APIからも記事を取得でき、取得のタイミングもビルド時とリクエスト時から選べます。標準では静的ページを生成しますが、アダプターを追加すれば一部または全部のページをリクエスト時に作れます。静的HTML専用というわけでもありません。

AstroのContent Collectionsを使えば、更新頻度の少ない記事はビルド時に効率よく処理し、頻繁に変わるデータはライブコレクションで取得できます。もっとも、ライブコレクションは再ビルドなしで新しいデータを取れますが、リクエストのたびに取りに行く分、表示側に負担がかかります。

一方のEmDashは、Astroの統合機能(integration)として動作するCMSです。管理画面、ユーザー認証、メディア管理が最初から備わっており、非開発者でも管理画面からコンテンツを更新できます。コンテンツの種類はコードではなくデータベース側で定義するため、管理画面上でコレクションを増やす操作も可能です。データベースもCloudflare D1に限らず、SQLiteやTurso、PostgreSQLなどを用途に合わせて選べます。

選ぶときは、誰が記事を更新するか、管理画面が要るか、更新のたびに再ビルドを待てるか、の3点を見てください。更新するのが開発者だけで、公開まで待てるならAstro単体で足ります。Studioのように画面から記事を直したい人がいるなら、EmDashのほうが今の運用に近いですね。

StudioのCMS記事をEmDashへ移す手順は?

Studioで公開してきたCMS記事を、どのような流れでEmDashへ移せばよいでしょうか。Studioのデータ書き出し仕様ではCMSデータやデザイン、ページ情報のエクスポート機能が用意されていません。そのため、公開中のページから記事を集め、EmDash側で登録し直します。大まかな流れは次のとおりです。

  1. Studioのダッシュボードの設定から一般を開き、サイトマップファイルをオンにする
  2. /sitemap.xmlから記事のURLを集める
  3. npm create emdash@latestでEmDashのプロジェクトを作る(Blogテンプレートもあります)
  4. 管理画面で、Studioのモデルに合わせたコレクションを作る
  5. 記事と画像を登録し、表示を確かめる

ただし、このファイルにはモーダルやnoindexを指定したページが含まれないため、除外された記事がないか別途見落としを確かめましょう。非公開のサイトでサイトマップをオンにした場合、URLが有効になるのは公開したときです。

記事数が多いなら、EmDashのMCPサーバーを使った登録も選べます。記事を作るcontent_createにはcontent:write、画像などを上げるmedia_uploadにはmedia:writeのスコープが必要で、認証トークンとユーザー権限も用意しましょう。登録の前にschema_get_collectionを使えば、項目名、型、制約、検証ルールを確かめられます。media_uploadが受け取るのはBase64形式のデータで、画像URLを渡すだけでは登録できません。ファイルサイズとMIMEタイプの制限もかかります。

あわせて、EmDashはCloudflareのD1・R2・Workersでも、SQLiteを使うNode.jsサーバーでも動きます。どちらに置くかは、手順3の前に決めてください。

Cloudflare上のEmDashはD1やR2をどう使うのですか?

Workers上で動くEmDashでは、記事テキストをサーバーレスSQLデータベースのD1に収め、アイキャッチなどの画像をオブジェクトストレージのR2へ預ける構成が標準的です。設定例ではD1への接続バインディング名を「DB」、R2への接続名を「MEDIA」として指定します。Cloudflare向けテンプレートを使っていれば、設定ファイルにリソース名を記述してビルド後にpnpm wrangler deployを実行した際、該当するD1やR2が未作成であればWranglerが初期リソースを立ち上げます。

ちなみに、R2に保存した画像を外部へ配信する際は、publicUrlで公開用ドメインを割り当てましょう。ただし、管理画面から日次JSONバックアップを有効にして同じバケットに保存する場合、backups/という接頭辞のフォルダに保存されるため、バケット全体を不用意に公開するとバックアップファイルまで閲覧される恐れがあります。画像メディア専用の公開経路を用意するか、非公開バケットを適切に設定してください。

データベースの更新では、通常はWorkerへの初回アクセス時にコア移行が動きます。しかし、大量のデータを投入する大規模な移行では事前にemdash migrateコマンドを完了させておく必要があり、完了前は503エラーが返されます。

もうひとつ、日次のJSONバックアップは管理画面で有効にし、保持数を1〜30ファイルから選びましょう。Cloudflareでは定期実行用のCron Triggerも必要です。ただ、このJSONバックアップからは復元できません。移行に失敗したときの戻り先には、D1の時点復元を使います。D1のTime Travelで戻せる期間は、Workers Freeで過去7日、Workers Paidで過去30日です。移行の前に、復元位置を示すブックマークを記録しておきます。

EmDashのテーマやデザインをAstroで自作するには?

Studioで作り込んだ独自のデザインを、EmDashで再現するには何から手をつければよいでしょうか。Studioのデザインを自動で変換する方法はないため、公開中のサイトを見ながらAstroで組み直しましょう。自作テーマはAstroプロジェクトとして構築します。ページのテンプレート、共通ヘッダーやフッターのレイアウト、CSSのスタイリングに加え、記事の入力項目を定義するseedファイルを用意して組み立てていきます。

ゼロから書くのが大変なときは、EmDashのテーマ作成ガイドでも触れられているBlogやMarketing、Portfolioといった公式テンプレートを出発点に選ぶとスムーズです。特にBlogテンプレートにはタグやカテゴリ、サイト内検索、RSS出力の機能が最初から備わっています。だから、Studioのブログを移すなら、ここから手を入れていくと早いでしょう。

テンプレート内でのデータ取得には、EmDash専用の関数を呼び出します。記事の一覧はgetEmDashCollection、個別記事のデータはgetEmDashEntryで読み込み、本文のブロックデータはPortableTextコンポーネントを使ってHTMLへ変換します。現行のテンプレートはサーバー出力形式となっており、アクセスがあるたびに最新のコンテンツを取得して描画する動きです。通常の記事ページにgetStaticPathsを足す必要はありません。

Cloudflare Workers上でD1を接続する場合、astro.config.mjsの統合設定にemdash({ database: d1({ binding: "DB" }) })と記述し、wrangler.jsoncで割り当てたD1のバインディング名と合わせます。

ところで、デザインを作るときは、管理者があとで変える文言と固定の文言を分けておきます。変える値は設定、コンテンツ、メニュー、ウィジェットに持たせ、変えないデザイン上の文言はAstroファイルに書いたままで構いません。

最後に、依存関係をインストールしてビルドと型チェックを行い、空のデータベースで初期設定を試します。サンプル記事の有無、空のコレクションの表示、管理画面での変更が反映されるかも確認します。初期化済みのデータベースには、再ビルドしてもseedは入り直しません。

EmDashのフォームにreCAPTCHAやCloudflare Turnstileを付けられますか?

問い合わせフォームを運用していると、迷惑メールや自動送信スパムへの対策が欠かせない場面に出くわします。Studioでは管理画面のAppsメニューからGoogle reCAPTCHA v3を連携し、サイトキーやシークレットキー、判定のしきい値を入力するだけでスパム対策を設定できました。EmDashへ移るときも同じ守りを付けたいところですね。

EmDashには@emdash-cms/plugin-formsというフォーム用のプラグインがあり、独自のバージョン番号と、必要なEmDashの最低バージョンが決まっています。CAPTCHAに標準で対応しているかは、入れる前にプラグイン側の説明で確かめ、対応していなければ自分で組み込みます。

自分で組み込む場合、画面に部品を置くだけでは足りません。Turnstileのサーバー検証に関する説明の通り、フォーム送信時に届いたトークンをサーバー側でSiteverify APIに送り、判定結果が合格であることを確認してから送信処理を受け付ける処理が必要です。Google reCAPTCHA v3を採用する場合も同様で、フロント側で生成したトークンをバックエンドへ引き渡し、APIレスポンスのaction名が想定したフォーム送信と一致しているかを確かめる設計にします。Studioのように画面操作だけで完結する仕組みとは異なり、サーバー側での検証処理を忘れずに組み込んでおきましょう。

こんな聞き方も

  • emdash astro
  • emdash cms astro
  • astro emdash cms
  • cloudflare astro emdash
  • em dash vs astro
  • StudioのCMSをEmDashやAstroに移すにはどうしますか?
  • AstroとEmDashを組み合わせた構成はどうなりますか?
  • EmDashのテーマをAstroで自作するにはどうしますか?
  • Cloudflare上のEmDashはD1やR2をどう使うのですか?
  • EmDashのフォームにreCAPTCHAやCloudflare Turnstileを付けられますか?

あわせて知りたい(関連する疑問)

QStudioからEmDashへ記事を自動で取り込む機能はありますか?

EmDashにはWordPressからの取り込み機能があるので、Studioにも同じものがあるのでは、と期待する人もいるでしょう。残念ながら、StudioからEmDashへ直接記事を取り込む専用のインポート機能はありません。

EmDashの取り込み機能には、WordPressのWXRファイルをアップロードする方法と、WordPress側のEmDash Exporterプラグインに接続する方法があります。取り込み元の一覧に載っているのはWordPress向けの3種類だけで、Studio専用のものはありません。そのうちwordpress-restは、公開サイトを調べて件数を確かめるだけで、記事自体は取り込みません。

Studioの管理画面にあるWordPress関連の取り込み機能は、WordPressで出力したXMLをStudio側へ流し込むための下り機能であり、Studioから外へデータを取り出す用途には使えない仕組みです。さらに、Studio側のシステム仕様としても、記事やカテゴリなどのCMSデータ、ページ情報、ソースコードを一括で書き出すエクスポート機能は備わっていません。

したがって、移行を進める際は、ブラウザで公開中の記事を確認しながら1本ずつ手作業でEmDashの管理画面へ移すか、サイトマップのURLを手がかりにスクリプトやAPIを組んで独自にデータを移し替える必要があります。自動で移行が終わる公式ツールを期待して作業計画を立てると大きく狂ってしまうため、移行作業にはまとまった時間を見込んでおくとよいでしょう。

QAstro単体で始めて、あとからEmDashを足せますか?

Astro単体で作ったサイトに、あとからEmDashを入れることはできるのでしょうか。答えはできます。EmDashはAstroの設定に組み込むCMSなので、既存のプロジェクトに追加する既存サイト向けの導入手順が用意されています。

ただし、設定に1行足せば終わりではありません。Node.js向けの手順では、まず次のパッケージを入れます。

npm install emdash @astrojs/node @astrojs/react react react-dom

公開ページでReactを使っていなくても、管理画面にReactが必要です。そのうえで出力をserverにしてサーバー用のアダプターを設定し、astro.config.mjsとsrc/live.config.tsを書きます。Astroで要求に応じてページを動的生成するにはサーバーアダプターの追加が不可欠となるため、配信環境に合わせた設定変更を忘れずに行いましょう。すでにサーバー用アダプターを入れているなら、2つ目は足さず、その配信先の条件に合わせます。

既存のファイルベースで管理していたコンテンツ設定と併用できる点も扱いやすいところです。Markdownで書いてきた記事を残したまま、新しい記事だけEmDashで管理する形も取れます。

導入できたら、/_emdash/admin/で初期設定を済ませ、記事を1本保存して公開します。サーバー描画のテストページで公開済みの記事を一覧表示し、画面に出れば完了です。

つまり、最初はエンジニアがMarkdownファイルで運用を始め、組織が大きくなって編集担当者用の管理画面が必要になった段階で追加する、といった段階的な導入にも向いていますね。

QStudioの画像はどこに置けばいいですか?

EmDashをCloudflare Workersで動かすなら、設定ファイルに storage: r2({ ... }) と書き、画像などのメディアをR2に保存できます。管理画面やMCPから上げた画像は、このR2に入ります。R2を使わない構成もあるので、必ずR2というわけではありません。

また、Astro単体でサイトを管理する場合、画像ファイルはプロジェクトのフォルダ内に直接配置できます。サイズ変換や最適化をかけたい画像はsrc/に置きます。public/に置いた画像は手を加えられずにそのまま配信されるので、重い画像は軽くなりません。Studioの記事画像を一括で入れるなら、src/側に置いたほうが表示は軽くなりやすいでしょう。

一方で、R2のバケットを直接公開して画像を配る方法もあります。この場合、r2.devの公開URLにはアクセスの制限があり、使えるのは開発用途に限られます。本番環境で一般の読者に画像を安定して届けるには、バケットに対して独自ドメインを割り当てて公開しなければなりません。EmDashを通して配信する場合とは設定が別なので、どちらで配るかを先に決めておきます。

なお、元画像がパソコンに残っていない場合は、公開ページから1枚ずつ手元にダウンロードして移し替えることになります。Studio上の画像URLをそのまま参照し続けられる保証もないため、ファイルは移行先に置き直してください。

QAstroとEmDashはどちらが速いですか?

AstroとEmDashは、速さを比べる別々のエンジンではありません。EmDashはAstroの上に作られたCMSなので、比べるのは「Astro単体で事前に作ったページ」と「EmDashを組み込んでリクエストごとに記事を取るページ」の違いです。

純粋な表示速度だけで比較すれば、アクセス時に計算を行わず静的なHTMLを返すAstro単体の事前ビルド構成のほうが原理的に有利でしょう。閲覧時にサーバー側でHTMLを生成する待ち時間が発生せず、背後にあるデータベースの応答速度にも左右されないためです。一方、EmDashではAstroのLive Collectionsの仕組みを使ってコンテンツを取得しており、記事を更新した際もサイト全体の再ビルドを待たずに新しい内容を表示できる利便性があります。更新がすぐ届くことと、訪問者の画面が速く出ることは別の話です。

EmDashでも速く表示できないわけではありません。Cloudflareのブログは、EmDashを使いながら複数のキャッシュを重ねて、速さと止まりにくさを支えています。ただし、これはCloudflare自身の構成での例で、どのEmDashサイトでも同じ速さになるとは限りませんね。

結局のところ、自分のサイトで測ってみるのがいちばん早いですね。PageSpeed Insightsでは、検証環境での計測データと、実際の利用者のデータの両方を見られます。検証環境のデータだけでは本当の遅い原因を見落とすことがあり、作ったばかりのページは利用者のデータがまだ足りない場合もあります。

出典

この内容をChatGPTで相談

無料診断