楔子
自从加入 wangEditor 团队已有大半年了。
wangEditor V4 版本也已经越来越趋于稳定了。
目前也因为一个任务,让我想要对目前的 wangEditor 做一个整体复盘。
一、项目介绍
wangEditor 是一款 TypeScript 开发的 Web 富文本编辑器。
主打 轻量、简洁、易用
目标是 争做国内使用体验Z好的开源 Web 富文本编辑器!
我在 wangEditor 做过的事情
前期做过如下一些功能:
- 引用
- 插入视频
- 缩进
- 序列
- 多语言
- auto focus
- 丰富和优化内部核心模块的功能,例如:
getNodeTop、getSelectionRangeTopNodes、prev、next、css等等 - 以及若干 bug 和 测试
后期在 wangEditor 当中主要负责:
issues和bug的回复和收集- 对已收集的
issues和bug分门别类 - 进行任务的分配
- 参与
code review
二、项目背景
富文本编辑器所面向的业务场景有很多,例如:
- 留言板
- 邮箱
- 博客
- 新闻媒体
- 社区
- 贴吧
- 文档
- 资料库
- ...
这些场景都有一个共同点,那就是 所见即所得。
这也是富文本编辑器所解决的业务痛点。
实际上开发一个简易的富文本编辑器相当的简单,只需要你简单的了解 contenteditable、execCommand、Selection、Range 的使用,就能快速的开发出一个简单的富文本编辑器。
当然该编辑器还存在着很多的问题,例如 execCommand 实际上在 MDN 上标记为已废弃。
还有各个浏览器对 execCommand 的实现和支持各不相同,以及 execCommand 本身提供的能力也十分的简单。
所以开发一个简单的富文本编辑器虽然十分简单,但是要做一款优秀的富文本编辑器是相当之难的,需要处理各种各样匪夷所思的问题,而且 execCommand 所提供的能力也十分有限,所以很多的富文本编辑器都是抛弃了浏览器提供的 execCommand 转而研发自己的一套 execCommand,更甚者自主实现了富文本输入框,只依赖少数的浏览器 API。
三、代码结构
该部分的内容可以在
wangEditor的github仓库中的doc目录下可以找到 doc
技术选型
wangEditor 本身不依赖任何框架
- 使用语言:
TypeScript - 打包工具:
Webpack - 测试工具:
jest、cypress
主要目录
.github/workflowsgithub actions(持续集成)的配置文件.vscodevscode 编辑器配置(推荐大家使用 vscode)attachment附件,和程序运行无关,但不可删除buildwebpack 配置dist打包产出的目录。刚下载时没有该目录,本地运行npm run build即可生成docs开发文档examples本地测试用的 html 文件server服务端,用于联调图片或文件上传的功能src编辑器代码test单元测试代码cypressE2E测试代码
Src 目录
wangEditor.ts总入口assets/CSS 字体文件 图片config/编辑器默认配置。配置项较多,所以按照分类拆分了多个文件。editor/编辑器核心功能index.ts入口文件,产出编辑器的 classchange/编辑器 change 捕捉disable/禁用编辑器history/历史记录init-fns/初始化的功能upload/文件上传底层能力z-index/层级command.ts封装document.execCommandselection.ts封装Selection和Range
lib/用到的第三方 js lib (无法通过 npm 安装的)menus/菜单栏和菜单index.ts菜单栏 classmenu-constructors/生成单个菜单所用到的 classmenu-list.ts汇总所有的菜单- 其他文件夹,具体的各个菜单,如
boldlink等
text/文本编辑区域index.ts入口文件,产出 class ,封装各个 APIevent-hooks/初始化 text 的各个事件钩子,如回车、粘贴、删除时应该做哪些特殊处理paste/处理粘贴事件getChildrenJSON.ts获取子元素的 JSON 格式数据getHtmlByNodeList.ts从nodeList json格式中遍历生成dom元素
utils/工具const.ts常量dom-core.tsDOM 操作的封装util.ts各个工具函数custom-event自定义事件polyfill兼容data-structure/数据结构observer/封装 MutationObserver
五、创建流程
六、菜单构造
七、结构关系
其实由下图可见,wangEditor 在不断的升级、迭代、修复中,已然开始有些杂乱了。
很多功能和模块都互相依赖非常的耦合在了一起,在修复 Bug 中也开始出现一些连锁反应,例如 A 修改了 Bug A,造成了 Bug B 的出现;B 修改了 Bug B,结果 Bug A 又死灰复燃了。
这也是我们编辑器急需突破和解决的问题,也是我做这一次复盘的主要原因
八、总结思考
实际上目前我只是比较了解 wangEditor 一款富文本编辑器,对其他著名的富文本编辑器知之甚少,作为一名富文本编辑器的开发者而言这是不合格的,这方面我应该要去多多加强对富文本编辑器领域的深耕。
另外这段时间我其实在面试找工作,一方面是迫于生活的压力,一方面也是想寻求技术上的突破。同时在面试的过程中,以及在此次任务中时常有种无从下手的感觉,让我也了解到自己底子薄、思维定式、设计模式了解不深、基础知识欠缺、架构思维弱等等,所以还需加倍努力才行呀。
最后,如果你对富文本编辑器和开源项目感兴趣,欢迎加入我们 wangEditor 团队
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情