EmDash & Astro
EmDashは、Astro向けに開発されたオープンソースのフルスタックCMSです。データベースによるコンテンツ管理機能をはじめ、管理画面UI、メディアライブラリ、メニュー、タクソノミーを既存のサイトに追加できます。
Astroとの統合
Section titled “Astroとの統合”EmDashはAstroプロジェクト内で動作し、データベースを利用します。コンテンツの編集は、/_emdash/adminにある管理画面から行えます。各ページでは、ライブコンテンツコレクション (EN)を使用してデータベースからデータを取得し、コンテンツを表示します。
このガイドでは、Node.jsアダプターとローカルのSQLiteデータベースを使用します。対応するデータベースの一覧は、EmDashのドキュメントを参照してください。
- アダプターと
output: "server"(EN)が設定された既存のAstroプロジェクト(Astro 6以降)。 - Node.js v22.16.0以降。
依存関係のインストール
Section titled “依存関係のインストール”EmDashの管理画面はReactで動作するため、Reactは必須の依存関係です。プロジェクトでReactを使用していない場合は、パッケージマネージャーに応じたastro addコマンドでインストールします。
npx astro add reactpnpm astro add reactyarn astro add reactEmDashパッケージもインストールする必要があります。
npm install emdashpnpm add emdashyarn add emdashインテグレーションの追加
Section titled “インテグレーションの追加”Astro設定ファイルにemdash()インテグレーションを追加し、データベースとメディアの保存先を設定します。
import { defineConfig } from "astro/config";import node from "@astrojs/node";import react from "@astrojs/react";import emdash, { local } from "emdash/astro";import { sqlite } from "emdash/db";
export default defineConfig({ output: "server", adapter: node({ mode: "standalone" }), integrations: [ react(), emdash({ database: sqlite({ url: "file:./data.db" }), storage: local({ directory: "./uploads", baseUrl: "/_emdash/api/media/file", }), }), ],});ライブコレクションローダーの追加
Section titled “ライブコレクションローダーの追加”AstroのコンテンツレイヤーでEmDashのコンテンツを取得できるように、src/live.config.tsファイルを作成します。
import { defineLiveCollection } from "astro:content";import { emdashLoader } from "emdash/runtime";
export const collections = { _emdash: defineLiveCollection({ loader: emdashLoader() }),};_emdashコレクションは、内部でコンテンツの種類(投稿やページなど)に応じて処理を振り分けます。src/content.config.tsにある既存のファイルベースのコレクションも引き続き併用できます。
EmDashをローカルで実行する
Section titled “EmDashをローカルで実行する”EmDashで独自のページをテストするには、まずセットアップウィザードを完了する必要があります。セットアップが完了するまではコンテンツが公開されないため、クエリを実行しても空の結果が返されます。
-
Astroの開発サーバーを起動して、データベースを初期化し、管理画面UIを立ち上げます。
ターミナルウィンドウ npm run devターミナルウィンドウ pnpm run devターミナルウィンドウ yarn run devEmDashを初回起動すると、スキーマおよび
pagesとpostsという2つのデフォルトコレクションを含んだdata.dbが作成されます。 -
ブラウザーで
http://localhost:4321/_emdash/adminにアクセスします。EmDashのセットアップウィザードにリダイレクトされます。 -
Siteステップで、サイトのタイトルと任意のキャッチフレーズを入力します。
-
Accountステップで、メールアドレスと名前を入力します。これで管理者アカウントが作成されます。
-
Sign Inステップで、アカウントのセキュリティを設定します。Create Passkeyを選択し、デバイスの生体認証、セキュリティキー、またはPINを使ってパスキーを登録します。
-
作成したパスキーでサインインし、ダッシュボードにアクセスします。
最初の投稿を作成する
Section titled “最初の投稿を作成する”-
ダッシュボードで**+ Post**ボタンをクリックします。
-
タイトルと本文を追加します。EmDashは、ブロックエディターで編集したリッチテキストをPortable Textとして保存します。URLのスラッグはタイトルから生成され、サイドバーで編集できます。
-
Saveをクリックしてから、Publishをクリックします。サイトの訪問者には公開済みの投稿のみが表示されます。
EmDashのコンテンツをレンダリングする
Section titled “EmDashのコンテンツをレンダリングする”getEmDashCollection()とgetEmDashEntry()を使ってコンテンツを取得します。どちらもライブコレクションと同じ仕組みでリクエスト時に結果を返すため、公開した変更は再ビルドなしで反映されます。
投稿一覧の表示
Section titled “投稿一覧の表示”次の例では、公開済みのすべての投稿のタイトルを一覧表示し、それぞれの投稿ページへのリンクを設定しています。
---import { getEmDashCollection } from "emdash";
const { entries: posts } = await getEmDashCollection("posts", { status: "published",});---<ul> {posts.map((post) => ( <li> <a href={`/posts/${post.data.slug}`}>{post.data.title}</a> </li> ))}</ul>個別の投稿の表示
Section titled “個別の投稿の表示”個別の投稿のコンテンツを表示するには、スラッグで投稿を取得し、<PortableText />コンポーネントでPortable Textのコンテンツをレンダリングします。
---import { getEmDashEntry } from "emdash";import { PortableText } from "emdash/ui";
const { slug } = Astro.params;const { entry: post } = await getEmDashEntry("posts", slug);
if (!post) { return Astro.redirect("/404");}---<article> <h1>{post.data.title}</h1> <PortableText value={post.data.content} /></article>フィルタリング、ページネーション、下書きのプレビュー、ビジュアル編集の詳細は、EmDashのクエリガイドを参照してください。
EmDash + Astroのデプロイ
Section titled “EmDash + Astroのデプロイ”EmDashは、サイトとともに1つのAstroプロジェクトとしてデプロイされます。使用するアダプターに対応したホスティングサービスを選び、本番用のデータベースとメディアストレージを用意してください。
具体的な手順は、EmDashのNode.js向けデプロイガイドとCloudflare向けデプロイガイドを参照してください。Astroのデプロイガイド (EN)から、利用するホスティングプロバイダーの手順に従ってデプロイすることもできます。
公式リソース
Section titled “公式リソース”その他のCMSガイド
主なCMSサービス
-
CloudCannon
Git-based CMS built for speed, security, and zero headaches.