news 2026/9/15 13:47:46

在 Electron 桌面应用中集成 CKEditor 5(ZIP 自托管方案)完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在 Electron 桌面应用中集成 CKEditor 5(ZIP 自托管方案)完整指南

在 Electron 桌面应用中集成 CKEditor 5(ZIP 自托管方案)完整指南

【免费下载链接】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 是模块化架构的富文本编辑器框架,其渲染层基于浏览器原生能力构建。由于 Electron 窗口由 Chromium 内核渲染,CKEditor 5 的 HTML 编辑器可以像运行在网页中一样运行在 Electron 的渲染进程(renderer process)里。本指南将带你使用「Online Builder 生成的自定义构建 + ZIP 自托管包」的方式,把 CKEditor 5 集成进一个 Electron 桌面应用,涵盖项目搭建、ZIP 包准备、编辑器初始化、许可证激活等完整流程。读完本文,你将能够在 Electron 应用中快速落地一个带工具栏、可扩展插件的所见即所得编辑器。

本文对应的完整参考文档位于 docs/getting-started/integrations/electron.md,并辅以仓库中相关源码与配置佐证。

为什么可以这样集成

Electron 应用的主进程(main process)负责创建窗口,而每个窗口中的页面内容由渲染进程加载。因为渲染进程运行的就是 Chromium 渲染引擎,CKEditor 5 的编辑视图、交互逻辑与浏览器环境完全一致——不需要任何原生(native)适配层,直接把网页版编辑器资源加载进来即可工作。

本文采用ZIP 自托管方案,即把编辑器构建产物以静态文件形式打包进 Electron 应用目录。其核心优势是:

  • 无需 npm 构建链,解压即用;
  • 不依赖 CDN,可在离线环境运行,也便于版本锁定;
  • 与 CDN 方案相比,所有资源随应用本地分发,加载稳定。

(如需 CDN 方式,可参考 docs/getting-started/integrations-cdn/electron.md,集成思路一致,仅资源引入方式不同。)

快速开始:搭建 Electron 项目

如果你对 Electron 尚不熟悉,建议先阅读其官方入门教程了解基础概念。最快的建项目方式是使用 Electron Forge 的脚手架命令:

npx create-electron-app@latest my-app

执行时,CLI 会提示你选择打包器(bundler)和语言。本教程选用Vite + 原生 JavaScript(vanilla JavaScript)组合。脚手架完成后进入项目目录并启动:

cd my-app npm start

此时应该能看到一个默认的 Electron 窗口打开,说明项目搭建成功。

准备 CKEditor 5 的 ZIP 包

在 Electron 中使用的编辑器需要一个自定义构建(custom build),而最省事的制作方式就是 CKEditor 5 Online Builder。

  1. 打开 CKEditor 5 Online Builder;
  2. 通过图形化界面选择所需的插件(features)与工具栏布局,无需手写任何配置代码;
  3. 在最后一步选择技术与集成方式:"Vanilla JavaScript""Self-hosted (ZIP)"
  4. 下载生成的 ZIP 归档。

下载的 ZIP 包已包含集成所需的全部文件:主 JavaScript 文件、样式表(CSS)、以及示例实现代码。该包开箱即用,无需任何额外的构建步骤。拿到包后,将其解压(本文示例中解压目录名为ckeditor5-builder)放入 Electron 应用主目录即可。

说明:ZIP 方案属于自托管(self-hosted)分发方式。与 npm 安装方式一致,自托管分发要求配置licenseKey:要么遵循 GPL 协议,要么购买自托管商业许可(详见下文「获取许可证」章节)。仓库中 docs/getting-started/integrations/quick-start.md 对 ZIP 包内的文件构成有更细致的说明。

项目结构一览

完成上述步骤后,应用目录结构应类似:

├── ckeditor5-builder # 从 Online Builder 解压出的编辑器资源目录 ├── forge.config.js ├── index.html ├── node_modules/ ├── package-lock.json ├── package.json ├── src/ │ ├── index.css │ ├── main.js # Electron 主进程 │ ├── preload.js # 预加载脚本 │ └── renderer.js # 渲染进程入口 ├── vite.main.config.mjs ├── vite.preload.config.mjs └── vite.renderer.config.mjs

其中ckeditor5-builder即 Online Builder 下载并解压后的文件夹。主进程(src/main.js)、预加载脚本(src/preload.js)与渲染进程(src/renderer.js)由 Electron Forge 脚手架生成,保持默认即可,我们的集成工作集中在index.html与新增的src/editor.js上。

