编程

EmDash:致敬 Wordpress,挑战 Wordpress

12 2026-04-02 23:43:00

Emdash 是一个基于Astro 和 Cloudflare 创建的全栈 Typescript CMS。Emdash 借鉴了 WordPress 的优点--可扩展性、管理后台用户体验、插件生态,并且基于无服务和类型安全对他们进行了重构。插件在沙盒的 Worker 中隔离运行,解决 WordPress 插件架构的基本安全问题。

开始

注意

EmDash 依赖于动态 Worker 来运行安全沙盒插件。动态 Worker 目前只对付费账户可用。请升级你的账号(5美金起)或者注释掉 wrangler.jsonc 配置文件worker_loaders 块,以禁用插件。

npm create emdash@latest

或者直接部署到你的 Cloudflare 账号:

EmDash 在 Cloudflare (D1 + R2 + Workers) 或者任何  Node.js 服务器上与 SQLite 一起运行。无需,无需单独的主机层 – 只需部署 Astro 站点。

模板

EmDash 附带了三个入门模板:

博客

经典的博客使用侧边栏widget、搜索 和 RSS。 

  • 分类 & 标签
  • 全文本搜索
  • RSS feed
  • Comment-ready
  • 暗黑/轻量模式

Blog template

营销

以转化率为导向的落地页,包含价格信息和联系表单。

  • 带有 CTA 的横幅
  • 特性网格
  • 价格卡
  • FAQ 折叠
  • 联系表单

Marketing template

作品集

用于展示创意作品的视觉作品集。

  • 项目网格
  • 标签过滤
  • 案例研究页面
  • RSS 订阅
  • Dark/light 模式

Portfolio template

为什么使用 EmDash?

WordPress 是为一个不同的时代而构建的。今天运行 WordPress 意味着管理 PHP 和 JavaScript,分层缓存以获得可接受的性能,并知道 96% 的 WordPress 安全漏洞来自插件。EmDash 是 WordPress 的样子,如果你从头开始使用今天的工具。

沙箱化插件 WordPress 插件拥有对数据库、文件系统及用户数据的完全访问权限。仅凭一个存在漏洞的插件,便足以危及整个网站的安全。EmDash 插件通过“动态 Worker 加载器”(Dynamic Worker Loaders)运行于相互隔离的 Worker 沙箱之中,且每个插件均附带一份明确声明的权限清单。例如,一个仅申请了 read:content(读取内容)和 email:send(发送邮件)权限的插件,将只能执行这两项操作,而无法进行任何其他活动。

export default () =>
	definePlugin({
		id: "notify-on-publish",
		capabilities: ["read:content", "email:send"],
		hooks: {
			"content:afterSave": async (event, ctx) => {
				if (event.content.status !== "published") return;
				await ctx.email.send({
					to: "editors@example.com",
					subject: `New post: ${event.content.title}`,
				});
			},
		},
	});

结构化内容,而非序列化 HTML。WordPress 将富文本存储为 HTML,并将元数据嵌入在注释中——这使得您的内容与其 DOM 呈现形式紧密耦合。EmDash 采用 Portable Text,这是一种结构化的 JSON 格式,能够将内容与呈现形式彻底解耦。你的内容无需经过 HTML 解析,即可直接渲染为网页、移动应用界面、电子邮件或 API 响应。

专为智能代理(Agents)打造。EmDash 内置了用于构建插件和主题的“代理技能集”;提供一套命令行界面(CLI),允许代理以编程方式管理内容与数据架构;此外还集成了 MCP 服务器,使 Claude、ChatGPT 等 AI 工具能够直接与你的站点进行交互。

随处运行。EmDash 在每一个技术层级都采用了可移植的抽象层——例如使用 Kysely 处理 SQL 数据库,使用 S3 API 接口管理存储——从而能够兼容 SQLite、D1、Turso、PostgreSQL、R2、AWS S3 以及本地文件系统。尽管 EmDash 在 Cloudflare 平台上能发挥出最佳性能,但它绝非被锁定于该平台,完全支持在其他环境中部署运行。

