字节笔记本
2026年3月22日
Cherry Markdown - 腾讯开源 Markdown 编辑器
Cherry Markdown 是腾讯开源的一款功能强大的 JavaScript Markdown 编辑器,具备开箱即用、轻量级和易于扩展的特点,能够在浏览器端和 Node.js 服务端运行,目前在 GitHub 上已获得超过 4600 颗 Star,被超过 240 个项目使用。
项目简介
Cherry Markdown Writer 由腾讯团队开发和维护,是一款纯 JavaScript 实现的 Markdown 编辑器。它的设计理念是"开箱即用"与"易于扩展"并重:默认支持绝大多数常用的 Markdown 语法(包括标题、目录、流程图、公式等),同时提供完善的扩展机制,让开发者能够根据业务需求快速进行二次开发。
Cherry Markdown 不依赖任何前端框架(如 Angular、Vue、React),框架仅提供容器环境,这意味着它可以在任何前端项目中无缝集成。项目采用 Apache-2.0 许可证开源,拥有活跃的社区贡献和持续的版本迭代,目前已发布 94 个版本。
值得注意的是,Cherry Markdown 还专门为 AI Chat 场景提供了流式渲染(Streaming Rendering)构建版本,能够自动完成标题、加粗、链接、图片、代码块、公式、列表、表格、Mermaid 图表和脚注等语法元素的增量渲染,避免在流式输出过程中暴露 Markdown 源码。
核心特性
语法功能
- 图片操作:支持图片缩放、对齐和引用
- 图表生成:根据表格内容自动生成 ECharts 图表
- 字体样式:支持调整字体颜色、大小、背景色、上标和下标
- 清单列表:支持插入 CheckList(待办清单)
- 多媒体:支持插入音频和视频
- 图表绘制:内置 Mermaid 流程图和数学公式支持
- 信息面板:支持 Info 面板语法
功能特性
- 富文本粘贴:从富文本粘贴内容自动转换为 Markdown 格式
- 换行模式:支持经典换行和常规换行两种模式
- 多光标编辑:支持多光标同时编辑
- 图片编辑:支持图片尺寸调整
- Mermaid 图表编辑:支持拖拽调整大小,支持居中/左/右/浮动对齐
- 表格编辑:完整的表格 WYSIWYG 编辑功能
- 表格转图表:从表格内容生成图表
- 导出功能:支持导出为图片或 PDF
- 浮动工具栏:在新行开始时自动出现
- 气泡工具栏:选中文本时出现
- 快捷键:支持自定义快捷键设置
- 浮动目录:支持浮动目录导航
- 主题切换:内置多种样式主题
- 输入建议:支持自动补全功能
- VIM 模式:支持 VIM 编辑模式
- AI 流式输出:支持 AI Chat 场景的流式渲染
性能特性
- 局部渲染:仅渲染可视区域内容,提升长文档性能
- 局部更新:编辑时仅更新变化部分,避免全量重绘
安全特性
Cherry Markdown 内置安全 Hook,通过白名单过滤和 DomPurify 进行安全扫描过滤,有效防止 XSS 攻击。XSS 防护默认启用,如需禁用需手动配置。
技术栈
Cherry Markdown 的核心技术栈和构建产物如下:
| 构建版本 | 文件 | Mermaid | CodeMirror | 适用场景 |
|---|---|---|---|---|
| 完整版 | cherry-markdown.js | 支持 | 支持 | 通用场景 |
| 核心版 | cherry-markdown.core.js | 不含 | 支持 | 不需要 Mermaid 的场景 |
| 流式版 | cherry-markdown.stream.js | 不含 | 不含 | AI Chat 流式输出 |
- 开发语言:JavaScript 75.3%、SCSS 11.7%、TypeScript 9.0%、Vue 2.9%
- 代码编辑器:CodeMirror(核心版和完整版内置)
- 流程图:Mermaid(完整版内置,核心版和流式版按需加载)
- 图表库:ECharts(需额外安装)
- 公式渲染:MathJax/KaTeX(通过 CDN 动态加载,不包含在任何构建包中)
- 单元测试:Vitest
- 代码规范:ESLint + Prettier
- Git 规范:Commitlint + Husky
安装指南
通过 yarn 安装
yarn add cherry-markdown通过 npm 安装
npm install cherry-markdown --save如果需要启用 Mermaid 绘图和表格转图表功能,还需额外安装 mermaid 和 echarts 包:
npm install mermaid echarts --saveCherry Markdown 已内置 mermaid,如需使用指定版本的 mermaid,可以参照官方 Wiki 文档进行配置。
快速开始
浏览器环境 - UMD 方式
<link href="cherry-editor.min.css" />
<div id="markdown-container"></div>
<script src="cherry-editor.min.js"></script>
<script>
new Cherry({
id: 'markdown-container',
value: '# welcome to cherry editor!',
});
</script>浏览器环境 - ESM 方式
import 'cherry-markdown/dist/cherry-markdown.css';
import Cherry from 'cherry-markdown';
const cherryInstance = new Cherry({
id: 'markdown-container',
value: '# welcome to cherry editor!',
});Node.js 环境(纯语法编译)
const { default: CherryEngine } = require('cherry-markdown/dist/cherry-markdown.engine.core.common');
const cherryEngineInstance = new CherryEngine();
const htmlContent = cherryEngineInstance.makeHtml('# welcome to cherry editor!');核心版(不含 Mermaid)
import 'cherry-markdown/dist/cherry-markdown.css';
import Cherry from 'cherry-markdown/dist/cherry-markdown.core';
const cherryInstance = new Cherry({
id: 'markdown-container',
value: '# welcome to cherry editor!',
});流式版(适用于 AI Chat 场景)
import 'cherry-markdown/dist/cherry-markdown.css';
import Cherry from 'cherry-markdown/dist/cherry-markdown.stream';
const cherryInstance = new Cherry({
id: 'markdown-container',
});
cherryInstance.setMarkdown('# welcome to cherry editor!');使用示例
按需加载 Mermaid 插件
import 'cherry-markdown/dist/cherry-markdown.css';
import Cherry from 'cherry-markdown/dist/cherry-markdown.core';
import CherryMermaidPlugin from 'cherry-markdown/dist/addons/cherry-code-block-mermaid-plugin';
import mermaid from 'mermaid';
// 插件注册必须在 Cherry 实例化之前完成
Cherry.usePlugin(CherryMermaidPlugin, {
mermaid,
});
const cherryInstance = new Cherry({
id: 'markdown-container',
value: '# welcome to cherry editor!',
});Webpack 动态导入 Mermaid
import 'cherry-markdown/dist/cherry-markdown.css';
import Cherry from 'cherry-markdown/dist/cherry-markdown.core';
const registerPlugin = async () => {
const [{ default: CherryMermaidPlugin }, mermaid] = await Promise.all([
import('cherry-markdown/src/addons/cherry-code-block-mermaid-plugin'),
import('mermaid'),
]);
Cherry.usePlugin(CherryMermaidPlugin, {
mermaid,
});
};
registerPlugin().then(() => {
const cherryInstance = new Cherry({
id: 'markdown-container',
value: '# welcome to cherry editor!',
});
});异步渲染回调(Mermaid v10+)
从 Mermaid v10.0.0 开始,渲染逻辑从同步变为异步。在 afterChange 或 afterInit 事件后,Mermaid 代码块会先渲染为占位符,然后异步替换。如需获取异步渲染完成后的内容:
const cherryInstance = new Cherry({
id: 'markdown-container',
value: `
\`\`\`mermaid
graph LR
A[Company] -->| Off work | B(Market)
B --> C{See<br>melon seller}
C -->|Yes| D[Buy a bun]
C -->|No| E[Buy one pound of buns]
\`\`\`
`,
callback: {
afterAsyncRender: (md, html) => {
// md 是 markdown 源码,html 是渲染结果
console.log('渲染完成:', html);
}
}
});自定义语法扩展
Cherry Markdown 支持自定义语法扩展,开发者可以参照官方的自定义语法文档进行开发,快速扩展编辑器能力。
自定义工具栏
Cherry 支持 5 个工具栏位置,每个位置都可以通过配置扩展自定义工具栏按钮,详细配置方式请参考官方的工具栏配置文档。
项目链接
- GitHub 仓库:https://github.com/Tencent/cherry-markdown
- 官方文档:https://github.com/Tencent/cherry-markdown/wiki
- 在线演示:https://github.com/Tencent/cherry-markdown(仓库中提供多个 Demo 入口)
- NPM 包:https://www.npmjs.com/package/cherry-markdown
- 许可证:Apache-2.0