刚好最近在做涉及富文本编辑的项目,我的答案是没有。理由简单说一句话就够了:独立开发、“合理”时间和商业级质量,三个条件最多满足两个。
这个话题下的不少答主虽然造过编辑器的轮子,但多半只满足独立开发的条件。至于达到独立开发与商业级质量两个条件的开源编辑器项目,目前接触到的例子主要也只有这几个(别拿某个内部系统说事,这里说的使用都是对外产品上的使用)。按照开源时间排序:
- Quill 编辑器,不太了解但使用很广泛,至少见到过鹅厂在用。
- ProseMirror 编辑器,有 Atlassian 和卫报等公司在用。
- Slate 编辑器,有 Gitbook 等公司在用。
后两者答主都合了若干 PR 进去,应该还算比较熟悉吧。这里要注意的是,其它答案下提到的 TinyMCE、Draft.js、UEditor 等轮子,都是团队的作品,甚至像 TinyMCE 这样已经构成了一家公司的核心业务,已经不能用来衡量单人的开发能力了。那么,单人开发一个富文本编辑器到“稳定”质量,需要多长时间呢?几天?几周?几个月?
Quill 从 2012 年收到第一个 Issue 到 2016 年发布 1.0 版本,已经过去了四年;ProseMirror 作者在 2015 年正式开源前筹款维护时已经开发了半年,而到前两个月发布 1.0 版本时,已经过去了接近三年。至于 Slate 虽然理念先进(它能让你用 React 编写编辑器中的表格等组件且支持嵌套,这个 Draft.js 做不到),但开源至今接近两年,仍然有一堆边边角角的 bug 会让你用起来莫名其妙,实时协作的支持也还只是停留在纸面上(别相信开源项目里 Leave it to you to decide 的说法,这意思就是这个地方坑太大,你急你来填)。总之,上面这几个单人主导的编辑器项目要达到稳定质量,时间是以年为单位来计算的。考虑到目前互联网“下周上线”的节奏,动辄几年的时间算“合理”吗?
如果他们的项目都没有办法在“合理”的时间内完成,那么是富文本的坑太大,还是这两位作者太菜了呢?ProseMirror 的作者 Marijn 是 CodeMirror 编辑器和 acorn 解释器的作者,前者已经在 Chrome 和 Firefox 自带的调试工具里使用了,后者则是 babel 的依赖。而 Slate 的作者 Ian 则是 Metalsmith 生成器、Myth 预处理器、Superstruct 类型校验等数千 star 项目的作者(这里顺便给答主的 Bumpover 打个广告,一个基于 Superstruct 的数据迁移工具)。当然了,他们跟各位知乎大牛肯定还是没得比,毕竟人家都没开过 C++ 的 Live 嘛。不过以答主的粗鄙见闻,在前端富文本编辑的这个细分领域里,已经很难找到比他们更靠谱的人了。
所以这里面到底有什么坑呢?其它答案里对于多语言、RTL、排版等从 Word 出发的概念已经有有很完善的介绍了,对于一个在浏览器里从头打造的富文本编辑器,我能想到这么一些除了 contenteditable 兼容性之外,还必须填的坑:
- 必须有自己的一套文档模型和 Schema 校验规则。ProseMirror 自己造了个 Immutable 轮子,而 Slate 更是直接拿了 Immutable.js 当依赖。而粘贴、拖拽等事件会以完全不可控的方式魔改掉编辑内容,这时候需要类似 DTD 的 Schema 规则去做校验和相应的 normalize 去过滤标签,比如 inline 里不能套 block,table 里必须是 tr 套 td 之类。
- 必须维护自己的一套撤销栈。听起来好像就是 push 和 pop 一下的事情,不过考虑到输入事件的去重和协同编辑支持,这会涉及对文档 rebase 操作合并的问题。
- 必须维护自己的一套 Selection 和 Range 模型。这个靠扁平下标去索引树形结构的 API 十分反直觉,也是各种诡异 bug 的高发地带。
- 必须有自己的一套视图层。ProseMirror 定义了一个比较难用的 View class,而 Slate 直接拿了 React 当视图层:听起来不错,但是很容易破坏掉 React 的 reconciliation,让整个编辑器崩溃掉(知乎用的 Draft.js 也有这个问题,我有稳定的复现步骤)。
- 必须提供一套可拓展的文档变换 API 和插件机制。简单地把编辑器当做纯粹的应用来开发在架构上是行不通的,需要一个提供上述能力的基础库再加上根据业务需求去定制的 UI 组件层。
这些坑每一个单独拿出来都能算一个独立的轮子。比如 Superstruct 就是从 Slate 衍生出来的数据校验库,不到一个月就收获了近 3k star。可以说,有能力维护某个独立编辑器模块的前端开发者,都已经凤毛麟角了。
回到问题,题主问的是多大比例,那么我们可以做个合理的估算:去掉对开发时间的限制,这个级别的开发者在整个社区也只有个位数,考虑上写 Medium 这样闭源编辑器的作者,按百级来估算应当足够了。而使用 JavaScript 的开发者总量,是百万级。
所以这是最后的结论:满足时间、质量和人数限制的没有,去掉时间限制,也是万分之一以内的水平。(已经准备退坑保平安了,想跳坑的请多保重啊 XD
作者:doodlewind
链接:https://www.zhihu.com/question/26739121/answer/291059836
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。