前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在线文档技术揭秘开篇 - 富文本编辑器

在线文档技术揭秘开篇 - 富文本编辑器

原创
作者头像
chi
修改2021-06-28 10:38:00
4.4K1
修改2021-06-28 10:38:00
举报

在线文档技术揭秘开篇 - 富文本编辑器

前言

本文旨在向大家介绍在线文档的核心模块富文本编辑器技术,并介绍业内主流商业文档产品如何进行富文本编辑器技术选型。

富文本编辑器

富文本编辑器,Rich Text Editor, 简称 RTE, 是一种可内嵌于浏览器,所见即所得的文本编辑器。

富文本编辑器 - 常见交互

  • 内容输入区域
  • 输入内容
  • 选区 & 操作
  • 操作栏
  • 顶部工具栏
  • 侧边栏
  • 内嵌工具栏
  • 右击菜单

富文本编辑器 - 分级

富文本编辑器通常会做3个分级:L0、L1 和 L2

L0

依赖浏览器特性,主要是使用到了 designMode、ContentEditable、webkit-user-modify、execCommand 等特性。早期的编辑器都采用这种方案,但可定制的空间有限。例如早期的技术产品 WYSIWYG Editor。

代码语言:javascript
复制
<div class="kuaishou" contentediable="true">请输入正文</div> <!-- 富文本输入框 -->




documennt.execCommand('bold'); //操作
复制代码

L1

L1 在 L0 的基础上继续使用浏览器的特性、DOM 的 API 来自主实现 Selection、Range、Element、TextNode 等,具备一定的可扩展性,但也会有很多难以解决的问题。主要商业产品包括石墨文档(Quill),腾讯文档(Etherpad ACE),飞书文档(Etherpad ACE), 语雀文档(slate, lake),印象笔记(PromiseMirror),Confluence WIKI以及SAAS 产品内集成的知识库(Teambition Thoughts、Pingcode 等等);技术产品包括CKEditor、TinyMCE、Draft.js、 Slate、Quil.js 、ACE 等等,通常我们对 L1 编辑器从布局实现方式还区分为【传统模式】和【MVC模式】

  • 传统模式

DOM 树等于数据,使用 DOM API 直接操作(CKEditor 4、TineMCE、UEditor)

  • MVC模式

数据和渲染分离,数据模型发生变更后,数据才发生变更(Slate、CKEditor 5、Quil.js)

L2

自定义输入和操作,包括光标、输入法、删除等基础动作,具备绘图布局等能力。主要商业产品包括Google Docs、 Office Word Online、WPS 以及轻雀文档。

富文本编辑器 - 对比

补充:Google Docs、WPS 以及 Office Online 之所以体验性能极致,产品体验丰富,也源于投入极大的研发成本。

富文本编辑器 - 技术选型

从团队规模角度

  • 产品内容体验简单,并且缺乏编辑器开发者,推荐直接使用 Quill、 Slate.js、CKEditor、TIngMCE 进行二次开发。
  • 产品内集成轻量级知识库,有5人以内的编辑器开发团队:推荐自研L1级别编辑器、
  • 以协作编辑为产品核心,排版布局对标 Office,编辑器开发人员规模超过20+的编辑器研发团队: 推荐自研L2 编辑器。

从编辑器必备特性角度

  1. 健壮性 - 编辑器的稳定性是编辑器的生命线。
  2. 优秀的架构
  3. 能够定义一个文档模型,并且能够用一种简单的方式去区分两个文档模型是否在视觉上相等。
  4. 良好的MVC架构,创建一个在 DOM 与模型之间的映射,并且拥有完整的分层
  5. 在文档模型上能够定义表现良好的编辑操作(operation)。
  6. 可维护性 - 富文本编辑器代码量随着迭代会越来越大,所以能够用简单可依赖的方式去维护是很重要的
  7. 可扩展性 - 优秀的插件机制,优秀的扩展迭代能力。

userInput→ Action → Edit → Operation → Command → Mutation → Model → View(Layout,Redraw)→ DOM

block-style editor

类似 Notion 或者 Notion LIke 产品属于新的块级编辑体验笔记,拥有的页面和块无限层级,Back Link以及Database体验,与传统富文本编辑器在产品体验上有明显差异,本篇文章不着重描述,感兴趣可以先阅读 editorjs.io/

L2 富文本编辑器概览

分级

属于 L2

开发模式

  • 编辑器核心输入区域是采用原生 JavaScript实现
  • 顶部操作栏,侧边栏,内嵌栏,各种插件基于 React/Vue/原生JavaScript 皆可实现

核心模块

1.编辑引擎 & 计算引擎

独立的文档模型,管理文档 Model 与 View 之间的映射

2.布局引擎

重新实现渲染布局引擎,代替浏览器默认布局实现

3.协同引擎

多人协作操作OT,支撑多人同时在线协作编辑

4.插件引擎

支持编辑器block化的关键能力

关键设计

  • command 的原子操作抽象和设计
  • 大型前端软件的架构分层,面向扩展开放,面向修改封闭

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在线文档技术揭秘开篇 - 富文本编辑器
  • 前言
  • 富文本编辑器
    • 富文本编辑器 - 常见交互
      • 富文本编辑器 - 分级
        • L0
        • L1
        • L2
      • 富文本编辑器 - 对比
        • 富文本编辑器 - 技术选型
          • 从团队规模角度
          • 从编辑器必备特性角度
        • block-style editor
        • L2 富文本编辑器概览
          • 分级
            • 开发模式
              • 核心模块
                • 1.编辑引擎 & 计算引擎
                • 2.布局引擎
                • 3.协同引擎
                • 4.插件引擎
              • 关键设计
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档