wangEditor学习与使用
条评论一、背景
继之前的CKEditor5学习开发之路之后,这又是一篇对富文本编辑器的学习与使用的整理回顾笔记。之所以会再一次研究富文本编辑器,并且目标对象变了,主要是因为CKEditor5的License为GNU General Public License,要求使用者也必须开源,因此只能重新调研,具体调研结果可查看富文本编辑器调研。
二、技术选型
从调研结果来看,除掉CKEditor5,还剩下TinyMCE、wangEditor、Froala Editor是可选的。
TinyMCE
Froala Editor看起来是个不错的选择,但查看代码时,发现前端工程依赖的
"froala-editor": "^4.1.1"
并没有公开代码仓,公开出来的是V3版本,其他的公开仓都是适配各种框架的,这。。。开源了个啥wangEditor很明显也不是理想选择,正如调研结果中提到的,bug较多,但没办法,暂时没找到其他开源可商用的富文本编辑器。
三、wangEditor的使用与扩展
不过wangEditor的优势也是比较明显的,帮助文档很详细,示例较多,源码结构也很清晰,弄清楚了它的代码逻辑,修复遇到的bug还是比较简单的。
这里就不再重复罗列自定义扩展新功能的步骤了,按照其官网教程一步步来即可。附上包含插入图表、占位符的示例代码。
只记录下对其bug修复、功能调整的技术细节。
1、修复在Angular工程中编译报错的bug
1 | // packages/core/src/editor/interface.ts |
2、修复不设置编辑器高度时,控制台有警告提示、hoverbar、modal位置不对的bug
扩展IEditorConfig,使之支持设置minHeight,然后在创建根节点时,设置最小高度
1 | // packages/core/src/config/interface.ts |
3、修复插入分隔线或自定义元素时,总是会在前面空出一行的bug
参考插入表格的代码,如果当前是空 p ,则删除该 p
1 | // packages/table-module/src/module/menu/InsertTable.ts |
4、修复给到编辑器的html中出现了字号列表中没有的字号时,字号不生效的bug
移除在字号列表中查找当前字号的逻辑(字体也是一样的逻辑)
1 | // packages/basic-modules/src/modules/font-size-family/parse-style-html.ts |
5、调整表格创建成功之后宽度默认100%
获取表格节点时,将width: 'auto'
改为width: '100%'
即可
1 | // packages/table-module/src/module/menu/InsertTable.ts |
6、扩展工具栏按钮BaseButton,使之支持调用menu的onButtonClick方法
有时候我们需要在点击工具栏按钮的时候,获取按钮的位置,以便靠近该按钮显示一个自定义浮窗,此时我们需要知道按钮相对编辑器的位置,以确定浮窗的位置。为此,我们扩展BaseButton,使之支持调用menu的onButtonClick方法(当然,前提是menu实现了onButtonClick方法),然后将event传递出来。
1 | // BaseButton本身已经有onButtonClick方法了,只是menu没有,所以对menu的接口IBaseMenu进行扩展 |
7、扩展工具栏下拉选择Select,使之支持始终显示图标,而不是显示选中的文字
比如行高,有些富文本编辑器始终显示图标(当然也不能说这样是最好,只是扩展以支持该功能)
1 | // packages/core/src/menus/interface.ts |
四、wangEditor私有化
上面我们对其源码修改了这么多,最好是贡献给wangEditor,但存在几点障碍:
- 作者已经在 2023-08-30 发布了 wangEditor 暂停维护的通知,具体看这里
- 我们的修改不一定能够被他们接受(或许有些问题他们不认为是bug,或许有些扩展他们认为不通用)
- 加入其团队略微麻烦,具体要求在这里
所以我们需要重新定义包名、指定代码仓、指定npm私服。
源码中是使用lerna
管理多个包的,因此packages
目录下的每个包都需要改,主要修改package.json
中的如下属性值:
1 | { |
需要注意一点,如果我们新的代码仓不是在GitHub上,那么在lerna将git tag
push
到远程时,就不会触发原有的配置git action
,此时需要我们手动发包。
所以,调整之后的完整的开发、发包流程如下:
1 | - 下载代码到本地,进入 `wangEditor` 目录 |