Vue3 富文本编辑器选型与实战:一文搞定所有场景需求

0 阅读7分钟

Vue3 富文本编辑器实战指南:选型与深度使用

引言

富文本编辑器是内容管理系统(CMS)、博客平台、在线协作工具等场景的核心组件。在 Vue3 生态中,选择一款合适的富文本编辑器对项目开发效率有着重要影响。本文基于多个实战项目的经验总结,系统介绍 Vue3 环境下主流富文本编辑器的特点、选型建议及集成方法,帮助开发者快速定位适合自己项目的解决方案。

一、富文本编辑器基础认知

1.1 编辑器技术演进

第一代:TextArea 时代 第二代:ContentEditable 时代 第三代:Framework 时代

1.2 技术分类对比

类型代表产品特点适用场景
传统富文本编辑器TinyMCE、CKEditor功能全面,开箱即用企业级应用
框架型编辑器Tiptap、ProseMirror高度可定制,API 丰富定制化需求
轻量级编辑器VueQuill、wangEditor体积小,易集成中小型项目
协作编辑SugarCE、Liveblocks实时多人编辑在线协作

二、主流编辑器深度解析

2.1 TinyMCE Vue(建议首选)

GitHub: github.com/tinymce/tin… | Stars: ⭐ 16.2k

TinyMCE 是老牌全功能富文本编辑器,Vue3 适配版成熟稳定,是中大型项目和企业级场景的首选。

核心特点
  • 功能全覆盖:富文本编辑、表格、图片/视频上传、代码块、拼写检查、批注等企业级功能
  • 完善的 Vue3 组件封装,支持 Vite 和 TypeScript
  • 可高度自定义工具栏、皮肤、快捷键
  • 多语言支持,内置 i18n 国际化方案
  • 免费版有功能限制,商业版需授权(开源项目可申请免费授权)
快速安装
npm install @tinymce/tinymce-vue@^5 tinymce
基础使用
<template>
  <div class="editor-container">
    <Editor
      v-model="content"
      :init="{
        height: 500,
        menubar: false,
        plugins: [
          'advlist', 'autolink', 'lists', 'link', 'image',
          'charmap', 'preview', 'searchreplace', 'visualblocks',
          'code', 'fullscreen', 'insertdatetime', 'table', 'wordcount'
        ],
        toolbar:
          'undo redo | blocks | ' +
          'bold italic forecolor | alignleft aligncenter ' +
          'alignright alignjustify | bullist numlist outdent indent | ' +
          'removeformat | code | image | table',
        branding: false,
        language: 'zh_CN'
      }"
    />
  </div>
</template>

<script setup>
import { ref } from 'vue'
import Editor from '@tinymce/tinymce-vue'

const content = ref('')
</script>
进阶配置:自定义图片上传
const initConfig = {
  images_upload_handler: async (blobInfo, success, failure) => {
    const formData = new FormData()
    formData.append('file', blobInfo.blob(), blobInfo.filename())

    try {
      const response = await fetch('/api/upload', {
        method: 'POST',
        body: formData
      })
      const result = await response.json()
      success(result.url)
    } catch (error) {
      failure('图片上传失败')
    }
  }
}

2.2 Tiptap(最值得关注)

GitHub: github.com/ueberdosis/… | Stars: ⭐ 36.3k

Tiptap 是基于 ProseMirror 的无头富文本编辑器框架,以其模块化架构和强大的扩展性著称,是当前最活跃的编辑器框架之一。

核心特点
  • Headless 架构:不绑定任何 UI,可完全自定义编辑体验
  • 基于 ProseMirror:继承 ProseMirror 的稳定架构和丰富 API
  • Vue3 原生支持:提供 @tiptap/vue-3 官方包
  • 扩展丰富:内置大量官方扩展,支持自定义扩展开发
  • 实时协作友好:基于 Y.js 的协作编辑方案成熟
安装使用
npm install @tiptap/vue-3 @tiptap/starter-kit @tiptap/extension-image @tiptap/extension-table
<template>
  <div class="editor-wrapper">
    <MenuBar v-if="editor" :editor="editor" />
    <EditorContent :editor="editor" class="editor-content" />
  </div>
</template>

<script setup>
import { useEditor, EditorContent, MenuBar } from '@tiptap/vue-3'
import StarterKit from '@tiptap/starter-kit'
import Image from '@tiptap/extension-image'
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'

const editor = useEditor({
  extensions: [
    StarterKit,
    Image.configure({ inline: true }),
    Table.configure({ resizable: true }),
    TableRow,
    TableCell,
    TableHeader,
  ],
  content: '<p>开始编辑...</p>',
})

onBeforeUnmount(() => editor.value?.destroy())
</script>

<style>
.editor-content {
  border: 1px solid #d1d5db;
  border-radius: 8px;
  padding: 16px;
  min-height: 400px;
}

.editor-content .ProseMirror {
  outline: none;
  min-height: 380px;
}
</style>
Tiptap UI Kit(推荐模板)

GitHub: github.com/benngaihk/T… | Stars: 持续更新

一个生产级 Tiptap Vue 3 模板,提供 5 种主题(Notion、Word、GitHub)、AI 写作辅助、实时协作等功能,开箱即用。

git clone https://github.com/benngaihk/Tiptap-UI-Kit.git
cd Tiptap-UI-Kit
npm install
npm run dev

2.3 wangEditor(国内首选)

GitHub: github.com/wangeditor-… | Stars: ⭐ 18.3k

wangEditor 是国产开源富文本编辑器的中坚力量,提供开箱即用、配置简单的使用体验,文档完善,中文社区活跃。

核心特点
  • 轻量级:体积小,加载迅速
  • 中文文档完善:官方文档配有完整中文指南
  • 适配国内场景:内置图片上传、视频上传等常用功能
  • 支持 Vue、React、jQuery:框架无关设计
  • 持续维护:社区活跃,版本迭代稳定
Vue3 集成
npm install @wangeditor/editor @wangeditor/editor-for-vue
<template>
  <div class="editor-container">
    <div style="border-bottom: 1px solid #ccc; margin-bottom: 10px;">
      <Toolbar
        :editor="editorRef"
        :defaultConfig="toolbarConfig"
        :mode="mode"
      />
    </div>
    <Editor
      v-model="valueHtml"
      :defaultConfig="editorConfig"
      :mode="mode"
      @onChange="handleChange"
      @onCreated="handleCreated"
    />
  </div>
</template>

<script setup>
import { ref, shallowRef, onBeforeUnmount } from 'vue'
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'

const editorRef = shallowRef()
const valueHtml = ref('<p>Hello World!</p>')
const mode = ref('default')

const toolbarConfig = {}
const editorConfig = {
  placeholder: '请输入内容...',
  MENU_CONF: {
    uploadImage: {
      server: '/api/upload',
      fieldName: 'file',
    }
  }
}

const handleCreated = (editor) => {
  editorRef.value = editor
}

const handleChange = (editor) => {
  console.log('content:', editor.getHtml())
}

onBeforeUnmount(() => {
  editorRef.value?.destroy()
})
</script>

<style>
@import '@wangeditor/editor/dist/css/style.css';
</style>

2.4 VueQuill(轻量之选)

GitHub: github.com/vueup/vue-q… | Stars: ⭐ 1.3k

VueQuill 是 Quill 编辑器的 Vue 3 封装,保持了 Quill 的轻量特性,适合对编辑器要求不高的中小型项目。

核心特点
  • 基于 Quill:继承 Quill 的稳定性和丰富功能
  • Vue 3 原生组件:完整的 TypeScript 支持
  • 体积小:适合轻量级需求
  • 主题丰富:可自定义工具栏样式
安装使用
npm install @vueup/vue-quill
<template>
  <div class="quill-editor">
    <QuillEditor
      v-model:content="content"
      contentType="html"
      theme="snow"
      toolbar="full"
      :toolbar-options="{
        header: [1, 2, false],
        list: 'ordered',
        bullet: 'ordered',
        bold: true,
        italic: true,
        underline: true,
        strike: true,
        'code-block': true,
        link: true,
        image: true,
      }"
    />
  </div>
</template>

<script setup>
import { ref } from 'vue'
import { QuillEditor } from '@vueup/vue-quill'
import '@vueup/vue-quill/dist/vue-quill.snow.css'

const content = ref('<p>Hello Quill!</p>')
</script>

2.5 CKEditor 5(高定制需求)

GitHub: github.com/ckeditor/ck… | Stars: ⭐ 10.4k

CKEditor 5 是模块化设计的富文本编辑框架,提供完全开源的构建版本,适合对编辑功能有个性化需求的开发者。

核心特点
  • 完全开源:无功能限制,可商用
  • 模块化架构:按需引入,体积可控
  • 高度可定制:支持自定义插件开发
  • 协作编辑:内置 Real-time collaboration 扩展
  • 多语言:内置 50+ 种语言包
Vue3 集成
npm install @ckeditor/ckeditor5-vue @ckeditor/ckeditor5-build-classic
<template>
  <div class="ckeditor-wrapper">
    <ckeditor :editor="editor" v-model="content" :config="editorConfig" />
  </div>
</template>

<script setup>
import { ref } from 'vue'
import ClassicEditor from '@ckeditor/ckeditor5-build-classic'
import CKEditor from '@ckeditor/ckeditor5-vue'

const content = ref('')
const editor = ClassicEditor
const editorConfig = {
  language: 'zh-cn',
  toolbar: [
    'heading', '|', 'bold', 'italic', 'link', 'bulletedList',
    'numberedList', '|', 'insertTable', '|', 'undo', 'redo'
  ],
  table: {
    contentToolbar: ['tableColumn', 'tableRow', 'mergeTableCells']
  }
}
</script>

2.6 Milkdown(Markdown友好)

Milkdown 是另一个基于 ProseMirror 的无头编辑器,以其对 Markdown 的原生支持和极简设计著称。

GitHub: github.com/SNKK65/milk… | Stars: 活跃维护

核心特点
  • Markdown First:原生支持 Markdown 语法
  • 插件化架构:核心精简,扩展能力强
  • Vue3 支持:提供官方 Vue 集成包
  • SSR 兼容:支持服务端渲染

三、编辑器选型指南

选型决策矩阵

需求场景推荐选择理由
企业级 / 全功能需求TinyMCE功能最全,生态成熟,商业支持完善
轻量 / 中小型项目VueQuill / wangEditor体积小、易集成、中文友好
开源项目 / 无授权限制CKEditor 5完全开源,定制性强
国内场景 / 快速接入wangEditor中文文档,适配国内上传场景
高定制化 / 协作编辑Tiptap模块化架构,扩展性强,36k+ stars 社区活跃
Markdown 优先Milkdown原生 Markdown 支持

项目规模选型建议

小型项目(< 3个月周期) 推荐选择 wangEditor 或 VueQuill,开箱即用,学习成本低,能够快速完成集成。

中型项目(3-6个月周期) 推荐选择 Tiptap,虽然学习曲线较陡,但扩展性强,能够应对需求变化。

大型/企业项目(> 6个月周期) 推荐选择 TinyMCE,企业级支持完善,功能稳定,适合长期维护。

协作编辑场景 推荐选择 Tiptap + Y.js 方案,或 CKEditor 5 的协作套件。

四、实战注意事项

4.1 图片与文件上传

所有编辑器都支持自定义上传逻辑,建议统一封装上传接口:

// 统一上传封装
export const uploadFile = async (file, config = {}) => {
  const formData = new FormData()
  formData.append(config.fieldName || 'file', file)

  const response = await fetch(config.server || '/api/upload', {
    method: 'POST',
    body: formData,
    headers: config.headers || {}
  })

  if (!response.ok) throw new Error('Upload failed')
  return response.json()
}

注意事项

  • 避免直接使用默认的 base64 存储,体积过大会影响性能
  • 生产环境建议使用 OSS/COS 等对象存储服务
  • 添加上传进度回调,提升用户体验

4.2 内存泄漏防范

在 Vue3 中,组件卸载时必须销毁编辑器实例:

import { onBeforeUnmount } from 'vue'

// 方案一:使用 onBeforeUnmount
onBeforeUnmount(() => {
  editor.value?.destroy()
})

// 方案二:使用 v-if 条件渲染
// <Editor v-if="showEditor" />

4.3 样式适配

  • 部分编辑器需手动引入样式文件(如 wangEditor 需要导入 CSS)
  • 注意与项目主题的兼容性,特别是深色模式支持
  • 使用 CSS 变量统一主题配置

4.4 性能优化

  • 懒加载编辑器组件:大型内容编辑场景可考虑按需加载
  • SSR 注意事项:确保编辑器组件在客户端 hydrate 后再渲染
  • 内容序列化:大型内容建议使用增量保存策略

五、总结

Vue3 生态下的富文本编辑器选择丰富,不同编辑器适配不同场景:

  1. TinyMCE 适合企业级全功能需求
  2. Tiptap 以 36.3k stars 成为最活跃的框架型编辑器,适合高定制化场景
  3. wangEditor 18.3k stars 的国产之光,中文友好
  4. VueQuill 轻量级选择,集成简单
  5. CKEditor 5 完全开源,商用无忧
  6. Milkdown Markdown 爱好者的首选