# 初探富文本之富文本概述 富文本编辑器通常指的是可以对文字、图片等进行编辑的产品,具有所见即所得的能力。对于`Input`、`Textarea`之类标签,他们是支持内容编辑的,但并不支持带格式的文本或者是图片的插入等功能,所以对于这类的需求就需要富文本编辑器来实现。现在的富文本编辑器也已经不仅限于文字和图片,还包括视频、表格、代码块、思维导图、附件、公式、格式刷等等比较复杂的功能。
初探富文本编辑器系列相关文章 * [初探富文本编辑器#1-富文本概述](./初探富文本之富文本概述.md) * [初探富文本编辑器#2-编辑器引擎](./初探富文本之编辑器引擎.md) * [初探富文本编辑器#3-OT 协同算法](./初探富文本之OT协同算法.md) * [初探富文本编辑器#4-OT 协同实例](./初探富文本之OT协同实例.md) * [初探富文本编辑器#5-CRDT 协同算法](./初探富文本之CRDT协同算法.md) * [初探富文本编辑器#6-CRDT 协同实例](./初探富文本之CRDT协同实例.md) * [初探富文本编辑器#7-React 实时预览](./初探富文本之React实时预览.md) * [初探富文本编辑器#8-文档 diff 算法](./初探富文本之文档diff算法.md) * [初探富文本编辑器#9-在线文档交付](./初探富文本之在线文档交付.md) * [初探富文本编辑器#10-划词评论能力](./初探富文本之划词评论能力.md) * [初探富文本编辑器#11-文档虚拟滚动](./初探富文本之文档虚拟滚动.md) * [初探富文本编辑器#12-搜索替换算法](./初探富文本之搜索替换算法.md) * [初探富文本编辑器#13-序列化与反序列化](./初探富文本之序列化与反序列化.md)
## 概述 富文本编辑器实际上是一个水非常深的领域,其本身还是非常难以实现的,例如如何处理光标、如何处理选区等等,当然借助于浏览器的能力我们可以相对比较简单的实现类似的功能,但是由此就可能导致过于依赖浏览器而出现兼容性等问题。此外,当前有一个非常厉害的选手名为`Word`,当产品提出需求的时候,如果是参考`Word`来提的,那么这就是天坑了,`Word`支持的能力太强大了,那么大的安装包也不是没有理由的,其内部做了巨量的富文本相关`case`的处理。 当然在这里我们叙述的是在浏览器中实现的富文本,我们也不太可能在浏览器中凭借几百`KB`或者几`MB`来实现`Word`这种几`GB`安装包所提供的功能。虽然仅仅是在浏览器中实现富文本编辑的能力,但是这也并不是一件容易的事情。对于我们开发者而言,可能会更加喜欢使用`Markdown`来完成相关文档的编写,当然这就不属于富文本编辑器的范畴了,因为`Markdown`文件是纯文本的文件,关注点主要在渲染上,如果想在`Markdown`中拓展语法甚至嵌入`React`组件的话的话,可以参考`markdown-it`与`mdx`项目。 ## 演进之路 `Web`富文本编辑器也是在不断演进,在整个发展的过程中,也是遇到了不少困难,而正是因为这些问题,可以将发展历程分为`L0`、`L1`、`L2`三个阶段的发展历程。当然在这里没有好不好,只有适合不适合,通常来说`L1`的编辑器已经满足于绝大部分富文本编辑场景了,另外还有很多开箱即用的富文本编辑器可选择,具体的选型还是因需求而异。 | 类型 | 特点 | 产品 | 优势 | 劣势 | |---|---|---|---|---| | `L0` | 1. 基于浏览器提供的`contenteditable`实现富文本编辑。
2. 使用浏览器的`document.execCommand`执行命令操作。 | 早期轻量编辑器。 | 较短时间内快速完成开发。 | 可定制的空间非常有限。 | | `L1` | 1. 基于浏览器提供的`contenteditable`实现富文本编辑。
2. 数据驱动,自定义数据模型与命令的执行。 | 石墨文档、飞书文档。 | 满足绝大部分使用场景。 | 无法突破浏览器自身的排版效果。 | | `L2` | 1. 自主实现排版引擎。
2. 只依赖少量的浏览器`API`。 | `Google Docs`、腾讯文档。 | 完全由自己控制排版。 | 技术难度相当高。 | ### L0 在前边是将当前的编辑器发展归为了`L0`、`L1`、`L2`三个阶段,也有将`L0`阶段再分两个阶段,总分为四个阶段的,不过由于这两阶段都是完全依赖于`contenteditable`与`document.execCommand`的实现,所以在这里就统归于`L0`了。 在富文本编辑器出现之前,浏览器就已经具备了展示富文本的能力,通过编排`HTML`和`CSS`就可以展示富文本的内容,但对于用户输入,浏览器所提供的`