编程 EmDash:基于 Astro 的沙箱插件 CMS,WordPress 创始人点赞,8.9K Star

2026-09-05 19:00:00

EmDash:基于 Astro 的沙箱插件 CMS,WordPress 创始人点赞,8.9K Star

全球 43% 的网站跑在 WordPress 上,插件生态是它最大的护城河,但也是最大的隐患——96% 的安全漏洞来自第三方插件。装了十几个插件的站点,任何一个被攻破,整站沦陷,数据库、文件系统、用户数据全暴露。这个矛盾存在了快二十年。

GitHub 上有个叫 EmDash 的项目,号称是 WordPress 的"精神继承者"。它不是再造一个 WordPress,而是把插件生态、管理后台、内容扩展性最核心的部分,用现代技术栈重写,从架构上解决插件安全问题。

一句话说清:基于 Astro 和 Cloudflare 的全栈 TypeScript CMS,插件跑在沙箱里,一个插件被攻破不会波及整站。4 月 1 日开源后,8 小时破 1.3K Star,现在已经 8.9K Star。WordPress 创始人 Matt Mullenweg 亲自回应,说它工程做得"excellent",还专门夸了 AI Agent Skills 是"amazing"。

插件不再有上帝权限

WordPress 插件能直接访问数据库、文件系统、用户数据,想干什么干什么。EmDash 的做法不一样:每个插件运行在隔离的 Worker 沙箱中,必须提前声明能力清单。一个只需要读内容和发邮件的插件,就只能做这两件事,多一点坚决不干,也干不了。这不是打补丁,是从根上换路线。

来看一个最简单的插件示例:文章发布时自动给编辑发邮件。

先用 CLI 初始化插件项目:npx emdash plugin init,输入插件名 notify-on-publish,它会生成目录结构和模板文件。

然后打开插件入口文件,用 definePlugin() 写三件事:给插件起 ID、声明能力、挂钩子。

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}`,
        });
      },
    },
  });

写完跑 npx emdash plugin validate 验证,通过后放到项目的 plugins/ 目录下,重启开发服务器就生效了。

关键点就是 capabilities。上面这个插件声明了自己只需要读内容和发邮件,运行时就被锁死在这两个权限里。想偷偷读用户表?直接报错。想写文件到服务器?直接报错。

Portable Text 内容格式

WordPress 用富文本存成 HTML,元数据塞在 DOM 注释里,内容被表现形式绑架。想拿同一份内容出 App、出邮件,得反过来解析 HTML,麻烦还易出问题。

EmDash 用的是 Portable Text,一种结构化 JSON 格式,内容跟渲染分离。同一份内容出网页、出 App、出邮件、出 API 响应,各端自己决定怎么渲染。

Schema 保存在数据库里,没有固化在代码中。不会开发的人通过管理界面直接创建内容类型,改字段、调顺序,不用碰代码。用一条命令从实时 Schema 生成 TypeScript 类型,类型安全不断链。

其他特性

  • 登录方式:没有密码登录,Passkey 优先,WebAuthn 无密码认证,不支持的设备走 OAuth 或 Magic Link 回退。四级角色权限:Administrator、Editor、Author、Contributor
  • AI 集成:内置 MCP Server,AI 工具直接跟站点交互;Agent Skills 辅助插件和主题开发;CLI 支持程序化管理
  • WordPress 迁移:专门的导入向导,WXR 文件、REST API、WordPress.com 三种方式都支持,连 Gutenberg 块都能转成 Portable Text

本地开发

最低门槛的试法,本地开发不需要 Cloudflare 账号,Node.js + SQLite 就能跑。

pnpm install && pnpm build

模拟种子数据:

pnpm --filter emdash-demo seed

启动开发服务器:

pnpm --filter emdash-demo dev

访问 localhost:4321/_emdash/admin 就能看到管理后台。

需要注意的是,沙箱插件依赖 Cloudflare 的 Dynamic Workers,目前只有付费账户能用,5 美元/月。可以注释掉配置禁用插件功能,但等于砍掉最核心的卖点。HN 上也有人质疑它是"开源但架构锁定",Cloudflare 适配器确实是最完整的,其他平台支持还在完善中。

EmDash 没有复制 WordPress 每一行实现,而是重新考虑了插件安全,从根上换了一套思路。Portable Text 解决内容绑架,沙箱解决插件信任,数据库 Schema 解决开发者与非开发者的协作断层。

项目地址:https://github.com/emdash-cms/emdash

推荐文章

程序员茄子在线接单