ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

在 Next.js 中集成 CKEditor 5(CDN 方式):App Router 与 Pages Router 完整实战

在 Next.js 中集成 CKEditor 5(CDN 方式):App Router 与 Pages Router 完整实战 在 Next.js 中集成 CKEditor 5CDN 方式App Router 与 Pages Router 完整实战【免费下载链接】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 富文本编辑器通过官方 React 组件与 CDN 分发方式集成到 Next.js 应用中覆盖 App Router 与 Pages Router 两种路由策略。读完本文你将掌握为何 CKEditor 5 必须采用客户端渲染CSR、如何用useCKEditorCloud从 CDN 按需加载编辑器与插件、如何使用 Next.js 的dynamic()禁用 SSR以及数据读写、组件属性配置、本地化与类型支持等完整实操方案。为什么 Next.js 中必须客户端渲染CKEditor 5 本质上是一个依赖浏览器 DOM 与运行时 API 的客户端富文本编辑器。而 Next.js 默认支持服务端渲染SSR和静态站点生成SSG在服务端并不存在window、document等浏览器对象因此CKEditor 5 无法在服务端预渲染必须改为客户端渲染CSR方式加载。具体到工程实现需要同时做两件事让承载编辑器的 React 组件成为“客户端组件”——App Router 下用use client指令显式声明Pages Router 无需此指令因为页面本身就是客户端可交互的用 Next.js 内置的dynamic()函数对组件做懒加载并把ssr选项设为false确保组件只在浏览器端渲染。在开始之前你需要一个可用的 Next.js 项目。若尚未创建可参考 Next.js 官方文档使用create-next-appCLI 生成。第一步安装官方 React 集成包Next.js 基于 React因此需要安装 CKEditor 5 React 组件npm install ckeditor/ckeditor5-react该包同时导出CKEditor组件与useCKEditorCloudHook前者负责渲染编辑器实例后者负责从 CDN 加载编辑器代码和插件资源。完整的用法见仓库中的 React 集成指南。使用 CDN 分发需要 CKEditor Cloud CDN 服务请先注册免费账号并了解 许可证密钥的获取与激活。注意CDN 云分发不接受GPL密钥始终要求商业许可证密钥免费商业计划支持每月至多 1,000 次编辑器加载。第二步编写编辑器组件在components目录下新建一个组件例如components/custom-editor.js。首先导入依赖并创建返回CKEditor组件的函数组件。下面的示例同时演示了开源插件与付费premium插件的组合用法// components/custom-editor.js use client // Required only in App Router. import React from react; import { CKEditor, useCKEditorCloud } from ckeditor/ckeditor5-react; const CustomEditor () { const cloud useCKEditorCloud( { version: 48.5.0, premium: true } ); if ( cloud.status error ) { return divError!/div; } if ( cloud.status loading ) { return divLoading.../div; } const { ClassicEditor, Essentials, Paragraph, Bold, Italic } cloud.CKEditor; const { FormatPainter } cloud.CKEditorPremiumFeatures; return ( CKEditor editor{ ClassicEditor } data{ pHello world!/p } config{ { licenseKey: YOUR_LICENSE_KEY, plugins: [ Essentials, Paragraph, Bold, Italic, FormatPainter ], toolbar: [ undo, redo, |, bold, italic, |, formatPainter ] } } / ); }; export default CustomEditor;要点说明use client指令App Router 默认使用服务端组件必须将该指令放在文件顶部所有 import 之上使用 Pages Router 时则不需要。useCKEditorCloudHook负责把 CDN 的script与link标签注入页面head并保证资源只被加载一次。premium: true表示同时加载付费插件会额外产生网络请求按需开启。关于该 Hook 的完整选项详见仓库的 Loading CDN resources 指南。version指定要加载的 CKEditor 5 与付费功能的版本号。本仓库当前版本为48.5.0实践中建议按你使用的版本填写以保证与 CDN 上的构建产物一致。cloud.status取值loading/error/ready组件据此渲染加载中、出错或编辑器本体避免在资源未就绪时初始化编辑器。第三步用dynamic()禁用 SSRCKEditor 5 依赖浏览器 API因此需要为上述组件准备一个仅客户端渲染的包装组件利用 Next.js 内置的dynamic()函数实现懒加载// components/client-side-custom-editor.js use client // Required only in App Router. import dynamic from next/dynamic; const ClientSideCustomEditor dynamic( () import( /components/custom-editor ), { ssr: false } ); export default ClientSideCustomEditor;{ ssr: false }明确告诉 Next.js 不要对该组件做服务端渲染从而规避 SSR 环境下浏览器 API 缺失导致的崩溃。第四步在页面中使用把包装组件引入页面即可。页面目录依路由策略而异// app/page.js (App Router) // pages/index.js (Pages Router) import ClientSideCustomEditor from /components/client-side-custom-editor; function Home() { return ( ClientSideCustomEditor / ); } export default Home;随后运行项目。如果使用create-next-app创建的项目在终端执行npm run dev即可在浏览器中查看编辑器。常见问题与排错编辑器显示异常Next.js 项目自带一套全局 CSS可能与编辑器的 UI 样式相互干扰。若编辑器渲染异常请移除或调整这些样式文件或补充你自己的样式覆盖。导入路径别名上文组件使用了 Next.js 默认的导入别名指向项目根目录。若你的项目未配置该别名请将/components/...改为实际的相对路径例如../components/custom-editor。许可证密钥示例中licenseKey: YOUR_LICENSE_KEY为占位符。若使用付费插件必须替换为你在 Customer Portal 获取的真实密钥密钥的申请、类型试用/开发/生产/评估与激活细节见 License key and activation。深入useCKEditorCloudCDN 资源加载机制useCKEditorCloud是底层loadCKEditorCloud函数在 React 中的封装对应 Vue 集成亦有同名的响应式封装其职责是动态注入script与link标签、去重避免重复加载、暴露 CDN 资源导出的数据对象并同步加载状态到组件内部状态。两个函数接受完全相同的选项选项类型说明versionstring必填要加载的 CKEditor 5及付费功能当premium: true时版本号translationsstring[]可选需要加载的 UI 语言代码数组例如[ es, de ]premiumboolean可选是否加载付费插件会触发额外网络请求ckboxobject可选CKBox 集成配置例如{ version, theme: lark }theme默认larkpluginsobject可选额外第三方插件的加载配置键为全局插件名injectedHtmlElementsAttributesobject可选注入的script/link标签属性默认{ crossorigin: anonymous }可用于附加integrity等安全属性其中plugins支持三种写法字符串数组形式的脚本与样式表 URL、() import(...)动态导入函数、以及带scripts/stylesheets/checkPluginLoaded的完整描述对象。checkPluginLoaded回调用于在插件挂载的全局变量名与对象键不一致时自定义“插件是否已加载”的判断逻辑否则对象键必须与插件写入window的全局名一致。完整的选项示例摘自 loading-cdn-resources.md{ version: 48.5.0, translations: [ es, de ], premium: true, ckbox: { version: 2.0.0, theme: lark // Optional, default lark. }, plugins: { ThirdPartyPlugin: [ https://cdn.example.com/plugin.umd.js, https://cdn.example.com/plugin.css ], AnotherPlugin: () import( ./path/to/plugin.umd.js ), YetAnotherPlugin: { scripts: [ https://cdn.example.com/plugin.umd.js ], stylesheets: [ https://cdn.example.com/plugin.css ], // Optional, if its not passed then the name of the plugin will be used. checkPluginLoaded: () window.PLUGIN_NAME } } }调用后返回对象的可用属性随配置变化基础库为CKEditorpremium: true时提供CKEditorPremiumFeatures配置了ckbox时提供CKBoxplugins中注册的每个插件名也都会成为返回对象的属性。若无需 React 的 Hook 形态例如在普通 JavaScript 模块中可安装ckeditor/ckeditor5-integrations-common后直接使用loadCKEditorCloudnpm install ckeditor/ckeditor5-integrations-commonimport { loadCKEditorCloud } from ckeditor/ckeditor5-integrations-common; const { CKEditor, CKEditorPremiumFeatures } await loadCKEditorCloud( { version: 48.5.0, premium: true } );CKEditor组件属性速查CKEditor是官方 React 集成暴露的核心组件支持以下常用属性详见 react-default-cdn.mdeditor必填要使用的编辑器构造函数如ClassicEditordata编辑器的初始数据config编辑器配置对象id编辑器 ID变更时组件会以新数据重启编辑器而非原地设值disabled布尔值为true时切换为只读模式disableWatchdog/watchdogConfig是否禁用及如何配置 watchdog 崩溃保护onReady/onAfterDestroy/onChange/onBlur/onFocus/onError生命周期与事件回调其中onChange、onBlur、onFocus的回调接收( eventInfo, editor )两个参数onError接收错误实例与包含phaseinitialization/runtime和willEditorRestart的错误详情对象。读取与提交编辑器数据编辑器的内容读写通过编辑器实例方法完成editor.getData()取回内容可用于提交表单、发送到服务端editor.setData( pSome text./p )替换内容。在 React 组件中通常把editor实例保存在onReady回调或受控状态里再按需调用也可监听onChange实时同步内容。初始内容除了data属性外还可在配置中用root.initialData指定详见 Getting and setting data 指南。若希望内容在离开页面时自动保存可启用官方 autosave 功能。进一步定制本地化在useCKEditorCloud的配置中传入translations: [ es ]等语言数组即可加载对应语言包详见 Setting the UI language上下文Context与协作功能ckeditor/ckeditor5-react提供CKEditorContext组件配合context、contextWatchdog、onChangeInitializedEditors等属性可承载多个编辑器实例与协作类功能其他编辑器类型CKEditor同样支持InlineEditor、BalloonEditor、DecoupledEditor文档型等多根编辑器则使用专门的 multi-root Hook。文档型编辑器需要手动把editor.ui.view.toolbar.element挂载到 DOM可借助onReady回调实现TypeScript 支持官方 React 集成以 TypeScript 编写可直接使用需要类型时从ckeditor5包类型定义包导入EventInfo等类型而不要直接 importckeditor5的运行时代码以免造成重复打包。付费功能的类型可额外安装ckeditor5-premium-features包获取。后续深入学习编辑器的数据读写进阶Getting and setting data编辑器整体配置Configuration按功能深入了解Features。【免费下载链接】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),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进