Markdown即使到了2022年也很常用,比如这篇文章还是用Markdown写的。但是Markdown应该成为文本编辑的默认选择技术吗?答案是否定的。我发现一篇很好的文章ThoughtsOnMarkdown批评盲目使用Markdown作为技术选择。它提到Markdown在标准化、结构化和组件化方面存在缺陷。如果你真的想成为现代文本结构编辑器,请不要使用Markdown。概述Markdown如此广泛,它甚至已经成为我们的第二语言。Markdown最早的解析器是JohnGruber于2004年基于Perl编写并发布的,当时Markdown只有一个目的,那就是方便网络写作。网页写作必须基于HTML规范,而HTML规范对于大多数人来说上手成本太高,所以Markdown是一种基于文本创建的语法,更容易理解,或者说上手成本更低,甚至是愚蠢的。要解析这个语法,需要配备一个解析器,将这个语法文本转换成HTML。在数字化发展的今天,Markdown已经不适合现在的写作场景。主要有两个原因:Markdown已经不适合现在的富交互和内容形式的书写。Markdown纯文本的开发体验已经不能满足当代开发者日益增长的体验需求。首先我们从Markdown的思想说起。Markdown的核心思想Markdown最大的优点是简单易用,不需要接触HTML等复杂的嵌套语句(虽然对于程序员来说,HTML简单到处于链的最底层)鄙视)。原文抽象的三个优点:基于文本的适当抽象。虽然HTML甚至代码都是文本,但是“适合”二字很重要,即任何文本都可以是Markdown,只需一点标记就可以描述出专业的结构,学习成本极低。有大量的生态工具。比如语法解析器、高亮显示、格式转换、格式化、渲染等工具都齐全。编辑内容易于维护。例如,Markdown作为源代码存储起来很方便,而其他格式的富文本可能不方便在源代码中维护。如果拿Markdown和数据库表结构来比较,了解数据库的成本实在是太高了。然而在如今的后端即服务时代,数据库访问越来越容易,甚至出现了AirTable等大量SAAS产品,可以将结构化数据快速转化为应用。多么重要。Markdown用来写文章有好处,但是用来表达逻辑结构就不可避免地会导致灾难性的后果。原作者团队对Markdown技术的选择深感困扰,被迫解决了大量远超预期的问题。如果你真的想在Markdown的坑里越陷越深,就必须使用语法扩展来满足自定义需求。Markdown语法扩展最初,Markdown语法不支持表格。如果要使用Markdown绘制表格,只能使用原生的HTML标签:的语法,创作者常常为此烦恼。例如,一些平台会屏蔽原生的HTML语法,以确保内容体验的所谓“安全”或“一致性”,并且为了弥补画表能力的不足,这些平台往往会支持一些自定义的语法,更糟糕的是,它们并不支持。这是Markdown的语法扩展。Markdown有哪些扩展?例如:multiMarkdown、commonMark、GithubFlavoredMarkdown等。这里随便举个例子,比如标准的MD格式,其实第一行末尾要加两个空格换行,但是GFM取消了这个限制。这样虽然方便多了,但是也暴露了平台间规范不一致的问题,这让Markdown跨平台基本难免被坑。而我们是否有足够的精力去学习和记住各个平台扩展的语法?先不说能不能记住。首先,是否值得学习是一个问题。为什么在线写作平台需要占用作者的学习和认知成本,而不是试图简化写作过程?所以语法扩展看起来很美,但是站在一个写手的角度,或者整个互联网各个平台的角度,这种不规范的做法肯定是不靠谱的。没有用户认为你的平台有资格“教他语法”,除非你是微信、钉钉、飞书。原文中提到的一点是:作为一个写手,你不知道哪些语法在Markdown中可用,哪些不可用。标准规范中存在一些模糊的地方,导致开发者在实施时遇到各种纠结。原文还提到了一个语法扩展导致理解成本较高的例子:slack平台定制的mrkdown不支持[link](https://slack.com)来描述链接,而是使用语法。综上所述,Markdown语法的扩展应该是一件好事,但是没有标准导致了标准的泛滥,使得Markdown成为一个实际上没有标准的状态,整体上弊端更多。Markdown的目标用户群Markdown对自身的定位其实是很不明确的,这也导致了语法规范的缺乏确定性。最初,Markdown是一种面向熟悉HTML的人的标记语言,但后来它转向了面向开发者的用户群,因为开发者只想着扩展语法来满足更复杂的使用场景,而Markdown的原生语法无法适应更多以及更复杂的视觉展示形式。今天,Markdown的主要用户是开发人员和对代码感兴趣的人。这并不是说开发者有多喜欢它,而是说Markdown的受众变窄了。现在任何非开发者群体的文档编辑器都不会用Markdown,而是所见即所得的WYSIWYG(所见即所得)模式。这个转变的过程是痛苦的,但是现在,富文本编辑器不应该使用Markdown语法,而是所见即所得模式已经成为共识。简单来说,从段落到区块,从文章到应用,Markdown已经不适合当下HTML的丰富生态。它可以很容易地描述段落的标记语言。遇到丰富的交互组件块,不得不引入诸如MDX等方案,但这样的方案只适合程序员,根本无法移植。网络浏览的形式也从简单的文章演变为整体应用。这些应用程序具有复杂的布局、样式和交互。如果你尝试支持基于Markdown的扩展语法,你可能会发现直接使用原生HTML会更好。对结构化内容的需求从编程的角度理解为“组件重用”。Markdown的原生语法无法实现内容的复用。如果一定要复用内容,只能在每个地方重复写入,势必造成巨大的同步成本。例如,Jekyll提出了创建可重用变量的FrontMatter概念:---food:Pizza---
{{page.food}}
WYSIWYG编辑器不应该使用HTML作为底层数据结构,尽管浏览器确实使用HTML作为底层数据结构,但这并不意味着所见即所得的编辑器也可以做到这一点,这就是为什么浏览器只能提供从源代码到UI的输出,而不能提供从UI编辑到源代码的输出。反向输入。因为用户输入和HTML之间没有一对一的对应关系,所以存在很多歧义。例如,如果当前光标位于粗体和细体文本之间,那么下一个输入是否应该是粗体?从UI中看不到粗体标签。再者,如果HTML中存在冗余,其实当前光标位置已经被粗体标签包裹了好几层,只是因为光标所在的区域被另外一个style标签覆盖成了非粗体模式,再次进入时可能会跳出。覆盖范围再次变为粗体。这个过程是否满足用户的期望?从技术上讲,这种复杂的标签结构几乎无法处理,因为组合太多了。大多数现代编辑器以JSON格式存储数据结构,因为它结构化且易于检索。结构最重要的体现是生成的HTML结构可以稳定,即对于一个既是粗体又是红色的文本,必须用
