本指南將帶你完成建立第一個 EmDash 網站的全過程,從安裝到發佈第一篇文章。
前置需求
- Node.js v22.12.0 或更高版本(不支援奇數版本號)
- npm、pnpm 或 yarn
- 程式碼編輯器(建議使用 VS Code)
建立新專案
npm
npm create emdash@latest pnpm
pnpm create emdash@latest yarn
yarn create emdash 按照提示為專案命名並設定你的偏好。
啟動開發伺服器
-
進入專案目錄:
cd my-emdash-site -
安裝相依套件:
npm install -
啟動開發伺服器:
npm run dev -
在瀏覽器中開啟
http://localhost:4321
完成設定精靈
當你第一次存取管理面板時,EmDash 的設定精靈會引導你完成初始設定:
-
存取
http://localhost:4321/_emdash/admin -
你會被重新導向到設定精靈。輸入:
- Site Title — 網站名稱
- Tagline — 簡短描述
- Admin Email — 你的電子郵件地址
-
點選 Create Site 來註冊通行金鑰
-
瀏覽器會提示你使用 Touch ID、Face ID、Windows Hello 或安全金鑰建立通行金鑰
通行金鑰註冊完成後,你將登入並被重新導向到管理控制台。
第一篇文章
-
在管理側邊欄中,點選 Content 下的 Posts。
-
點選 New Post。
-
輸入標題,並使用富文字編輯器編寫內容。
-
將狀態設定為 Published 並點選 Save。
-
造訪網站首頁。文章會立即顯示。
專案結構
你的 EmDash 專案遵循標準的 Astro 結構,並有一些額外內容:
my-emdash-site/
├── astro.config.mjs # Astro + EmDash 設定
├── src/
│ ├── live.config.ts # 即時集合設定
│ ├── pages/
│ │ ├── index.astro # 首頁
│ │ └── posts/
│ │ └── [...slug].astro # 動態文章頁面
│ ├── layouts/
│ │ └── Base.astro # 基礎版面配置
│ └── components/ # 你的 Astro 元件
├── .emdash/
│ ├── seed.json # 範本種子檔案
│ └── types.ts # 產生的 TypeScript 型別
└── package.json
設定檔
astro.config.mjs
以下設定將 EmDash 註冊為 Astro 整合,使用本機 SQLite 資料庫和本機檔案儲存:
import { defineConfig } from "astro/config";
import emdash, { local } from "emdash/astro";
import { sqlite } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
storage: local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
}),
}),
],
});
src/live.config.ts
以下檔案透過單一即時集合將 EmDash 連接到 Astro 的內容系統:
import { defineLiveCollection } from "astro:content";
import { emdashLoader } from "emdash/runtime";
export const collections = {
_emdash: defineLiveCollection({ loader: emdashLoader() }),
};
環境變數
對於正式環境,使用以下指令為外掛程式密鑰產生加密金鑰:
npx emdash secrets generate
將產生的值作為 EMDASH_ENCRYPTION_KEY 新增到環境中,如下所示。此金鑰用於加密靜態儲存的外掛程式密鑰。現在設定它,這樣當外掛程式密鑰加密使用它時,你的部署就準備好了。
EMDASH_ENCRYPTION_KEY=emdash_enc_v1_...
金鑰永遠不會儲存在資料庫中——只儲存加密的密文。將它備份到持久位置,因為遺失它意味著遺失所有用它加密的密鑰。
預覽 HMAC 密鑰和留言者 IP 雜湊鹽在首次使用時產生並儲存在資料庫中,因此無需設定。僅當獨立程序需要驗證與主站點相同的權杖時,才覆蓋預覽密鑰,如下所示。
EMDASH_PREVIEW_SECRET=your-preview-secret
在頁面中查詢內容
在 Astro 頁面中使用 EmDash 的查詢函式。這些函式遵循 Astro 的即時集合模式,對於集合傳回 { entries, error },對於單一條目傳回 { entry, error }:
---
import { getEmDashCollection } from "emdash";
import Base from "../layouts/Base.astro";
const { entries: posts } = await getEmDashCollection("posts");
---
<Base title="Home">
<h1>最新文章</h1>
<ul>
{posts.map((post) => (
<li>
<a href={`/posts/${post.slug}`}>{post.data.title}</a>
</li>
))}
</ul>
</Base>
以下頁面透過 slug 取得單一條目:
---
import { getEmDashEntry } from "emdash";
const { slug } = Astro.params;
const { entry: post } = await getEmDashEntry("posts", slug);
if (!post) {
return Astro.redirect("/404");
}
---
<h1>{post.data.title}</h1>
產生 TypeScript 型別
為了獲得完整的型別安全,從資料庫結構描述產生型別:
npx emdash types
這會建立包含所有集合介面的 .emdash/types.ts。編輯器現在會自動補全欄位名稱並捕捉型別錯誤。
下一步
網站執行後,以下頁面介紹接下來要做什麼:
- 核心概念 — 了解 EmDash 的底層運作原理
- 處理內容 — 學習查詢和呈現內容
- 媒體庫 — 上傳和管理圖片與檔案
- 建立部落格 — 建構帶有分類和標籤的完整部落格
- 部署到 Cloudflare — 將網站發布到正式環境