OUTCOMES
项目结果
- 作为内部开源负责人,设计整体方案、划分架构模块,并带领 3 名工程师完成相应模块开发。
- 在既有 UEditor 深度定制基础上持续交付话题插入、图片编辑与内容解析等业务能力。
- 维护隔离的 BJH_UE 内核,并处理选区、粘贴、工具栏状态和多实例等富文本边界问题。
- 将业务仓库中的历史魔改代码迁移、裁剪和解耦,形成边界更清晰的 @baidu/bjh-editor 包。
- 保留既有 UEditor API 的兼容能力,同时支持 React import 与浏览器 script 两种接入形态。
- 编写使用开源编辑器替换百家号线上图文编辑器的方案及代码。
- 01业务内深度定制UEditor 1.4.3 · 富文本插件 · 历史样式
- 02迁移与梳理裁剪依赖 · 隔离内核 · 收紧插件边界
- 03内部复用包React import · Browser script · Plugin build
从长期魔改的业务基线出发
既有生产基线百家号在 UEditor 1.4.3 上持续增加图文发布功能。编辑器已经包含图片、视频、音频、表格、话题、商品、小程序和内容辅助等业务扩展,同时存在多层样式覆盖、全局依赖和场景耦合。
拆包前,我先把代码分成稳定内核、通用插件和业务专用模块,确定各自的迁移方式。
富文本边界与业务插件
业务持续迭代我参与话题插入、图片编辑和内容解析等能力的持续迭代。以话题插件为例,需要同时处理“#”触发搜索、浮层定位、选题插入、唯一性约束、粘贴过滤、选区恢复、工具栏状态和埋点。
这些工作沉淀了对光标、选区、焦点、异步浮层和不可编辑内容块的处理经验,也成为后来划分插件边界的重要依据。
隔离并模块化 BJH_UE 内核
内核边界整理历史版本将 UEditor 能力挂在浏览器全局对象上。梳理过程中,我维护独立的 BJH_UE 命名空间,并进一步将内核改为模块内导出,由编辑器 Driver 显式引用。
该方式既降低与页面其他编辑器实例的冲突,也保留对既有 UEditor API 的兼容入口,让旧插件可以渐进迁移。
迁移、裁剪与依赖清理
独立包初始梳理我负责把业务仓库中的编辑器代码迁入独立工程,连续清理无关媒体库、重复静态资源、历史业务模块和多层样式覆盖,并重排配置与目录。
每一部分都需要核对运行时引用、iframe 内容样式、插件注册和旧内容兼容,确保复用包仍能覆盖原有编辑流程。
Driver、插件与内容块契约
多人协作完成独立包通过 init、create 和 addPlugin 组织实例生命周期,并暴露 BJH_UE、BasePlugin 与 Box。工具栏配置决定插件 UI 是否装载,插件再绑定到具体实例,避免页面存在多个编辑器时共享错误状态。
图片、caption 和 feed content 等能力按插件迁移;不可编辑 Box 保存结构化元数据并参与内容变化通知。业务能力由此从“修改内核文件”转向“通过扩展契约接入”。
React 与浏览器脚本双形态输出
内部复用与示例工程使用 Webpack 输出可复用产物,既支持在 React 项目中 import,也支持旧页面通过 script 直接创建实例;插件还可以独立构建。配套示例覆盖两种接入方式,降低新旧业务的迁移门槛。
为保证线上业务继续迭代,旧接口仍保留兼容入口。这增加了一部分维护成本,也让接入方可以逐个迁移。
方案设计与团队协作
本人职责我担任编辑器内部开源负责人,完成整体开源方案设计与架构模块划分,带领 3 名工程师完成相应模块开发。
我直接负责代码迁移、BJH_UE 模块化、部分插件与多实例机制修正,并编写使用开源编辑器替换百家号线上图文编辑器的方案及代码。