frappe-ui编辑器家族使用教程:RichTextKit与自定义扩展实战
frappe-ui是一套用于快速UI开发的组件和工具集,其中编辑器家族提供了强大的富文本编辑能力。RichTextKit作为frappe-ui编辑器家族的核心组件,为开发者提供了构建专业文档、文章和wiki所需的全套功能。本教程将带您深入了解RichTextKit的使用方法,并通过实战案例展示如何创建自定义扩展,让您的编辑器功能更加强大。
RichTextKit简介:打造专业级富文本编辑器
RichTextKit是frappe-ui编辑器家族中的旗舰产品,基于CommentKit构建,并增加了更多高级功能。它专为创建结构化文档而设计,提供了从简单文本格式化到复杂表格、任务列表和嵌入式媒体的全方位支持。
RichTextKit核心功能
RichTextKit默认包含以下核心功能:
- 文本格式化:粗体、斜体、下划线、删除线等基础格式
- 段落样式:标题、引用、代码块等
- 媒体支持:图片、视频上传与预览
- 表格功能:创建、编辑复杂表格结构
- 任务管理:可勾选的任务列表
- 高级排版:文本对齐、颜色、高亮等
- 内容组织:目录生成、链接插入
- 快捷操作:斜杠命令、样式复制粘贴
快速开始使用RichTextKit
要在项目中使用RichTextKit,首先需要导入相关组件:
import { Editor, RichTextKit } from 'frappe-ui/editor'
然后在模板中使用Editor组件,并配置RichTextKit:
<Editor
v-model="content"
:extensions="[
RichTextKit.configure({
// 配置选项
})
]"
/>
RichTextKit高级配置:定制您的编辑器
RichTextKit提供了丰富的配置选项,可以根据项目需求定制编辑器功能。通过configure方法,您可以启用或禁用特定功能,调整默认行为。
核心配置选项
以下是一些常用的配置选项:
RichTextKit.configure({
// 表格配置
table: {
resizable: true,
cellBackgroundColor: true
},
// 任务列表配置
taskList: {
nested: true
},
// 颜色配置
color: {
colors: ['#FF0000', '#00FF00', '#0000FF']
},
// 禁用不需要的功能
emoji: false,
iframe: false
})
自定义工具栏
虽然RichTextKit提供了默认的工具栏,但您可以根据需要创建自定义工具栏。frappe-ui提供了多种菜单组件,包括:
- TextEditorFixedMenu:顶部固定菜单
- TextEditorBubbleMenu:选中内容时显示的气泡菜单
- TextEditorFloatingMenu:浮动菜单
这些组件可以在src/components/TextEditor/components/目录中找到。您可以通过组合这些组件,创建符合项目需求的自定义工具栏。
自定义扩展开发:构建专属编辑器功能
frappe-ui编辑器的强大之处在于其可扩展性。通过创建自定义扩展,您可以为编辑器添加独特的功能,满足特定业务需求。
扩展开发基础
frappe-ui编辑器基于Tiptap构建,因此扩展开发遵循Tiptap的扩展API。一个基本的扩展结构如下:
import { Extension } from '@tiptap/core'
export const CustomExtension = Extension.create({
name: 'customExtension',
addOptions() {
return {
// 扩展选项
}
},
addCommands() {
return {
// 自定义命令
}
},
addProseMirrorPlugins() {
return [
// ProseMirror插件
]
}
})
实战:创建链接扩展
让我们以链接扩展为例,了解如何创建一个实用的自定义扩展。frappe-ui已经提供了一个功能完善的链接扩展,位于src/molecules/editor/extensions/link/link-extension.ts。
这个扩展实现了以下功能:
- 链接创建和编辑
- 粘贴链接自动识别
- 链接点击处理
- 快捷键支持(Mod+k)
以下是该扩展的核心代码片段:
export const LinkExtension = Link.extend({
addOptions() {
return {
...this.parent!(),
openOnClick: false,
autolink: true,
defaultProtocol: 'https',
linkOnPaste: false,
shouldAutoLink: (url: string): boolean => {
const hasScheme = /^[a-z][a-z0-9+.-]*:/i.test(url)
const hasWww = /^www\./i.test(url)
return hasScheme || hasWww
},
}
},
addCommands() {
return {
...this.parent?.(),
openLinkEditor: buildOpenLinkEditor(this.type),
}
},
addProseMirrorPlugins() {
const plugins = this.parent?.() ?? []
plugins.push(
linkPastePlugin({ editor: this.editor, type: this.type }),
clearLinkOnBoundaryPlugin({ editor: this.editor, type: this.type }),
linkClickPlugin({ editor: this.editor, type: this.type }),
linkShortcutPlugin({ editor: this.editor }),
)
return plugins
},
})
扩展注册与使用
创建自定义扩展后,需要将其注册到编辑器中:
import { Editor, RichTextKit } from 'frappe-ui/editor'
import { CustomExtension } from './custom-extension'
// 在模板中
<Editor
v-model="content"
:extensions="[
RichTextKit.configure({
// RichTextKit配置
}),
CustomExtension.configure({
// 自定义扩展配置
})
]"
/>
编辑器家族其他成员:选择最适合您的工具
除了RichTextKit,frappe-ui编辑器家族还提供了其他专门的编辑器工具,以满足不同场景的需求。
CommentKit:轻量级评论编辑器
CommentKit是一个轻量级编辑器,适用于评论、聊天和回复场景。它包含了RichTextKit的核心功能,但默认禁用了一些复杂功能如表格,以保持界面简洁。
import { CommentKit } from 'frappe-ui/editor'
// 使用CommentKit
<Editor
v-model="comment"
:extensions="[CommentKit.configure({})]"
/>
InlineKit:单行富文本编辑器
InlineKit专为单行文本编辑设计,如标题、名称等。它限制编辑器只能包含一个块级元素,防止换行,同时支持基本的文本格式化。
import { InlineKit } from 'frappe-ui/editor'
// 使用InlineKit
<Editor
v-model="title"
:extensions="[InlineKit.configure({})]"
/>
最佳实践与常见问题
性能优化
对于大型文档,编辑器性能可能成为问题。以下是一些优化建议:
- 实现文档分块加载,只加载当前可见部分
- 禁用不需要的扩展功能
- 使用节流处理内容更新事件
常见问题解决
- 图片上传问题:检查uploadFunction配置,确保文件上传接口正确实现
- 格式粘贴问题:使用ContentPaste扩展控制粘贴内容的格式化程度
- 自定义命令不生效:确保命令名称没有冲突,并正确注册到编辑器
总结:打造强大的富文本编辑体验
frappe-ui的编辑器家族为开发者提供了全面的富文本编辑解决方案。RichTextKit作为其中的核心组件,结合其可扩展的架构,使您能够构建从简单评论到复杂文档的各种编辑体验。通过本文介绍的配置选项和自定义扩展开发方法,您可以进一步定制编辑器,满足特定的业务需求。
无论是构建内容管理系统、协作平台还是任何需要富文本编辑的应用,frappe-ui编辑器家族都能为您提供坚实的基础和灵活的扩展能力。开始探索frappe-ui编辑器家族,为您的项目带来专业级的富文本编辑体验吧!
官方文档和更多示例可以在项目的docs/目录中找到,帮助您深入了解每个组件的详细用法和高级特性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



