基于 Vue 的Tiptap 富文本編輯器使用指南

目錄

🧰 技術棧

📦 所需依賴

📁 文件結構

🧱 編輯器組件實現(components/Editor.vue)

? 常用操作指令

🧠 小貼士

🧩 Tiptap 擴展功能使用說明(含快捷鍵與命令)

🔹 StarterKit(基礎功能集)

🔹 Link(鏈接)

🔹 Table(表格)

🔹 CodeBlockLowlight(代碼塊 + 語法高亮)

🔹 Placeholder(占位提示)

🔹 Image(圖片上傳)

🔹 自定義 Attachment(附件上傳)

tiptap collaborative 實時協作

網絡實時通信

WebSocket 推薦

WebSocket 后端

多個服務器

顯示光標

離線支持

🔗 推薦鏈接

? 總結


本文是針對零基礎前端開發者撰寫,目的是快速上手并集成一個功能完整的富文本編輯器(Tiptap)到你的 Vue 項目中。


🧰 技術棧

  • Vue 3 + <script setup>

  • Tiptap(基于 ProseMirror)

  • 多種 Tiptap 插件(Extension)支持


📦 所需依賴

npm install @tiptap/vue-3 @tiptap/starter-kit \@tiptap/extension-link \@tiptap/extension-table \@tiptap/extension-table-row \@tiptap/extension-table-cell \@tiptap/extension-table-header \@tiptap/extension-placeholder \@tiptap/extension-code-block-lowlight \@tiptap/extension-image \@tiptap/extension-character-count \lowlight

📁 文件結構

src/
├─ components/
│  └─ Editor.vue    # 編輯器組件
└─ App.vue

🧱 編輯器組件實現(components/Editor.vue)

<template><editor-content :editor="editor" class="editor" />
</template><script setup>
import { onBeforeUnmount } from 'vue'
import { Editor, EditorContent } from '@tiptap/vue-3'import StarterKit from '@tiptap/starter-kit'
import Link from '@tiptap/extension-link'
import Table from '@tiptap/extension-table'
import TableRow from '@tiptap/extension-table-row'
import TableCell from '@tiptap/extension-table-cell'
import TableHeader from '@tiptap/extension-table-header'
import Placeholder from '@tiptap/extension-placeholder'
import CodeBlockLowlight from '@tiptap/extension-code-block-lowlight'
import { lowlight } from 'lowlight/lib/common'
import Image from '@tiptap/extension-image'
import CharacterCount from '@tiptap/extension-character-count'const editor = new Editor({extensions: [StarterKit,Link,Placeholder.configure({ placeholder: '請輸入內容…' }),Table.configure({ resizable: true }),TableRow,TableCell,TableHeader,CodeBlockLowlight.configure({ lowlight }),Image,CharacterCount.configure({ limit: 500 }),],content: '<p>Hello Tiptap!</p>',
})onBeforeUnmount(() => {editor.destroy()
})
</script><style scoped>
.editor {border: 1px solid #ccc;padding: 16px;border-radius: 8px;min-height: 200px;
}
</style>

? 常用操作指令

  • 獲取 HTML 內容:

editor.getHTML()
  • 獲取 JSON 內容:

editor.getJSON()
  • 執行命令示例(如設置為加粗):

editor.commands.toggleBold()

🧠 小貼士

  • 所有 Extension 都可以配置和拓展,官方文檔中提供了詳細 API。

  • 菜單欄需要你自行實現,可以通過組合 editor.commands 來制作按鈕。

  • 可自定義 CSS 樣式,支持暗色模式、響應式布局等。


🧩 Tiptap 擴展功能使用說明(含快捷鍵與命令)

以下內容將詳細列出各個 Tiptap 擴展的使用方式,包括:

  • 如何引入

  • 如何注冊(放進 extensions)

  • 快捷鍵(如有)

  • 使用 editor.commands 如何觸發


🔹 StarterKit(基礎功能集)

  • 引入

import StarterKit from '@tiptap/starter-kit'
  • 注冊

extensions: [ StarterKit ]
  • 快捷鍵(默認):

    • 加粗:Mod-b

    • 斜體:Mod-i

    • 標題:Ctrl-Alt-1~6

    • 列表:Shift-Ctrl-8/9

  • 命令示例

editor.commands.toggleBold()
editor.commands.toggleItalic()
editor.commands.toggleHeading({ level: 2 })
editor.commands.toggleBulletList()

🔹 Link(鏈接)

  • 引入

import Link from '@tiptap/extension-link'
  • 注冊

extensions: [ Link.configure({ openOnClick: true }) ]
  • 快捷鍵:無默認

  • 命令示例

editor.commands.setLink({ href: 'https://example.com' })
editor.commands.unsetLink()

🔹 Table(表格)

  • 引入

import Table from '@tiptap/extension-table'
import TableRow from '@tiptap/extension-table-row'
import TableHeader from '@tiptap/extension-table-header'
import TableCell from '@tiptap/extension-table-cell'
  • 注冊

extensions: [Table.configure({ resizable: true }),TableRow,TableHeader,TableCell,
]
  • 快捷鍵:無默認

  • 命令示例

editor.commands.insertTable({ rows: 3, cols: 3 })
editor.commands.addColumnAfter()
editor.commands.deleteTable()

🔹 CodeBlockLowlight(代碼塊 + 語法高亮)

  • 引入

import CodeBlockLowlight from '@tiptap/extension-code-block-lowlight'
import { lowlight } from 'lowlight/lib/common'
  • 注冊

extensions: [CodeBlockLowlight.configure({ lowlight }),
]
  • 快捷鍵

    • `Ctrl + Shift + ``

  • 命令示例

editor.commands.toggleCodeBlock()

🔹 Placeholder(占位提示)

  • 引入

import Placeholder from '@tiptap/extension-placeholder'
  • 注冊

extensions: [Placeholder.configure({ placeholder: '請輸入內容…' })
]
  • 快捷鍵:無

  • 命令示例:無,主要是展示效果


🔹 Image(圖片上傳)

  • 引入

import Image from '@tiptap/extension-image'
  • 注冊

extensions: [ Image ]
  • 快捷鍵:無

  • 命令示例

editor.commands.setImage({ src: 'https://example.com/image.jpg' })

通常結合 <input type="file"> 使用,將圖片上傳到服務器后獲取鏈接插入。


🔹 自定義 Attachment(附件上傳)

Tiptap 沒有內建“附件”類型,可自定義擴展:

  • 引入(自定義 Node):

async handleFileUpload(e) {const file = e.target.files[0];if (!file) return;try {// 1. 上傳文件到服務器(假設 uploadImage 支持所有類型或調整為通用上傳函數)const url = await this.uploadImage(file);// 2. 根據文件類型插入內容if (file.type.startsWith('image/')) {// 插入圖片this.editor.chain().focus().setImage({ src: url }).run();} else {// 非圖片類型插入“附件”文本(可帶鏈接)this.editor.chain().focus().insertContent('附件').run();// 如需插入鏈接:this.editor.chain().focus().insertContent(`<a href="${url}">附件</a>`).run();}} catch (error) {console.error("上傳失敗:", error);alert("上傳失敗,請重試");} finally {e.target.value = null;}
}
    • 快捷鍵:無

    • 命令示例

    editor.commands.insertContent({type: 'attachment',attrs: {href: 'https://example.com/file.pdf',filename: '報告文件.pdf',},
    })

    上傳方式與圖片類似,使用 file input 或拖拽上傳后插入鏈接。


    tiptap collaborative 實時協作

    tiptap?支持實時協作、讓不同設備之間的同步和離線工作。通過與?Y.js?配合使用無需多少代碼即可實現多人在線實時協作,不過在大部分的實踐工作中,實時協作并不是一個強需求。

    網絡實時通信

    WebRTC僅使用服務器讓各個客戶端(瀏覽器)擊行相互通訊。服務器并不參與數據的傳輸。
    安裝依賴項:

    npm install @tiptap/extension-collaboration yjs y-webrtc y-prosemirror

    然后創建一個 Y 文檔,并注冊到 Tiptap:

    import { WebrtcProvider } from 'y-webrtc'// A new Y document
    const ydoc = new Y.Doc()
    // Registered with a WebRTC provider
    const provider = new WebrtcProvider('example-document', ydoc)const editor = new Editor({extensions: [StarterKit.configure({// The Collaboration extension comes with its own history handlinghistory: false,}),// Register the document with TiptapCollaboration.configure({document: ydoc,}),],
    })

    到此為止你就可以讓不同的用戶進行實時協作了,它是如何運行的呢?WebRTC程序通過公共服務器將客戶端連接在一起,服務器并不同步實際的更改,然而這個也有兩個缺點。
    1,瀏覽器拒絕連接太多客戶端,對于同一文檔中超過 100+ 個并發客戶端,它不能很好的支持。
    2,服務器沒有參與文檔記錄的更改,因為WebRTC信令服務器不會收到更改,因此不知道文檔中的內容。
    如果你想更深入地研究,請前往GitHub上的Y WebRTC存儲庫

    WebSocket 推薦

    對于大多數情況,tiptap建議使用 WebSocket ,因為它更靈活,也可以很好地擴展。為了更容易使用,tiptap發布了Hocuspocus作為Tiptap的官方后端程序。

    對于客戶端示例幾乎相同,只不過驅動程序不同。首先,讓我們安裝依賴項:

    npm install @tiptap/extension-collaboration @hocuspocus/provider y-prosemirror

    然后向 Tiptap 注冊 WebSocket 供應程序:

    import { Editor } from '@tiptap/core'
    import StarterKit from '@tiptap/starter-kit'
    import Collaboration from '@tiptap/extension-collaboration'
    import { HocuspocusProvider } from '@hocuspocus/provider'// Set up the Hocuspocus WebSocket provider
    const provider = new HocuspocusProvider({url: 'ws://127.0.0.1:1234',name: 'example-document',
    })const editor = new Editor({extensions: [StarterKit.configure({// The Collaboration extension comes with its own history handlinghistory: false,}),// Register the document with TiptapCollaboration.configure({document: provider.document,}),],
    })

    如你所見此示例不是開箱即用的。它需要配置為與WebSocket服務器通信,因此需要安裝WebSocket 后端程序Hocuspocus。

    WebSocket 后端

    為了使服務器部分盡可能簡單,tiptap提供了一個node.js的服務器包 Hocuspocus。它是一個靈活的 Node.js 包,可用于構建后端。
    下面的命令用來啟動這個服務:

    npx @hocuspocus/cli --port 1234 --sqlite

    運行 Hocuspocus 命令行,啟動偵聽1234端口并將更改存儲在內存中(一旦停止命令,它就會消失),輸出如下所示:

    Hocuspocus v1.0.0 running at:> HTTP: http://127.0.0.1:1234
    > WebSocket: ws://127.0.0.1:1234Ready.

    嘗試在瀏覽器中打開 http://127.0.0.1:1234 網址,如果一切運行正常,你應該會看到一個純文本。
    然后返回 Tiptap 編輯器并F5刷新網頁,它將連接到 Hocuspocus WebSocket 服務器,這時就可以與其他用戶進行實時協作了。

    多個服務器

    你可以注冊多個服務器保證服務的穩定,當一個服務器宕機客戶端將連接另外一個服務器

    new WebrtcProvider('example-document', ydoc)
    new HocuspocusProvider({url: 'ws://127.0.0.1:1234',name: 'example-document',document: ydoc,
    })

    顯示光標

    當多個人進行在線編輯,你可以設置每個人的昵稱顯示在編輯器光標位置

    import { Editor } from '@tiptap/core'
    import StarterKit from '@tiptap/starter-kit'
    import Collaboration from '@tiptap/extension-collaboration'
    import CollaborationCursor from '@tiptap/extension-collaboration-cursor'
    import { HocuspocusProvider } from '@hocuspocus/provider'// Set up the Hocuspocus WebSocket provider
    const provider = new HocuspocusProvider({url: 'ws://127.0.0.1:1234',name: 'example-document',
    })const editor = new Editor({extensions: [StarterKit.configure({// The Collaboration extension comes with its own history handlinghistory: false,}),Collaboration.configure({document: provider.document,}),// Register the collaboration cursor extensionCollaborationCursor.configure({provider: provider,user: {name: 'Cyndi Lauper',color: '#f783ac',},}),],
    })

    離線支持

    基于Y IndexedDB 你可以實現關閉瀏覽器后所有更改都將存儲在瀏覽器中,下次聯機時,WebSocket 提供程序將嘗試查找連接并最終同步更改。

    如需添加更多擴展(如任務列表、縮進、emoji 等),可以繼續在此格式基礎上擴展。

    🔗 推薦鏈接

    • tiptap 自定義擴展 | 摳丁客
    • 官方網站:Tiptap - Dev Toolkit Editor Suite

    • GitHub:https://github.com/ueberdosis/tiptap

    • ProseMirror 引擎:ProseMirror

    ? 總結

    本文總結了一個基于 Vue3 + Tiptap 的富文本編輯器完整實現過程,涵蓋依賴安裝、擴展配置、編輯器初始化與常用操作,適合新手開發者快速上手。如果你希望快速搭建一個功能完整的編輯器,完全可以直接復制本文結構并根據需求調整內容。

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/pingmian/77805.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77805.shtml
    英文地址,請注明出處:http://en.pswp.cn/pingmian/77805.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    統計圖表ECharts

    統計某個時間段&#xff0c;觀看人數 ①、數據表 ②、業務代碼 RestController RequstMapping(value"/admin/vod/videoVisitor") CrossOrigin public class VideoVisitorController{Autowriedprivate VideoVisitorService videoVisitorService;//課程統計的接口…

    ubuntu 安裝 redis server

    ubuntu 安裝 redis server sudo apt update sudo apt install redis-server The following NEW packages will be installed:libhiredis0.14 libjemalloc2 liblua5.1-0 lua-bitop lua-cjson redis-server redis-toolssudo systemctl start redis-server sudo systemctl ena…

    【白雪講堂】[特殊字符]內容戰略地圖|GEO優化框架下的內容全景布局

    &#x1f4cd;內容戰略地圖&#xff5c;GEO優化框架下的內容全景布局 1?? 頂層目標&#xff1a;GEO優化戰略 目標關鍵詞&#xff1a; 被AI理解&#xff08;AEO&#xff09; 被AI優先推薦&#xff08;GEO&#xff09; 在關鍵場景中被AI復讀引用 2?? 三大引擎邏輯&#x…

    NVIDIA 自動駕駛技術見解

    前言 參與 NVIDIA自動駕駛開發者實驗室 活動&#xff0c;以及解讀了 NVIDIA 安全報告 自動駕駛 白皮書&#xff0c;本文是我的一些思考和見解。自動駕駛技術的目標是為了改善道理安全、減少交通堵塞&#xff0c;重塑更安全、高效、包容的交通生態。在這一領域&#xff0c;NVI…

    OpenCV day6

    函數內容接上文&#xff1a;OpenCV day4-CSDN博客 , OpenCV day5-CSDN博客 目錄 平滑&#xff08;模糊&#xff09; 25.cv2.blur()&#xff1a; 26.cv2.boxFilter(): 27.cv2.GaussianBlur()&#xff1a; 28.cv2.medianBlur(): 29.cv2.bilateralFilter()&#xff1a; 銳…

    Function calling, 模態上下文協議(MCP),多步能力協議(MCP) 和 A2A的區別

    背景闡述 本文大部分內容都是基于openAI 的 chatGPT自動生成。作者進行了一些細微的調整。 LLM 帶來了很多思維的活躍&#xff0c;基于LLM&#xff0c;產生了很多應用&#xff0c;很多應用也激活了LLM的新的功能。 Function calling&#xff0c;MCP&#xff08;Modal Contex…

    火山RTC 5 轉推CDN 布局合成規則

    實時音視頻房間&#xff0c;轉推CDN&#xff0c;文檔&#xff1a; 轉推直播--實時音視頻-火山引擎 一、轉推CDN 0、前提 * 在調用該接口前&#xff0c;你需要在[控制臺](https://console.volcengine.com/rtc/workplaceRTC)開啟轉推直播功能。<br> * 調…

    力扣面試150題--插入區間和用最少數量的箭引爆氣球

    Day 28 題目描述 思路 初次思路&#xff1a;借鑒一下昨天題解的思路&#xff0c;將插入的區間與區間數組作比較&#xff0c;插入到升序的數組中&#xff0c;其他的和&#xff08;合并區間&#xff09;做法一樣。 注意需要特殊處理一下情況&#xff0c;插入區間比數組中最后一…

    【Java面試筆記:基礎】4.強引用、軟引用、弱引用、幻象引用有什么區別?

    1. 引用類型及其特點 強引用(Strong Reference): 定義:最常見的引用類型,通過new關鍵字直接創建。回收條件:只要強引用存在,對象不會被GC回收。示例:Object obj = new Object(); // 強引用特點: 強引用是導致內存泄漏的常見原因(如未及時置為null)。手動斷開引用:…

    ycsb性能測試的優缺點

    YCSB&#xff08;Yahoo Cloud Serving Benchmark&#xff09;是一個開源的性能測試框架&#xff0c;用于評估分布式系統的讀寫性能。它具有以下優點和缺點&#xff1a; 優點&#xff1a; 簡單易用&#xff1a;YCSB提供了簡單的API和配置文件&#xff0c;使得性能測試非常容易…

    基于SpringBoot的校園賽事直播管理系統-項目分享

    基于SpringBoot的校園賽事直播管理系統-項目分享 項目介紹項目摘要管理員功能圖用戶功能圖項目預覽首頁總覽個人中心禮物管理主播管理 最后 項目介紹 使用者&#xff1a;管理員、用戶 開發技術&#xff1a;MySQLJavaSpringBootVue 項目摘要 隨著互聯網和移動技術的持續進步&…

    Nginx?中間件的解析

    目錄 一、Nginx的核心架構解析 二、Nginx的典型應用場景 三、Nginx的配置優化實踐 四、Nginx的常見缺陷與漏洞 一、Nginx的核心架構解析 ??事件驅動與非阻塞IO模型?? Nginx采用基于epoll/kq等系統調用的事件驅動機制&#xff0c;通過異步非阻塞方式處理請求&#xff0c;…

    杭州小紅書代運營公司-品融電商:全域增長策略的實踐者

    杭州小紅書代運營公司-品融電商&#xff1a;全域增長策略的實踐者 在品牌競爭日趨激烈的電商領域&#xff0c;杭州品融電商作為一家專注于品牌化全域運營的服務商&#xff0c;憑借其“效品合一”方法論與行業領先的小紅書代運營能力&#xff0c;已成為眾多品牌實現市場突圍的重…

    【映客直播-注冊/登錄安全分析報告】

    前言 由于網站注冊入口容易被黑客攻擊&#xff0c;存在如下安全問題&#xff1a; 暴力破解密碼&#xff0c;造成用戶信息泄露短信盜刷的安全問題&#xff0c;影響業務及導致用戶投訴帶來經濟損失&#xff0c;尤其是后付費客戶&#xff0c;風險巨大&#xff0c;造成虧損無底洞…

    Android audio_policy_configuration.xml加載流程

    目錄 一、audio_policy_configuration.xml文件被加載流程 1、AudioPolicyService 創建階段 2、createAudioPolicyManager 實現 3、AudioPolicyManager 構造 4、配置文件解析 loadConfig 5、核心解析邏輯 PolicySerializer::deserialize 二、AudioPolicyConfig類解析 1、…

    使用 Docker 安裝 Elastic Stack 并重置本地密碼

    Elastic Stack&#xff08;也被稱為 ELK Stack&#xff09;是一個非常強大的工具套件&#xff0c;用于實時搜索、分析和可視化大量數據。Elastic Stack 包括 Elasticsearch、Logstash、Kibana 等組件。本文將展示如何使用 Docker 安裝 Elasticsearch 并重置本地用戶密碼。 ###…

    Unitest和pytest使用方法

    unittest 是 Python 自帶的單元測試框架&#xff0c;用于編寫和運行可重復的測試用例。它的核心思想是通過斷言&#xff08;assertions&#xff09;驗證代碼的行為是否符合預期。以下是 unittest 的基本使用方法&#xff1a; 1. 基本結構 1.1 創建測試類 繼承 unittest.TestC…

    git 版本提交規范

    Git 提交規范&#xff08;Git Commit Message Convention&#xff09;是為了讓項目的提交歷史更加清晰、可讀、便于追蹤和自動化工具解析。常見的規范之一是 Conventional Commits&#xff0c;下面是一個推薦的格式規范&#xff1a; &#x1f31f; 提交信息格式&#xff08;Con…

    stat判斷路徑

    int stat(const char *pathname, struct stat *buf); pathname&#xff1a;用于指定一個需要查看屬性的文件路徑。 buf&#xff1a;struct stat 類型指針&#xff0c;用于指向一個 struct stat 結構體變量。調用 stat 函數的時候需要傳入一個 struct stat 變量的指針&#xff0…

    學習Docker遇到的問題

    目錄 1、拉取hello-world鏡像報錯 1. 檢查網絡連接 排查: 2. 配置 Docker 鏡像加速器(推薦) 具體解決步驟: 1.在服務器上創建并修改配置文件,添加Docker鏡像加速器地址: 2. 重啟Docker 3. 拉取hello-world鏡像 2、刪除鏡像出現異常 3、 容器內部不能運行ping命令 …