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

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

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

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

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

Markdown 编辑器里的几个老问题

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

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

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

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

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

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

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

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

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

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

现在常见的 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 的核心链路可以概括为:

text 复制代码
Markdown source
      ↕
   MdParser
      ↕
  WYSIWYG DOM
      ↕
 MdSerializer

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

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

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

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

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

Code Mode 不再只是查看源码

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

html 复制代码
<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,试着粘一张图、插一个表格,再切到源码模式看看最终保存的内容。一个编辑器是否适合项目,通常几分钟就能判断出来。

相关推荐
对空六课3 小时前
Vue 组件曝光埋点为什么会重复触发?去重方案与实现思路
服务器·前端·算法·数据分析
isha3 小时前
Univer拆解——从类与方法的视角分析
前端·javascript
deli0073 小时前
限流算法到底怎么选?令牌桶 vs 漏桶 vs 滑动窗口 3 种同屏实测
前端
陈前端3 小时前
AI 猜错了接口返回格式之后,我开始怀疑喂给它的上下文
前端
风花一世月3 小时前
🏫 我把一整座校园的数据大屏塞进了一个 HTML 文件(零构建、双击即开,在线直接玩)
前端
变与不变8063 小时前
GET请求知识详解
前端·javascript
智塑未来3 小时前
网站建设哪家服务好?把交付前、交付中、交付后拆开看
大数据·前端
百度一下吧3 小时前
H5 应用开发:Android、iOS 与鸿蒙安全区域适配实战
前端