实现编辑器

1. 创建src/editor.js

src/目录下新建editor.js,内容如下:

const { ClassicEditor, Essentials, Bold, Italic, Font, Paragraph } = CKEDITOR; const { FormatPainter } = CKEDITOR_PREMIUM_FEATURES; ClassicEditor .create( { attachTo: document.querySelector( '#editor' ), licenseKey: '<YOUR_LICENSE_KEY>', plugins: [ Essentials, Bold, Italic, Font, Paragraph, FormatPainter ], toolbar: [ 'undo', 'redo', '|', 'bold', 'italic', '|', 'fontSize', 'fontFamily', 'fontColor', 'fontBackgroundColor', '|', 'formatPainter' ] } ) .then( /* ... */ ) .catch( /* ... */ );

这段代码的关键点:

  • CKEDITORCKEDITOR_PREMIUM_FEATURES是全局命名空间:它们由后续在 HTML 中引入的两个 UMD 构建文件提供(ckeditor5.umd.jsckeditor5-premium-features.umd.js),无需 import 语句;
  • plugins数组:传入要加载的插件类。Essentials是必备的核心编辑插件(包含撤销、剪贴板等基础能力),BoldItalicFontParagraph分别提供加粗、斜体、字体(字号/字族/颜色/背景色)与段落功能;FormatPainter是 premium 功能中的格式刷插件;
  • toolbar数组:按顺序声明工具栏按钮,'|'表示分组分隔符,'undo'/'redo'对应撤销/重做;
  • licenseKey:激活编辑器的许可证密钥,必须按实际值替换<YOUR_LICENSE_KEY>
  • attachTo:指定编辑器挂载的 DOM 元素(即index.html中的#editor容器)。

该配置对应仓库中的EditorConfig类型定义(见 packages/ckeditor5-core/src/editor/editorconfig.ts),licenseKeypluginstoolbar等均为标准配置项,对所有编辑器类型(Classic、Inline、Decoupled 等)通用。

2. 修改index.html

将脚手架生成的index.html调整为:

<!doctype html> <html> <head> <meta charset="UTF-8" /> <title>Hello World!</title> <link rel="stylesheet" href="./ckeditor5-builder/ckeditor5/ckeditor5.css"> <link rel="stylesheet" href="./ckeditor5-builder/ckeditor5-premium-features/ckeditor5-premium-features.css"> </head> <body> <h1>Hello Electron and CKEditor 5!</h1> <p>Welcome to your Electron application. Below you should see a working instance of CKEditor 5:</p> <div id="editor"></div> <script src="./ckeditor5-builder/ckeditor5/ckeditor5.umd.js"></script> <script src="./ckeditor5-builder/ckeditor5-premium-features/ckeditor5-premium-features.umd.js"></script> <script src="./src/editor.js"></script> <script type="module" src="/src/renderer.js"></script> </body> </html>

各引入资源的职责如下:

资源作用
ckeditor5.css编辑器基础 UI 与内容样式
ckeditor5-premium-features.csspremium 功能的样式(如格式刷)
ckeditor5.umd.jsCKEditor 5 的 UMD 构建,暴露全局CKEDITOR对象
ckeditor5-premium-features.umd.jspremium 功能 UMD 构建,暴露全局CKEDITOR_PREMIUM_FEATURES对象
src/editor.js负责把上述资源串联起来并初始化编辑器实例
src/renderer.jsElectron 渲染进程脚本(保持脚手架默认)

需要注意脚本引入的顺序:必须先加载 UMD 构建文件,再加载依赖它们的editor.js

3. 运行应用

一切就绪后执行:

npm start

Electron 会自动打开一个窗口,其中即包含一个可用的 CKEditor 5 实例(效果如上文配图所示)。由于资源从本地目录加载,即使断网也能正常运行。

获取 premium 功能的许可证密钥

示例中使用了FormatPainter(格式刷)这一 premium 功能,因此必须使用商业许可证激活:

  • 免费试用:注册 CKEditor Premium Features 14 天免费试用 是最快的体验方式;
  • 商业采购:可联系销售团队获取定制化报价。

拿到激活密钥后,将其填入editor.jslicenseKey配置项即可。完整流程(账户创建、Customer Portal 登录、License keys 区获取密钥、密钥类型说明)参见 docs/getting-started/licensing/license-key-and-activation.md。

这里补充几点与 Electron 自托管场景强相关的许可证要点(依据上述授权文档):

  • 'GPL'密钥仅适用于自托管分发(npm 或 ZIP 下载),Cloud CDN 分发不接受'GPL'密钥。ZIP 自托管方案正好符合此条件——如果你的项目满足 GPL 合规要求且不包含 premium 功能,可直接在licenseKey中写'GPL'
  • 开发环境密钥:若使用开发(Development)类型密钥,编辑器运行时会显示开发用途横幅,且仅限localhost127.0.0.1192.168.*.*等本地域使用,不得用于生产;
  • 生产密钥:无功能限制;可选配 "Approved hosts" 白名单(最多 5 个域名/IP),进一步防止密钥被未授权使用。

在 Electron 中读写编辑器内容

编辑器初始化完成后,与数据交互的标准方式是getData()setData()(详见 docs/getting-started/setup/getting-and-setting-data.md):

// 保存编辑器引用(放在 create().then() 回调之外) let editor; ClassicEditor .create( { attachTo: document.querySelector( '#editor' ), licenseKey: '<YOUR_LICENSE_KEY>', // Or 'GPL'. plugins: [ /* ... */ ], toolbar: [ /* ... */ ] } ) .then( newEditor => { editor = newEditor; } ) .catch( error => { console.error( error ); } ); // 例如:点击按钮时把 HTML 数据发送到本地/远程 document.querySelector( '#save' ).addEventListener( 'click', () => { const data = editor.getData(); // 持久化 data(写入本地文件、调用后端接口等) } ); // 需要时替换整个内容 editor.setData( '<p>Some text.</p>' );

getData()/setData()Editor基类提供的方法(源码见 packages/ckeditor5-core/src/editor/editor.ts),对所有编辑器类型一致。在 Electron 场景中,你可以把getData()返回的 HTML 通过ipcRenderer发给主进程,再用 Node.js 的fs模块写盘,即可实现本地文档的保存能力。

进阶:继续定制与学习

  • 数据读写进阶:root.initialData初始化数据、editor.getData()选项参数、HTML 表单自动同步等,见 获取与设置数据;
  • 编辑器配置:插件安装、工具栏定制、licenseKey等更多配置项,见 配置指南;
  • 功能探索:图片、表格、列表、协作等各功能的详细用法,见 功能文档总览;
  • 许可证与激活:密钥类型、免费计划、自托管合规要求,见 License key and activation。

【免费下载链接】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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 13:46:49

纯前端图片格式转换:Canvas实现PNG/JPG/WebP互转与压缩实践

直接用 Canvas 做纯前端图片格式互转&#xff0c;这事儿听起来好像有点简单&#xff0c;但真正把它做成一个能用的工具&#xff0c;里面值得抠的细节其实不少。最近在项目里要处理用户上传图片的格式统一问题&#xff0c;我又把这套逻辑重新撸了一遍&#xff0c;顺手封装了一个…

作者头像 李华
网站建设 2026/9/15 13:46:32

(全新整理)地级市绿色数据中心DID2016-2025年

文章目录资料下载地址介绍01、数据介绍02、数据指标03、数据截图项目备注资料下载地址资料下载地址 点击这里下载资料 介绍 01、数据介绍 参考了Chao Li等&#xff08;2025&#xff09;等人文献&#xff0c;采用多期双重差分法来识别政策实施的净效应。构建核心交互项 DID&…

作者头像 李华
网站建设 2026/9/15 13:46:00

JavaScript与AI结合:2024年高效学习与开发指南

1. 为什么现在学JavaScript必须结合AI&#xff1f;十年前我刚入行时&#xff0c;JavaScript还只是用来做表单验证的小工具。如今这个语言已经渗透到从浏览器到服务器、从移动端到物联网的每个角落。更关键的是&#xff0c;AI技术正在彻底改变我们编写和理解代码的方式。上周我团…

作者头像 李华
网站建设 2026/9/15 13:45:11

UE4 VR蓝图交互开发实战:从设备映射到动态材质

在VR项目的实习里&#xff0c;我大部分时间都泡在UE4的蓝图里&#xff0c;从人物移动、物件抓取、到触发机关、动态换材质&#xff0c;几乎把交互相关的常用事件都摸了个遍。这篇总结就是把这些实战经验整理出来&#xff0c;适合刚接触虚拟现实开发、正准备做交互Demo、或者马上…

作者头像 李华