CKEditor 4 插件加载配置详解:plugins / extraPlugins / removePlugins 的数组与字符串两种写法
前端UI组件【免费下载链接】ckeditor4The best enterprise-grade WYSIWYG editor. Fully customizable with countless features and plugins.项目地址https://gitcode.com/gh_mirrors/ck/ckeditor4点击查看免费下载本文以仓库内手动测试用例 tests/core/config/manual/pluginsarray.md对应功能编号 #1802随 CKEditor 4.10.0 引入为骨架系统讲解 CKEditor 4 中控制插件加载的三个核心配置项plugins、extraPlugins、removePlugins它们各自的作用、字符串与数组两种写法的等价性、底层解析与合并逻辑以及配套的自动化测试验证。读完本文你将能够精确控制任意编辑器实例加载的插件集合并理解数组写法与逗号分隔字符串写法在源码层面是如何被统一处理的。一、三个配置项的角色分工在 CKEditor 4 中每个编辑器实例实际加载哪些插件由editor.config中三个配置项共同决定配置项类型作用默认值pluginsString/String[]指定实例要使用的插件列表整体替换默认插件集合构建时替换为默认插件列表见 core/config.jsextraPluginsString/String[]在plugins基础上追加额外插件无需改动plugins原值core/config.jsremovePluginsString/String[]从plugins中剔除不需要的插件core/config.js这三个配置项在官方 API 文档中均声明为String/String[]双类型。传统用法是逗号分隔字符串例如config.plugins wysiwygarea,toolbar,basicstyles; config.extraPlugins myplugin,anotherplugin; config.removePlugins elementspath,save,font;而从 4.10.0 开始issue #1802三者同样接受数组写法例如config.plugins [ wysiwygarea, toolbar, basicstyles ]; config.extraPlugins [ myplugin, anotherplugin ]; config.removePlugins [ elementspath, save, font ];两种写法在功能上完全等价手动测试文档 tests/core/config/manual/pluginsarray.md 正是专门用来验证数组写法下各编辑器实际加载的插件集合是否符合预期。二、手动测试场景还原数组写法的三种用法配套测试页 tests/core/config/manual/pluginsarray.html 在同一页面创建了三个编辑器实例逐一演示三个配置项使用数组写法时的效果。测试页首先定义了一个公共配置commonConfig其中plugins为字符串wysiwygarea,toolbar并在instanceReady事件中将实例实际加载的插件名写入编辑器内容方便人工核对var commonConfig { plugins: wysiwygarea,toolbar, on: { instanceReady: function() { this.setData( pI have following plugins loaded: CKEDITOR.tools.object.keys( this.plugins ) /p ); } } };注意这里通过CKEDITOR.tools.object.keys( this.plugins )获取编辑器实例上已加载插件的键名集合——editor.plugins在插件加载完成后会包含所有已加载的插件对象见 core/editor.js。1.plugins数组整体替换插件列表CKEDITOR.replace( plugins, CKEDITOR.tools.extend( { plugins: [ wysiwygarea, toolbar, button ] }, commonConfig, false ) );该实例的plugins被数组整体覆盖为wysiwygarea、toolbar、button。文档 tests/core/config/manual/pluginsarray.md 中列出的预期结果为wysiwygareatoolbarbutton2.extraPlugins数组追加插件CKEDITOR.replace( extraPlugins, CKEDITOR.tools.extend( { extraPlugins: [ button, blockquote ] }, commonConfig ) );该实例继承了公共配置plugins: wysiwygarea,toolbar再通过数组extraPlugins: [ button, blockquote ]追加两个插件预期加载结果为wysiwygareatoolbarbuttonblockquote3.removePlugins数组剔除插件CKEDITOR.replace( removePlugins, CKEDITOR.tools.extend( { removePlugins: [ image, toolbar ] }, commonConfig ) );该实例同样继承plugins: wysiwygarea,toolbar再通过数组removePlugins: [ image, toolbar ]剔除其中image本就不在列表中属冗余剔除最终只剩wysiwygarea手动验证流程按文档 tests/core/config/manual/pluginsarray.md 的描述测试步骤为打开测试页检查每个编辑器中列出的已加载插件是否与上文各列表一致预期Expected所有列出的插件均已加载与各列表完全一致非预期Unexpected实际加载的插件与列表不一致。该文档以bender-tags: feature, 4.10.0, 1802标注属于 Bender 手动测试manual test由人工在浏览器中核对运行结果。三、源码原理数组如何在加载管线中被统一为字符串数组写法之所以能与字符串写法等价关键在于 core/editor.js 中的parsePluginsOption解析函数// Parse *plugins option into a string (#1802). function parsePluginsOption( option ) { if ( !option ) { return ; } if ( CKEDITOR.tools.isArray( option ) ) { option option.join( , ); } // We have to remove whitespaces (#1712). return option.replace( /\s/g, ); }该函数在loadPluginscore/editor.js中被统一调用对三个配置项做同样的预处理function loadPlugins( editor ) { var config editor.config, plugins parsePluginsOption( config.plugins ), extraPlugins parsePluginsOption( config.extraPlugins ), removePlugins parsePluginsOption( config.removePlugins ); if ( extraPlugins ) { // Remove them first to avoid duplications. var extraRegex new RegExp( (?:^|,)(?: extraPlugins.replace( /,/g, | ) )(?,|$), g ); plugins plugins.replace( extraRegex, ); plugins , extraPlugins; } if ( removePlugins ) { var removeRegex new RegExp( (?:^|,)(?: removePlugins.replace( /,/g, | ) )(?,|$), g ); plugins plugins.replace( removeRegex, ); } // Load the Adobe AIR plugin conditionally. CKEDITOR.env.air ( plugins ,adobeair ); // Load all plugins defined in the plugins setting. CKEDITOR.plugins.load( plugins.split( , ), function( plugins ) { // ... } ); }从源码可以梳理出插件列表的最终合并顺序解析归一三个配置项经parsePluginsOption统一转为无空白的逗号分隔字符串数组join(,)空值返回合并extraPlugins先通过正则将extraPlugins中已有的插件从plugins里剔除避免重复再整体追加到plugins末尾应用removePlugins通过正则把要移除的插件从合并后的列表里删除环境插件追加在 Adobe AIR 环境下条件性追加adobeair真正加载将最终字符串split(,)后交给CKEDITOR.plugins.load()异步加载。由此可见数组写法并非另起炉灶而是在进入加载管线前被join(,)归一为传统字符串因此两种写法在任何行为细节上包括去重、剔除、空值处理都完全一致。四、重要边界被依赖插件不可移除removePlugins并非可以任意使用。官方配置文档在 core/config.js 中明确说明A plugin required by another plugin cannot be removed and will cause an error to be thrown. So for example ifcontextmenuis required bytabletools, it can only be removed iftabletoolsis not loaded.也就是说若某个已加载插件声明requires了被移除的插件加载过程会抛出错误。对应实现位于 core/editor.js加载循环中会检查每个插件的requires数组会被join(,)转成字符串若与removeRegex匹配则通过CKEDITOR.error( editor-plugin-required, ... )抛出非阻塞错误。在手动测试页中removePlugins: [ image, toolbar ]之所以能安全移除toolbar是因为其余已加载插件wysiwygarea并不依赖它实际项目中若同时加载了依赖被移除插件的功能插件就会触发该错误。五、自动化测试佐证除手动测试外仓库还提供了完整的自动化测试 tests/core/config/plugins.js覆盖了数组写法及各种边界情况数组写法#1802test extraPlugins allows array、test plugins allows array、test removePlugins allows array三个用例分别验证三个配置项传入数组后editor.plugins中实际包含/不包含对应插件空白容忍#1712test plugins allows whitespaces、test extraPlugins allows whitespaces、test removePlugins allows whitespaces验证basicstyles, image2, toolbar 这类带空格字符串能被正确解析对应parsePluginsOption中的replace( /\s/g, )空值容忍test plugins doesnt throw with undefined验证三个配置项传undefined时不会抛异常对应parsePluginsOption开头的if ( !option ) return ;。这些用例也印证了手动测试页中三个编辑器各自加载的插件集合互不相同的预期plugins决定基础集合extraPlugins做加法removePlugins做减法三者叠加后的最终集合即为 tests/core/config/manual/pluginsarray.md 中列出的三份清单。六、实践建议结合文档与源码在实际项目中使用这三个配置项时可遵循以下经验字符串与数组任选二者完全等价源码层面数组会被join(,)归一团队约定一种风格即可数组写法在动态生成插件列表如由程序拼接时更不易出错。善用extraPlugins而非改写plugins追加第三方或业务插件时优先使用extraPlugins避免因复制默认插件列表而遗漏必要插件如wysiwygarea、toolbar这也是 core/config.js 中该配置项的设计初衷。removePlugins谨慎剔除剔除前确认目标插件不被任何仍将加载的插件requires否则会触发editor-plugin-required错误。调试利器可在instanceReady事件中通过CKEDITOR.tools.object.keys( editor.plugins )打印实例实际加载的插件列表与预期清单比对——这正是手动测试页 tests/core/config/manual/pluginsarray.html 的做法也是排查按钮消失功能不可用等常见问题的最快途径。赞分享前端UI组件【免费下载链接】ckeditor4The best enterprise-grade WYSIWYG editor. Fully customizable with countless features and plugins.项目地址https://gitcode.com/gh_mirrors/ck/ckeditor4点击查看免费下载相关推荐CKEditor 4 extraPlugins 配置深入解析从手动测试用例到插件加载机制CKEditor 4 extraPlugins 配置深入解析从手动测试用例到插件加载机制 本文以 CKEditor 4 仓库中的手动测试用例 tests/co前端UI组件Farm external 配置完全指南字符串与映射两种写法、运行时注入与源码级原理Farm external 配置完全指南字符串与映射两种写法、运行时注入与源码级原理 导读 external 是 Farm用 Rust 编写的 Vite 兼前端构建构建工具开发工具CloudQuery Neo4j 目标插件配置指南连接字符串、认证与批量写入参数详解CloudQuery Neo4j 目标插件配置指南连接字符串、认证与批量写入参数详解 导读 本文以 CloudQuery 仓库中 Neo4j 目标插件的配置文数据集成数据工程数据分析上一篇3分钟上手OmarchyLazyVim插件管理新范式下一篇告别寻路难题ET框架AI路径规划实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考