快速開始

本頁內容

本指南將引導你建立第一個 EmDash 網站,從安裝到發佈你的第一篇文章。

前置需求

  • Node.js v22.12.0 或更高版本(不支援奇數版本號)
  • npmpnpmyarn
  • 程式碼編輯器(推薦 VS Code)

建立新專案

npm

npm create emdash@latest

pnpm

pnpm create emdash@latest

yarn

yarn create emdash

依照提示為專案命名並設定你的偏好選項。

啟動開發伺服器

  1. 進入專案目錄:

    cd my-emdash-site
  2. 安裝相依套件:

    npm install
  3. 啟動開發伺服器:

    npm run dev
  4. 在瀏覽器中開啟 http://localhost:4321

完成設定精靈

首次造訪管理面板時,EmDash 的設定精靈會引導你完成初始設定:

  1. 開啟 http://localhost:4321/_emdash/admin

  2. 你將被導向設定精靈。輸入以下資訊:

    • 網站標題 — 你的網站名稱
    • 標語 — 簡短的網站描述
    • 管理員信箱 — 你的電子郵件地址
  3. 點選 Create Site 註冊你的通行金鑰

  4. 瀏覽器將提示你使用 Touch ID、Face ID、Windows Hello 或安全金鑰建立通行金鑰

通行金鑰註冊完成後,你將登入並被導向管理儀表板。

EmDash 管理儀表板,展示內容概覽、近期活動和導覽側邊欄

你的第一篇文章

  1. 在管理側邊欄中,點選「內容」下方的 Posts

  2. 點選 New Post

  3. 輸入標題,並使用富文字編輯器撰寫內容。

    EmDash 文章編輯器,包含富文字工具列和發佈側邊欄
  4. 將狀態設定為 Published 並點選 Save

  5. 造訪你的網站首頁,文章會立即顯示。

專案結構

你的 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 react from "@astrojs/react";
import emdash, { local } from "emdash/astro";
import { sqlite } from "emdash/db";

export default defineConfig({
	integrations: [
		react(), // 必要 — 管理介面是一個 React 應用程式
		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>Latest Posts</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 中建立所有集合的介面。你的編輯器將能夠自動補全欄位名稱並捕捉型別錯誤。

下一步

網站運作起來後,以下頁面涵蓋了接下來可以做的事情: