使用Tiptap构建富文本编辑器的教程

使用Tiptap构建富文本编辑器的教程

Tiptap是一个基于ProseMirror的无头(headless)富文本编辑器框架,专为现代Web应用设计。它提供了强大的核心功能,同时允许开发者完全控制编辑器的外观和交互。本教程将指导你从零开始构建一个基础的Tiptap编辑器。

第一步:初始化项目
首先,你需要一个前端项目。如果你没有现成的项目,可以使用Vite快速创建一个。
打开终端,执行以下命令:
npm create vite@latest my-tiptap-editor — –template vanilla
创建后,进入项目目录:cd my-tiptap-editor

第二步:安装Tiptap
在项目目录下,安装Tiptap的核心包和必要的扩展。
运行命令:
npm install @tiptap/core @tiptap/pm @tiptap/starter-kit
starter-kit包包含了一些常用扩展,能让你快速开始。

第三步:创建基础编辑器
在项目的主HTML文件(例如index.html)中,创建一个用于挂载编辑器的元素。

接下来,在JavaScript文件(例如main.js)中,初始化编辑器。
首先导入所需模块:
import { Editor } from ‘@tiptap/core’
import StarterKit from ‘@tiptap/starter-kit’
然后,初始化一个新的Editor实例:
const editor = new Editor({
element: document.querySelector(‘#editor’),
extensions: [
StarterKit,
],
content: ‘

从这里开始编辑你的文档。

‘,
})
现在,如果你运行项目(npm run dev),应该能看到一个基础的富文本编辑器,已经支持加粗、斜体等基本格式。

第四步:添加自定义扩展
Tiptap的强大之处在于其可扩展性。你可以添加自定义节点、标记或功能。
例如,添加一个简单的自定义扩展来支持荧光笔标记。
首先,创建一个新的扩展文件(例如Highlight.js),或者直接在main.js中定义:
import { Mark } from ‘@tiptap/core’
const Highlight = Mark.create({
name: ‘highlight’,
addAttributes() {
return {
color: {
default: ‘yellow’,
},
}
},
parseHTML() {
return [
{
tag: ‘mark’,
},
]
},
renderHTML({ HTMLAttributes }) {
return [‘mark’, HTMLAttributes, 0]
},
addCommands() {
return {
setHighlight: (attributes) => ({ commands }) => {
return commands.setMark(this.name, attributes)
},
toggleHighlight: (attributes) => ({ commands }) => {
return commands.toggleMark(this.name, attributes)
},
unsetHighlight: () => ({ commands }) => {
return commands.unsetMark(this.name)
},
}
},
})
然后,将这个扩展添加到编辑器的extensions数组中:
const editor = new Editor({
element: document.querySelector(‘#editor’),
extensions: [
StarterKit,
Highlight, // 添加自定义扩展
],
content: ‘

你可以使用荧光笔标记文本。

‘,
})
为了使用这个新功能,你可以通过编辑器实例的commands来调用相关命令,或者将其绑定到UI按钮上。

第五步:构建用户界面
Tiptap本身不提供UI,你需要创建自己的工具栏。
在HTML中添加一个工具栏容器:


在JavaScript中为按钮添加事件监听器,以执行编辑器命令:
document.querySelector(‘#bold-btn’).addEventListener(‘click’, () => {
editor.chain().focus().toggleBold().run()
})
document.querySelector(‘#highlight-btn’).addEventListener(‘click’, () => {
editor.chain().focus().toggleHighlight({ color: ‘yellow’ }).run()
})
通过chain()方法可以组合多个命令,focus()确保编辑器保持焦点,run()执行命令链。

第六步:处理内容与状态
你可以随时获取和设置编辑器的内容。
获取HTML内容:
const html = editor.getHTML()
获取JSON内容(用于保存文档结构):
const json = editor.getJSON()
设置内容:
editor.commands.setContent(‘

新的内容

‘)
监听内容变化:
editor.on(‘update’, ({ editor }) => {
console.log(‘内容已更新:’, editor.getHTML())
})

第七步:样式定制
你可以通过CSS完全控制编辑器的外观。
为编辑区域添加基本样式:
#editor {
min-height: 200px;
border: 1px solid #ccc;
padding: 1rem;
border-radius: 4px;
}
#editor:focus {
outline: none;
border-color: blue;
}
自定义荧光笔标记的颜色:
mark {
background-color: yellow;
padding: 0.1em 0.2em;
}