工作原理

EmDash 是一项 Astro 集成。将其添加到你的配置中,即可获得一套完整的 CMS 系统:包含管理面板、REST API、身份验证、媒体库以及插件系统。

// astro.config.mjs
import emdash from "emdash/astro";
import { d1 } from "emdash/db";

export default defineConfig({
	integrations: [emdash({ database: d1() })],
});

内容类型定义在数据库中,而非代码中。非开发人员可以通过管理界面(Admin UI)来创建和修改集合。每个集合都对应一个真实的 SQL 表,且包含类型化的列。开发人员可以根据实时模式(Live Schema)生成 TypeScript 类型:

npx emdash types

利用 Astro 的“实时集合”(Live Collections)来查询内容——无需重新构建,也无需单独的 API:

---
import { getEmDashCollection } from "emdash";
const { entries: posts } = await getEmDashCollection("posts");
---

{posts.map((post) => <article>{post.data.title}</article>)}

功能特性

内容管理 —— 博客文章、页面、自定义内容类型。通过 TipTap 实现富文本编辑,并采用 Portable Text 格式存储。支持版本修订、草稿保存、定时发布、全文搜索(FTS5)以及行内可视化编辑。

管理后台 —— 功能完备的管理面板,包含可视化数据模型构建器、媒体库(支持通过签名 URL 拖放上传)、导航菜单、分类体系、小部件,以及 WordPress 导入向导。

用户认证 —— 优先采用 Passkey(WebAuthn)无密码认证,并提供 OAuth 和“魔术链接”(Magic Link)作为备用方案。基于角色的访问控制(RBAC):管理员、编辑、作者、贡献者。

插件系统 —— 提供 definePlugin() API 及生命周期钩子,支持 KV 存储、系统设置、管理页面、仪表盘小部件、自定义区块类型及 API 路由。通过 Dynamic Worker Loaders 在 Cloudflare 环境中实现沙箱化执行。

智能代理(Agents) —— 提供用于辅助插件与主题开发的 AI 技能文件。提供命令行界面(CLI)以实现站点自动化管理。内置 MCP 服务器,支持与各类 AI 工具直接集成。

WordPress 迁移 —— 支持从 WXR 导出文件、WordPress REST API 或 WordPress.com 导入文章、页面、媒体资源及分类数据。智能代理技能可辅助完成插件与主题的移植工作。

可移植平台

Cloudflare也适配
数据库D1SQLite, Turso/libSQL, PostgreSQL
存储R2AWS S3,任何兼容 S3 的服务,本地文件系统
会话(Session)KVRedis、基于文件
插件Worker isolates (sandboxed)In-process (safe mode)

状态

EmDash 仍处于 beta 预览阶段。接受贡献、反馈、插件 、主题和创意。

npm create emdash@latest

请翻阅文档查阅指南,API 引用和插件开发。

开发

以下是 pnpm monorepo 库:

git clone https://github.com/emdash-cms/emdash.git && cd emdash
pnpm install
pnpm build

运行 demo (Node.js + SQLite,无需 Cloudflare 账户)

pnpm --filter emdash-demo seed
pnpm --filter emdash-demo dev

在 http://localhost:4321/_emdash/admin 中打开后台

pnpm test          # run all tests
pnpm typecheck     # type check
pnpm lint:quick    # fast lint (< 1s)
pnpm format        # format with oxfmt

仓库结构

packages/
  core/           Astro integration, APIs, admin UI, CLI
  auth/           Authentication library
  blocks/         Portable Text block definitions
  cloudflare/     Cloudflare adapter (D1, R2, Worker Loader)
  plugins/        First-party plugins (forms, embeds, SEO, audit-log, etc.)
  create-emdash/  npm create emdash scaffolding
  gutenberg-to-portable-text/  WordPress block converter

templates/        Starter templates (blog, marketing, portfolio, starter, blank)
demos/            Development and example sites
docs/             Documentation site (Starlight)
下一篇