快速开始

本页内容

本指南将带你完成创建第一个 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. 你会被重定向到设置向导。输入:

    • Site Title — 网站名称
    • Tagline — 简短描述
    • Admin Email — 你的电子邮件地址
  3. 点击 Create Site 来注册通行密钥

  4. 浏览器会提示你使用 Touch ID、Face ID、Windows Hello 或安全密钥创建通行密钥

通行密钥注册完成后,你将登录并被重定向到管理控制台。

EmDash 管理控制台,显示内容概览、最近活动和导航侧边栏

第一篇文章

  1. 在管理侧边栏中,点击 Content 下的 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 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。编辑器现在会自动补全字段名称并捕获类型错误。

下一步

网站运行后,以下页面介绍接下来要做什么: