本指南将带你完成创建第一个 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 — 将网站发布到生产环境