Builder.io 富文本编辑器插件实战:用 Jodit 替换内置 Quill,解锁表格、视频与特殊字符创作
Builder.io 富文本编辑器插件实战用 Jodit 替换内置 Quill解锁表格、视频与特殊字符创作【免费下载链接】builderVisual Development for React, Vue, Svelte, Qwik, and more项目地址: https://gitcode.com/GitHub_Trending/bu/builderBuilder.io 内置的富文本编辑器基于 Quill 实现虽然足以应付轻量排版却无法插入表格、视频、特殊字符等复杂 HTML 元素。本文基于当前仓库中的 jodit-html-editor 插件讲解如何通过Builder.registerEditor()将内置richText编辑器整体替换为功能更完整的 Jodit 编辑器并覆盖插件接入、本地开发、生产构建到源码级原理的完整链路。读完本文你将掌握在 Builder.io 视觉开发环境中注册自定义富文本编辑器的标准做法并能直接复用或改造本插件。为什么需要替换内置富文本编辑器Builder.io 的视觉开发体验围绕所见即所得的编辑展开其中富文本字段richText是内容创作中最常用的能力之一。仓库中 核心 SDK 类型定义 与 SDK 输入类型 都声明了richText?: boolean用于标记某个文本字段使用富文本编辑器。但内置的 Quill 编辑器存在明显局限它无法插入表格、视频、特殊字符等 HTML 标签。对于需要完整内容创作能力的场景例如博客正文、营销长文、帮助文档这种限制会显著拖慢内容生产效率。插件 README 明确指出本插件改用另一款开源富文本编辑器Jodit它可以扩展出上述绝大多数 HTML 标签能力从而在需要丰富内容创作时提供更完整的编辑体验。从两张界面截图的对比可以直观看出差异Quill工具栏仅提供加粗、斜体、下划线、删除线、字号/颜色、列表、对齐、链接与图片等基础能力编辑区没有状态统计Jodit工具栏分多行排列额外提供表格、视频、音频、特殊符号、表情、代码块、水平线、全屏、预览、打印等能力编辑区底部还带有CHARS: 0 WORDS: 0字符统计与POWERED BY JODIT状态栏。这正是该插件存在的价值以极小成本替换编辑器内核换取从基础排版到完整 HTML 创作的能力跃迁。插件核心实现一行注册整体覆盖插件源码非常精简全部逻辑集中在 src/plugin.tsx 这一个文件中/** jsx jsx */ import { jsx } from emotion/core; import { Builder } from builder.io/sdk; import JoditEditor from jodit-react; const config { useSplitMode: true, enableDragAndDropFileToEditor: true, uploader: { insertImageAsBase64URI: true } } interface TextProps { value: string; onChange: (value: string) void; } function RichTextEditor(props: TextProps) { return ( JoditEditor value{props.value} onChange{props.onChange} config{config} / ); } Builder.registerEditor({ /** * Here we override the built-in richtext editor. */ name: richText, component: RichTextEditor, });关键点拆解如下注册名称即覆盖点Builder.registerEditor({ name: richText, component: RichTextEditor })。name: richText与 Builder.io 内置富文本编辑器的注册名完全一致因此注册后 Builder.io 会在所有富文本字段上使用这个新的组件实现整体覆盖而非并列共存。组件契约RichTextEditor接收{ value: string; onChange: (value: string) void }。这是 Builder.io 对自定义编辑器的标准协议——编辑器必须能展示当前值、并在内容变化时回调新值从而把内容写回模型。JSX 风格配置通过emotion/core的jsx编译指示启用 Emotion 风格的 JSX这是 Builder.io 插件生态的统一做法webpack 配置中也将emotion/core声明为 external。config 配置项逐条解析源码中的config对象直接透传给jodit-react的JoditEditor config{config} /三项配置的含义与作用如下配置项取值作用useSplitModetrue开启 Jodit 的分屏Split模式编辑区域与即时预览区域上下分离编辑同时即可预览渲染效果enableDragAndDropFileToEditortrue允许直接把本地文件拖拽进编辑区配合上传器完成图片等资源的快速插入uploader.insertImageAsBase64URItrue上传器将图片以 Base64 Data URI 形式内联插入内容省去单独配置上传服务的成本适合原型与轻量场景这三个配置共同服务于完整内容创作的核心目标分屏模式提升长文编辑体验拖拽与 Base64 内联降低资源插入门槛。在 Builder.io 后台接入插件插件已发布为 npm 包builder.io/plugin-jodit-html-editor见 package.json 中的name字段在 Builder.io 可视化编辑器内即可直接加载无需编写任何代码进入Account Settings账户设置点击Plugins区域的铅笔图标进入插件管理输入插件地址builder.io/plugin-jodit-html-editor点击Save保存。保存后Builder.io 应用会加载该插件包并执行其中的Builder.registerEditor()注册逻辑将当前空间的富文本编辑器切换为 Jodit。此流程是 Builder.io 插件体系的通用接入方式本仓库中其他插件如 cloudinary、async-dropdown均采用同一注册入口。本地开发与调试在改动插件源码前需要先在本地把工程跑起来。插件 README 给出了标准的三步流程git clone https://gitcode.com/GitHub_Trending/bu/builder cd plugins/jodit-html-editor npm install安装依赖后有两个常用命令对应 package.json 的scripts# 本地启动开发服务器实时编译并热更新 npm run start # 生产模式构建产出 SystemJS 格式的插件 bundle npm run build开发服务器细节npm run start实际执行的是webpack-dev-server --mode development见 webpack.config.js其关键配置包括端口port: 1268开发服务器固定监听 1268 端口CORS 头Access-Control-Allow-Origin: *允许 Builder.io 应用跨域加载本地插件 bundle入口./src/${pkg.entry}.tsx即src/plugin.tsx内容目录dist作为静态资源根目录。开发时你可以在 Builder.io 的插件地址处填入本地开发服务器地址如http://localhost:1268/plugin.system.js即可在真实编辑环境中实时预览插件改动。构建产物说明npm run build执行webpack --mode production输出配置如下输出文件名plugin.system.js来自 package.json 的output字段输出目录dist模块格式libraryTarget: system产出 SystemJS 格式模块这是 Builder.io 插件运行时加载机制所要求的格式externals将react、builder.io/sdk、material-ui/core、emotion/core、emotion/styled声明为外部依赖不打包进产物由宿主环境提供避免 React 多实例冲突。此外 package.json 中main与unpkg均指向dist/plugin.system.jsfiles只发布dist目录确保 npm 包体只包含构建产物。release:patch/release:minor/release:dev三个脚本则封装了构建 → 版本号递增 → npm publish的完整发布流程。底层原理registerEditor 如何把编辑器交给 Builder.io要理解这个插件为何能以覆盖方式生效需要看核心 SDK 中Builder.registerEditor的实现见 packages/core/src/builder.class.tsstatic registerEditor(info: any) { if (Builder.isBrowser) { window.postMessage( { type: builder.registerEditor, data: omit(info, component), }, * ); // ... } this.editors.push(info); }关键机制拆解postMessage 通信在浏览器环境下插件通过window.postMessage向宿主Builder.io 编辑器应用发送type: builder.registerEditor的消息。消息的data中通过omit(info, component)剔除了 React 组件本身——因为跨窗口无法直接传递函数组件会在宿主环境内按注册名查找并使用。本地注册表同时把完整info含组件推入静态数组this.editors供同窗口环境下的解析使用。环境校验Builder.registerEditor()如果在非可信域名下被调用会输出明确错误提示You cannot load custom editors from your app, they must be loaded through the Builder.io app itself。这印证了插件 README 中在 Account Settings 中添加插件的接入路径——自定义编辑器必须由 Builder.io 应用本身加载而不是在业务站点中引入。结合 builder.class.ts 中case builder.registerEditor:的消息处理分支可以看出Builder.io 宿主应用会监听该消息类型并把编辑器注册到运行时注册表最终使name相同的字段编辑器被新组件替换。适用场景与边界说明综合文档与源码这个插件的适用场景和需要注意的边界如下适用场景需要在 Builder.io 富文本字段中创作复杂 HTML 内容表格、视频、音频、特殊符号、表情、代码块等的项目希望在编辑时获得字符统计、分屏预览等增强体验的团队。图片插入策略insertImageAsBase64URI: true意味着图片以内联 Base64 存储。此方案免配置、便于原型验证但会显著增大内容体积在正式生产环境中建议按需改为配置独立上传服务。覆盖范围注册名固定为richText因此替换是全局性的——所有使用 Builder.iorichText字段的地方都会切换到 Jodit属于产品级行为切换前建议先在测试空间中验证。运行时约束插件必须在 Builder.io 应用环境中加载通过 Plugins 管理或本地开发服务器地址不能从业务应用内部调用Builder.registerEditor()否则会被核心 SDK 的环境校验拦截。从 插件源码 到 核心注册机制再到 构建配置本插件展示了一条完整、可复制的自定义编辑器实现路径任何具备value/onChange协议的编辑器组件都可以通过Builder.registerEditor({ name: richText, component })无缝接入 Builder.io 的视觉开发流程。【免费下载链接】builderVisual Development for React, Vue, Svelte, Qwik, and more项目地址: https://gitcode.com/GitHub_Trending/bu/builder创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →