CKEditor 5 Framework 框架全景解析:从预置编辑器到自研富文本方案
2026/9/15 15:58:47 网站建设 项目流程

CKEditor 5 Framework 框架全景解析:从预置编辑器到自研富文本方案

【免费下载链接】ckeditor5Powerful rich text editor framework with a modular architecture, modern integrations, and features like collaborative editing.项目地址: https://gitcode.com/GitHub_Trending/ck/ckeditor5

导读

CKEditor 5 不仅是开箱即用的富文本编辑器集合,更是一套模块化、可深度定制的富文本编辑框架。本文以仓库中 框架总览文档 为骨架,系统梳理"何时该用框架""框架由哪三大支柱构成""如何借助教程、开发工具与源码逐步上手",并给出仓库内源码与文档的精确路径,帮助你判断是否需要从预置编辑器转向框架开发,以及从哪里开始。

CKEditor 5 的双重身份:预置编辑器 + 可定制框架

CKEditor 5 的定位是双重的:它既是一组开箱即用的编辑器类型预置(editor type presets),可以快速在应用中初始化;同时也是一套用于构建定制化富文本编辑解决方案的框架(framework)。作为框架,它提供了一套灵活的基础组件,用于创建任意形态的编辑器,并提供构建与定制功能的工具链。

两者之间的关系可以这样理解:

  • 预置编辑器面向"标准需求":在仓库中对应packages/ckeditor5-editor-classic/packages/ckeditor5-editor-inline/packages/ckeditor5-editor-balloon/packages/ckeditor5-editor-decoupled/等编辑器包,配合ckeditor5聚合包即可快速搭建标准工具栏编辑体验;
  • 框架能力面向"非标准需求":当编辑器类型预置和 CKEditor 5 Builder 无法满足要求时,就需要进入框架层面,直接使用packages/ckeditor5-core/packages/ckeditor5-engine/packages/ckeditor5-ui/等核心包自行组装。

官方文档还特别提示:框架文档在不断更新扩充,但仍可能有欠缺之处;如果文档不足,可以直接查阅仓库中各功能包的源码。例如,计划创建新功能时,先检查是否已有类似功能,并尝试从它的源码中获得灵感——这正是本仓库packages/目录下几十个功能包存在的意义。

何时应该转向使用框架?

预置编辑器已经覆盖了绝大多数常见场景,但以下三类定制需求只有框架才能实现:

定制需求说明仓库佐证
编写自己的功能(Writing your own features)新功能必须基于框架实现,即创建新的插件插件开发指南、官方插件示例包
定制现有功能(Customizing existing features)改变既有功能的行为或外观,依赖框架的事件、转换与 UI 扩展能力UI 库、编辑引擎
创建新的编辑器类型(Creating new types of editors)Editor基类之上实现全新的编辑器形态packages/ckeditor5-core/src/editor/packages/ckeditor5-editor-*各编辑器包

简言之:当现有构建(builds)无法满足需求、或无法被定制到所需程度时,就应该开始使用框架。

框架文档版图:本部分提供哪些资源

框架文档部分(仓库中对应docs/framework/)从左菜单提供以下五类资源,构成完整的进阶学习路径:

  • Tutorials(教程)——从 教程概览 开始,包含 crash course 快速入门(见 docs/tutorials/crash-course/)、基础教程与进阶指南,专门服务于想编写自有 CKEditor 5 插件的开发者;例如 时间戳插件教程 就是一个完整的从零到插件实战。
  • Development tools(开发工具)——面向编辑器开发者的实用工具集,包括 CKEditor 5 Inspector 调试器、包生成器 Package Generator(可直接生成插件开发环境)、MRGit 多仓库管理工具 与 测试辅助工具。
  • Architecture(架构)——从 架构引言 进入,介绍 CKEditor 5 架构的三大支柱(详见下文)。
  • Deep dive(深入专题)——面向高级开发者的框架进阶信息,仓库内收录了 本地化(localization) 等专题;事件系统、可观察对象(Observables)、转换(Conversion)、Schema 等更完整的深潜指南也是进阶阅读的核心内容。
  • How-tos(操作手册)——当你只需要知道"如何设置编辑器高度""如何聚焦编辑器"这类具体问题时,直接查阅 How-tos 即可。

三大架构支柱(Main pillars)

框架文档的 架构引言 明确指出:CKEditor 5 采用基于插件的架构(plugin-based architecture)每个功能(甚至输入、段落支持)都是一个插件,整个体系建立在三大支柱之上。

支柱一:核心编辑器架构(Core editor architecture)

由 @ckeditor/ckeditor5-core 包实现(源码见 packages/ckeditor5-core/src/),它提供把所有部件粘合在一起的核心类与接口,并引入了插件(plugins)命令(commands)两个关键概念:

  • Editor 类Editor是所有编辑器的基类与应用入口,暴露configpluginscommandsmodeldataeditingkeystrokes等核心属性,以及静态create()destroy()execute()setData()/getData()等方法。官方预置的 Classic / Inline / Balloon / Decoupled 编辑器都只是Editor接口的实现,你可以自由实现外观与行为完全不同的编辑器。
  • 插件(Plugin):所有插件需实现PluginInterface,最简便的方式是继承Plugin类(源码见 packages/ckeditor5-core/src/plugin.ts)。初始化代码放在init()中(可返回 Promise),需要等其它插件初始化后再执行的逻辑放在afterInit(),插件间依赖通过静态requires属性声明。即使是 typing(输入) 本身也是一个插件。官方插件普遍采用engine 与 UI 分离的结构——例如 BoldEditing 负责 schema 定义、<strong>渲染与命令,而 BoldUI 只负责按钮 UI,便于复用引擎部分实现自定义 UI,甚至支持服务端运行。
  • 命令(Command):命令是"动作 + 状态"的组合。继承Command类(packages/ckeditor5-core/src/command.ts)后注册进editor.commands集合,即可通过editor.execute()执行。命令的refresh()会在模型任何变更时被自动调用以刷新自身状态;forceDisabled()/clearForceDisabled()可从外部临时禁用命令;affectsData = false可让命令在只读模式下保持可用。
  • 事件系统与可观察对象(Event system and observables):基于EmitterObservable混入(见 packages/ckeditor5-utils/src/),代码高度解耦。你可以用listenTo()监听命令的execute事件并用优先级(high/low)插入逻辑、甚至evt.stop()阻断默认行为;用set()声明可观察属性并监听change:value;用bind()实现属性绑定,例如target.bind( 'foo' ).to( source )

支柱二:编辑引擎(Editing engine)

由 @ckeditor/ckeditor5-engine 包实现(源码见 packages/ckeditor5-engine/src/),是框架中体量最大、最复杂的部分,围绕三个层面构建:模型(model,编辑器的数据)视图(view,渲染层)在两者间映射的转换机制(conversion)

其核心设计要点包括:

  • 自定义数据模型(Custom data model):模型是类似 DOM 的树结构,由元素与文本节点组成,且元素和文本节点都可以携带属性(例如加粗被存储为文本属性而非<strong>元素,显著简化了编辑算法)。模型结构位于document中,包含根元素、selection与变更historydocumentschema与 markers 都是Model类的属性,可通过editor.model访问。
  • 只能通过 writer 修改模型:在editor.model.change( writer => {...} )enqueueChange()块内使用模型 writer 修改结构、选区与创建元素。一个change()块内的所有变更会合并为一个撤销步骤(batch)。所有结构变更都通过Operation进行,这一概念源自Operational Transformation(OT)协作技术——这也是 CKEditor 5 为实时协作(real-time collaboration)打下的基础。
  • 视图即"虚拟 DOM":引擎实现了面向编辑场景的自定义虚拟 DOM,由ViewRenderer渲染到真实 DOM,负责驯服contentEditable的种种怪癖。系统存在两条管线:编辑管线(editing pipeline)渲染用户可见可交互的内容,数据管线(data pipeline)处理editor.getData()/setData()与粘贴内容。视图中定义了六种语义化元素类型(container、attribute、empty、UI、raw、editable),并支持通过"custom properties"携带 widget、marker 高亮等附加信息。
  • Schema 控制一切合法性:模型 schema 决定节点在何处被允许/禁止、节点允许哪些属性、以及节点的额外语义(如 object、block)。它影响粘贴内容的过滤、标题功能可应用的块级元素、block quote 可包裹的元素、加粗按钮的可用性、选区可放置的位置等。官方插件都会为 schema 预配置规则,用户无需自行重配。
  • 观察者(Observers):视图将原生 DOM 事件封装为更有用的自定义事件,默认注册了 Mutation、Selection、Focus、Key、FakeSelection、Composition、ArrowKeys 等观察者,剪贴板等特性还会自行添加观察者(如 ClipboardObserver),且所有事件默认在 view document 上触发,第三方包建议为事件加项目前缀以避免命名冲突。
  • 转换(Conversion):模型与视图通过三条路径连接——数据上转换(upcasting)负责把 HTML 等数据加载进模型(粘贴内容同样走此路径)、数据下转换(downcasting)负责把模型输出为数据、编辑下转换负责在编辑器生命周期内持续把模型变更渲染到编辑视图与 DOM。

