不想再让用户手写 Markdown:零依赖的所见即所得编辑器最新版发布 V0.2.0

140 阅读11分钟

ME.js Markdown 编辑器

写一个 Markdown 编辑器,难的从来不是把 **文本** 渲染成粗体。

真正麻烦的是:运营同学不想看标记符号,开发者又不愿意放弃干净的 Markdown;图片要能直接粘贴,表格不能全靠手敲,内容还要在 Vue、React,甚至没有构建工具的旧页面里复用。等这些要求凑到一起,一个看似简单的输入框,很快就会变成依赖、插件和兼容性问题的集合。

这也是我做 ME.js 的出发点:它不是要替代所有 Markdown 工具,而是解决一个更具体的问题——怎样用尽量低的接入成本,在 Web 产品里放进一个真正可用的所见即所得 Markdown 编辑器。

在线体验:juicy696.github.io/markdown-ed…

Markdown 编辑器里的几个老问题

Markdown 对开发者友好,对普通编辑者不一定友好

熟悉 Markdown 的人输入标题、列表和代码块很快,但在内容运营、客服知识库、产品公告等场景里,使用者未必愿意记语法。他们期待的是接近 Word 的操作:选中文字点一下加粗,插入图片后能调整大小,建表格时填行列数,而不是先确认竖线、短横线和空格有没有写对。

这就形成了第一个矛盾:编辑体验需要可视化,数据格式却最好仍然是 Markdown。

能力不难找,恰到好处的接入成本很难找

成熟编辑器通常能力丰富,但嵌入业务系统时,还要考虑包体、依赖、主题、构建链和框架适配。一个只需要写公告的后台,并不一定需要完整的知识库系统;一个需要兼容老页面的项目,也未必愿意为了编辑器重做工程配置。

编辑器“功能多”不等于“适合嵌入”。很多时候,团队真正需要的是:放进页面就能工作,数据能拿出来,图片上传能接自己的后端,按钮还能按业务裁剪。

预览模式和源码模式经常像两套系统

分栏预览适合检查结果,但写作时视线要在源码与预览之间来回跳。纯 WYSIWYG 又容易让人担心:保存下来的到底是什么?再次打开会不会丢格式?如果工具栏只在可视化模式可用,用户一进入源码模式,插入链接、表格和媒体就又要手写语法,模式切换反而成了操作断点。

8599666c2a50c18f43308a1cddfc9e2d89e8d61f4602fd5a31dc134bfacb6282.png

图片、表格和媒体才是业务里的“硬骨头”

真实的内容后台不会只处理标题和段落。用户会从聊天工具里粘贴截图,会插入产品演示视频,会调整图片宽度,也会从别处复制一段混合格式内容。这些细节不够“炫”,却决定了一款编辑器能不能真正进入生产流程。

现在常见的 Markdown 编辑器,都在解决什么问题?

为了避免把不同类型的产品硬放在一起比较,我更愿意按使用场景来看。

类型 / 代表工具更擅长的方向典型使用方式
Typora沉浸式本地写作、即时渲染、丰富导出个人文章、长文档、本地文件写作
Obsidian本地知识库、开放文件格式、插件与主题生态双链笔记、个人知识管理
VS Code工程内文档、目录结构、链接与路径补全、扩展能力README、项目文档、Docs as Code
StackEdit浏览器写作、同步、协作与扩展 Markdown在线写作、云端同步、博客发布
MarkText 等开源桌面工具所见即所得与本地 Markdown 文件个人写作、开源替代方案
ME.js将可视化 Markdown 编辑能力嵌入现有 Web 产品CMS、管理后台、文档页面、表单系统

Typora 的长处是把源码符号隐藏起来,让本地写作更连贯;Obsidian 的重点是本地数据与知识网络;VS Code 适合已经生活在工程目录里的开发者;StackEdit 则把浏览器写作、同步和协作做成了完整应用。

ME.js 选择的是另一条路线:不再做一个需要用户迁移过去的独立工作台,而是做一个能被开发者带回自己产品里的编辑器。

所以它关注的是:接进现有页面需要多少工程改造、普通用户能否像使用富文本一样写作、可视化与源码模式能否互通、图片上传能否走业务自己的后端,以及最终数据能不能继续迁移和二次处理。

ME.js:界面是富文本,底层仍是 Markdown

ME.js 的核心链路可以概括为:

Markdown source
      ↕
   MdParser
      ↕
  WYSIWYG DOM
      ↕
 MdSerializer

用户看到的是已经渲染的标题、粗体、列表、引用和表格;业务侧保存的仍然可以是 Markdown。需要检查或精修时,用户可以切到源码模式,修改后再回到预览,内容会按最新源码重新解析。

这不是简单地在左边放输入框、右边放预览,而是在两种编辑习惯之间维持同一份内容。

下面是编辑器当前的实际界面:

ME.js 编辑器实际界面截图

最新版重点补齐了“源码模式也能编辑”

根据项目当前的 CHANGELOG.md,最新版重点处理了一个很实际的问题:进入 Code Mode 以后,原来的编辑能力不应该突然消失。

Code Mode 不再只是查看源码

在源码模式中选中文字,工具栏可以直接完成:

  • 粗体、斜体、删除线、行内代码包裹;
  • 标题、引用、无序/有序/任务列表前缀插入;
  • 代码块与分隔线插入;
  • 链接、图片、音频、视频等内容写入源码;
  • 表格以 Markdown pipe syntax 插入;
  • 文字颜色以 <span style="color:..."> 写入。

从源码模式切回预览时,编辑器会重新解析最新内容。对经常在可视化编辑和精确控制之间切换的人来说,这比“只读源码弹窗”实用得多。

颜色选择器开始记住使用习惯

新版颜色面板会保存最近使用的颜色,最多 20 个,去重并按最近使用排序,记录持久化在 localStorage 中,而且 Vanilla、Vue、React 三个版本可以共享。

这是一个很小的功能,但在公告、状态标记、重点提示等场景里,团队往往反复使用同一组品牌色。减少重复取色,编辑过程会顺手很多。

React 版本修复了几类真实交互问题

新版还修复了 React 版本中对话框输入时焦点被反复抢走、插入表格后光标位置丢失、插入内容导致页面滚回顶部,以及色块样式缺失等问题。

这类修复看起来不像“大版本卖点”,却很能说明编辑器开发的现实:功能入口存在只是第一步,焦点、选区、滚动位置和插入点是否稳定,才决定用户能不能连续写下去。

d506f207d19cc2900fdb0de120378d441c0fe27c9c96e8b369e88dd943c69adf.png

它有哪些适合落地的功能?

三种接入方式,不要求统一技术栈

ME.js 提供三个独立版本:

  • Vanilla JS:约 57 KB,零依赖;
  • Vue 3:约 41 KB,只依赖 Vue 3;
  • React 18:约 39 KB,只依赖 React 18。

不需要 JSX,也不强制构建步骤。对历史系统、静态工具页和轻量管理后台来说,这比先搭一套工程再接编辑器更直接。

最简单的原生页面接入如下:

<div id="app">
# Hello

这是一段 **Markdown** 内容。
</div>

<script src="me-editor.js"></script>
<script>
  ME.init({
    mount: '#app',
    title: '内容编辑',
    uploadUrl: '/upload',
    maxLength: 5000
  });
</script>

所见即所得,但不把内容锁死在私有格式里

编辑器支持标题、粗体、斜体、删除线、行内代码、文字颜色、引用、列表、任务列表、代码块、表格、链接、图片、音频、视频和分隔线。

业务可以通过 API 获取 Markdown、HTML、原始 DOM HTML,也能导出 Markdown、HTML 或混合格式。内容不仅能留在编辑器里,还能继续进入静态站点、内容平台、接口或存储系统。

截图直接粘贴,上传策略由业务决定

设置 uploadUrl 后,剪贴板图片可以上传到自己的服务端,接口返回 { "url": "..." } 后插入正文;没有配置接口或上传不可用时,也可以回退到 base64。项目还附带了只使用 Python 标准库的最小上传接收示例,便于本地联调。

图片大小不是插入后就“听天由命”

图片插入后可点击调整为原始大小、100%、75%、50% 或 25%,并通过 HTML round-trip 保留尺寸信息。Markdown 对图片宽度没有统一的标准语法,ME.js 允许在需要时使用 Markdown 与 HTML 的混合表达,兼顾可移植性和展示效果。

表格和媒体采用对话框插入

用户可以指定表格的行数和列数,不需要手敲竖线;图片支持标题与 URL,音频和视频也有独立入口。对于知识库和产品文档,这些是比“支持几十种快捷键”更常用的能力。

工具栏可以按业务做减法

查看源码、复制、音频、视频、状态栏等按钮都可以通过初始化参数开关。还可以设置字符上限,超出后计数变红提醒。编辑器不是越满越好,同一套编辑器应该能够服务不同入口。

三个实际开发场景

案例一:给运营后台增加公告编辑器

一个旧的管理后台可能没有 Vue 或 React,需求却包括:标题与列表可视化、截图粘贴、字符限制,以及最终保存 Markdown。

用 Vanilla 版本可以直接挂载到已有 DOM,不必改造构建链。把 uploadUrl 指向现有对象存储上传接口,设置 maxLength,再关闭暂时用不到的音视频按钮即可。

这个场景里,ME.js 的优势不是比桌面编辑器功能更多,而是它能留在原系统里,并服从原系统的数据与上传规则。

案例二:Vue 与 React 并存的内部文档系统

不少公司在技术栈迁移期同时维护 Vue 旧模块和 React 新模块。如果两个模块分别引入不同的编辑器,Markdown 解析结果、工具栏能力和数据格式很容易逐渐分叉。

ME.js 的三个版本共享相同的解析与序列化层,可以分别使用 v-model 和 value/onChange 接入,但内容链路保持一致。迁移的是页面技术栈,不必同时迁移文档格式。

案例三:技术作者在可视化写作与源码精修之间切换

一篇技术文章通常包含代码块、表格、截图和少量 HTML。作者可以先在所见即所得模式里快速完成主体,再切到 Code Mode 调整 Markdown 细节;此时仍能用工具栏插入表格、链接或媒体。

回到预览后,编辑器重新解析最新源码。整个过程不需要在两个编辑器之间复制内容,也避免了“源码改了但预览还停留在旧状态”的割裂感。

ME.js 的优势和边界都很明确

ME.js 不是 Obsidian 的知识图谱替代品,也不打算复刻 VS Code 的扩展市场,更不会覆盖 Typora 的全部桌面文件管理与导出能力。

它的优势集中在四点:

  1. 更轻的嵌入方式:单文件、零依赖或仅依赖宿主框架;
  2. 更低的使用门槛:普通用户按富文本方式编辑,开发者仍拿到 Markdown;
  3. 模式切换不断档:源码模式也能使用格式化和插入能力;
  4. 更尊重业务边界:图片走自己的后端,工具栏按场景裁剪,内容可多格式导出。

它目前也有清楚的边界:如果你需要多人实时协作、知识图谱、完整文件管理、复杂数学公式或庞大的插件生态,成熟的专用产品会更合适。

但如果需求是“给现有 Web 产品加一个够用、轻量、数据可控的 Markdown 编辑器”,ME.js 会是一条更短的路径。

写在最后

Markdown 编辑器这个领域并不缺产品,缺的是对场景的取舍。

有人把它做成沉浸式写作软件,有人做成知识库,有人把它放进 IDE。ME.js 想做的事情更克制:让开发者不用背上一整套复杂系统,也能把可视化 Markdown 编辑能力放进自己的产品。

当前版本已经覆盖常见格式、表格与媒体、图片粘贴与调整、源码编辑、多格式导出,以及 Web、Vue 3、React 18 三种接入方式。最新版又把 Code Mode 从“查看”推进到了“可操作”,并修复了一批影响连续编辑体验的 React 交互问题。

如果你正在开发 CMS、知识库、文档页或管理后台,可以直接打开在线 Demo,试着粘一张图、插一个表格,再切到源码模式看看最终保存的内容。一个编辑器是否适合项目,通常几分钟就能判断出来。