使用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

相关推荐

  • 使用PlanetScale构建全球分布式数据库

    使用PlanetScale构建全球分布式数据库 在当前数字化时代,应用程序的全球化需求日益增长,用户遍布世界各地。为了提供快速可靠的服务,低延迟的数据访问变得至关重要。传统的单一数…

    blog 2026年2月1日
  • 大模型服务的绿色计算与能耗优化措施

    大模型服务的绿色计算与能耗优化措施 随着人工智能技术的飞速发展,大规模预训练模型(大模型)在自然语言处理、计算机视觉等领域展现出强大能力,其应用日益广泛。然而,大模型的训练与推理过…

    blog 2026年2月4日
  • 一人团队如何做用户流失分析

    一人团队如何高效进行用户流失分析 在资源有限的一人团队中,用户流失分析往往是一项艰巨但至关重要的任务。面对海量数据与有限的精力,你需要一套高效、聚焦的方法来洞察用户离开的原因,并采…

    blog 2026年1月31日
  • 独立开发者如何选择合适的编程语言

    独立开发者如何选择合适的编程语言 对于独立开发者而言,选择编程语言是项目启动初期最关键的决定之一。它直接影响到开发效率、项目成本、后期维护以及最终产品的成功。面对琳琅满目的语言选项…

    blog 2026年1月29日
  • 独立开发者如何用Gumroad销售数字产品

    独立开发者如何利用Gumroad销售数字产品 对于独立开发者而言,创建出色的数字产品只是第一步,如何高效地将其销售出去并实现盈利是更大的挑战。在众多的销售平台中,Gumroad以其…

    blog 2026年1月29日
  • 使用Tinybird实时分析用户行为数据

    在当今以数据为驱动的产品迭代周期中,能够实时理解用户行为是保持竞争力的关键。传统的批处理分析通常存在数小时甚至数天的延迟,导致团队无法对正在发生的用户趋势、故障或转化瓶颈做出即时反…

    blog 2026年2月1日
  • 独立开发者如何平衡主业与副业开发

    独立开发者如何平衡主业与副业开发 对于许多独立开发者而言,主业提供稳定的经济基础和职业轨道,而副业开发则是激情、创造力探索乃至未来潜在事业的试验田。平衡两者并非易事,但通过有意识的…

    blog 2026年1月28日
  • 零预算推广:独立开发者的冷启动策略

    零预算推广:独立开发者的冷启动策略 对于独立开发者而言,产品发布后的冷启动阶段往往伴随着一个核心挑战:资金有限,甚至推广预算为零。没有足够的资金进行大规模营销,并不意味着产品注定默…

    blog 2026年1月28日
  • 独立开发者如何做价格敏感度测试

    独立开发者如何做价格敏感度测试 对于独立开发者而言,定价是一个至关重要的决策,它直接影响产品的市场接受度、收入以及项目的可持续性。价格定得太高可能吓跑潜在用户,定得太低则可能无法体…

    blog 2026年1月31日
  • 从0到盈利:独立开发者财务模型模板

    从0到盈利:独立开发者财务模型模板 对于独立开发者而言,将一个创意转化为可持续盈利的产品,不仅需要出色的技术能力和产品思维,更需要清晰的财务规划。许多项目失败并非因为想法或技术不足…

    blog 2026年2月1日

发表回复

登录后才能评论