支柱三:UI 库(UI library)

由 @ckeditor/ckeditor5-ui 包实现(源码见 packages/ckeditor5-ui/src/),包含一套轻量 MVC 实现与基础 UI 组件,可无缝融入整个生态:

  • Views 与 Templates:视图基于模板构建 DOM,并通过可观察属性向外暴露接口。你可以在setTemplate()中用bind.if()/bind.to()把可观察属性绑定到 class、属性与事件上,例如绑定placeholder属性或把 DOMkeydown转成视图input事件。最佳实践是:功能代码不应直接触碰视图的 DOM,一切交互都应通过视图自身提供的接口完成。
  • View collections 与 UI 树:视图按"一树一视图(view-per-tree)"原则组织进 ViewCollection,构成从EditorUIView顶层集合(top工具栏、main编辑区、body浮动层)延伸的 UI 树;插件通过editor.ui.componentFactory.add()editor.ui.top.add()等 API 挂载自己的子视图,生命周期随编辑器一起管理。
  • 现成组件:框架提供ButtonViewToolbarViewDropdownViewBalloonPanelViewLabeledFieldViewSearchTextViewTextareaViewSpinnerView等常用组件,以及createDropdownaddListToDropdownaddToolbarToDropdownaddMenuToDropdown等便捷助手(详见 UI 组件清单)。
  • Dialog 与 Modal:由Dialog插件提供,支持标题(可拖动)、内容视图与操作按钮三部分;Dialog#show()会触发命名空间事件show:[id],可借此调整对话框位置等行为;模态框(isModal: true)会用遮罩阻断与页面其余部分的交互,常用于强制用户操作。
  • 焦点与快捷键管理FocusTracker可追踪一组元素中谁持有焦点;KeystrokeHandler可在指定 DOM 范围内注册快捷键回调,editor.keystrokes则直接提供与命令绑定的快捷键注册(如 Undo 插件注册Ctrl+Z),同一快捷键的多个回调可用优先级决定执行顺序。

从框架文档到仓库源码:验证与深入

框架文档鼓励开发者直接阅读源码,仓库为此提供了完整可查的实现与测试:

  • 核心类:插件与命令的实现见 packages/ckeditor5-core/src/plugin.ts 与 packages/ckeditor5-core/src/command.ts;Editor基类见 packages/ckeditor5-core/src/editor/;事件与可观察对象混入见 packages/ckeditor5-utils/src/。
  • 引擎:模型、视图、转换与渲染器的全部实现位于 packages/ckeditor5-engine/src/,其下的model/view/conversion/controller/等子目录与文档章节一一对应。
  • 编辑器类型:Classic、Inline、Balloon、Decoupled 四种官方编辑器类型分别位于packages/ckeditor5-editor-classic/src/packages/ckeditor5-editor-inline/src/packages/ckeditor5-editor-balloon/src/packages/ckeditor5-editor-decoupled/src/,可作为自定义编辑器类型的参照模板。
  • 功能示例:以 BoldEditing/BoldUI 为代表的 engine/UI 分离范式、以 图像功能 为代表的"一个功能由十余个细粒度插件组合"范式,都是学习插件化架构的绝佳样本。
  • 测试佐证:每个功能包下的 tests/ 目录都配有完整测试(例如核心包的插件、命令、编辑器生命周期测试),官方文档强调"所有官方包都有广泛的测试套件",阅读测试同样是理解行为边界的可靠方式。

上手路径建议

  1. 评估需求:先对照 何时使用框架 判断是否真的需要框架;若标准预置即可满足,直接用ckeditor5聚合包初始化即可。
  2. 从教程入手:跟随 教程概览 与 crash course 完成第一个插件;需要可运行的开发环境时,使用 Package Generator 一键生成。
  3. 边写边查:开发插件时借助 CKEditor 5 Inspector 实时查看模型结构、选区、命令状态等内部信息,配合上文给出的源码路径直接阅读对应实现。
  4. 进阶深化:理解事件系统与可观察对象的细节可参考 本地化专题 等 deep dive 内容;遇到"编辑器高度""聚焦"等具体问题,直接查 How-tos。

【免费下载链接】ckeditor5Powerful rich text editor framework with a modular architecture, modern integrations, and features like collaborative editing.项目地址: https://gitcode.com/GitHub_Trending/ck/ckeditor5

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询