注意事项与进阶
1. Tiptap基于ProseMirror,因此熟悉ProseMirror的基本概念(如schema、state、transaction)有助于进行高级定制。
2. 官方提供了大量扩展,如列表、表格、代码块、图片等,可以通过npm安装使用。
3. 对于协作编辑,可以考虑@tiptap/extension-collaboration扩展。
4. 编辑器实例的生命周期管理很重要,在组件销毁时(如单页应用中)调用editor.destroy()以避免内存泄漏。

通过以上步骤,你已经创建了一个具备基本功能和自定义扩展的Tiptap富文本编辑器。你可以在此基础上继续添加更多扩展和UI组件,以满足具体的项目需求。Tiptap的模块化设计使得它既适合快速搭建简单编辑器,也适合构建复杂的文档编辑应用。

原创文章,作者:admin,如若转载,请注明出处:https://wpext.cn/874.html

(0)
adminadmin
上一篇 2026年1月31日 上午12:10
下一篇 2026年1月31日 上午1:19

相关推荐

  • 大模型服务的自动化压力测试与瓶颈定位

    大模型服务的自动化压力测试与瓶颈定位 随着人工智能技术的飞速发展,大模型(Large Language Models, LLMs)已深入各类业务场景,成为驱动创新的核心引擎。然而,…

    blog 2026年2月4日
  • 大模型在保险理赔问答系统中的知识融合

    大模型在保险理赔问答系统中的知识融合 保险理赔作为保险服务的关键环节,直接关系到客户体验与公司声誉。传统的理赔问答系统多依赖于结构化知识库与规则引擎,虽能处理标准场景,但在面对复杂…

    blog 2026年2月4日
  • 大模型生成内容的版权归属法律问题解析

    大模型生成内容的版权归属法律问题解析 随着人工智能技术的快速发展,以大规模预训练语言模型(以下简称“大模型”)为代表的人工智能应用已经能够生成文本、图像、音乐、代码等多种形式的内容…

    blog 2026年2月2日
  • 独立开发者如何设计有效的错误提示

    独立开发者如何设计有效的错误提示 对于独立开发者而言,应用或软件中的错误提示是与用户进行关键沟通的桥梁。一个设计拙劣的错误信息会让用户感到困惑和沮丧,甚至导致他们放弃使用你的产品。…

    blog 2026年1月29日
  • 大模型输出内容的实时人工审核介入机制

    大模型输出内容的实时人工审核介入机制 随着人工智能技术的快速发展,大语言模型在内容生成、对话交互等多个领域得到广泛应用。其输出内容在丰富性、创造性和效率上展现出巨大潜力,但同时也可…

    blog 2026年2月4日
  • 独立开发者如何做情绪管理与自我激励

    独立开发者如何做情绪管理与自我激励 作为独立开发者,你既是项目的架构师、程序员,也是测试员、营销人员甚至客服。这种多重角色意味着你经常需要在高强度工作、不确定性压力以及长期孤独感中…

    blog 2026年2月1日
  • 独立开发者如何做用户分群运营

    独立开发者如何做用户分群运营 对于独立开发者而言,资源有限,时间宝贵,无法像大公司那样进行广撒网式的用户运营。因此,精准的用户分群运营不再是“加分项”,而是“生存与发展”的关键策略…

    blog 2026年2月1日
  • 独立开发者必备的免费API资源合集

    独立开发者必备的免费API资源合集 在独立开发过程中,合理利用免费的API资源可以极大提升开发效率、降低开发成本,并为产品增添丰富功能。以下整理了一系列实用且免费的API资源,涵盖…

    blog 2026年1月28日
  • 独立开发者如何设计有效的CTA按钮

    独立开发者如何设计有效的CTA按钮 对于独立开发者而言,每一个界面元素都至关重要,而行动号召按钮无疑是其中最关键的元素之一。它是用户旅程的转折点,直接关系到下载量、注册数、销售额等…

    blog 2026年2月1日
  • 使用Astro构建内容型独立开发者博客的最佳实践

    使用Astro构建内容型独立开发者博客的最佳实践 随着静态站点生成器的流行,Astro凭借其独特的设计理念在开发者社区中迅速崛起。对于独立开发者而言,构建一个内容型博客不仅是分享知…

    blog 2026年2月2日

发表回复

登录后才能评论