vue+ts+TinyEditor 是基于 Quill 2.0 开发的富文本编辑器,提供丰富的扩展功能,适用于现代 Web 开发的完整安装使用教程

简介

TinyEditor 是基于 Quill 2.0 开发的富文本编辑器,提供丰富的扩展功能,适用于现代 Web 开发。具备模块化设计、轻量级架构和高度可定制化特性,支持多种插件扩展,满足不同场景需求。

核心特性
  • 基于 Quill 2.0 的现代化架构
  • 模块化设计,支持按需加载
  • 提供多种扩展功能(表格、代码高亮、Markdown 支持等)
  • 跨平台兼容性(Web、移动端适配)
  • 支持实时协作编辑

1.安装依赖

复制代码
npm i @opentiny/fluent-editor

npm i dompurify

npm i html2canvas

npm i katex

npm install quill-toolbar-tip

npm install quill-table-up

2.在项目根目录创建 `types/global.d.ts` 类型声明文件

复制代码
//types/global.d.ts
import type Hljs from 'highlight.js'
import type Katex from 'katex'
import type Html2Canvas from 'html2canvas'

//创建类型声明文件,用于声明全局变量的类型
declare global {
    interface Window {
        hljs: typeof Hljs
        katex: typeof Katex
        Html2Canvas: typeof Html2Canvas
    }
}

3.更新 tsconfig.json,确保包含类型声明路径

复制代码
{
  "files": [],
  "references": [
    { "path": "./tsconfig.app.json" },
    { "path": "./tsconfig.node.json" }
  ],
  "compilerOptions": {
    "typeRoots": ["./node_modules/@types", "./types"]
  }
}

4.完整代码

复制代码
<script setup lang="ts">
import { onMounted, ref } from 'vue'
import type FluentEditor from '@opentiny/fluent-editor'
import hljs from 'highlight.js'
import Html2Canvas from 'html2canvas'
import katex from 'katex'
import 'highlight.js/styles/atom-one-dark.css'
import 'katex/dist/katex.min.css'

// 安全类型断言挂载
if (import.meta) { // Vite 环境判断
  (window as unknown as { hljs: typeof hljs }).hljs = hljs
  window.katex = katex as unknown as typeof window.katex
  // @ts-ignore
  window.Html2Canvas = Html2Canvas as typeof window.Html2Canvas
}

const editor = ref<FluentEditor>()
const articleRef = ref<HTMLElement>()

interface MentionItem {
  name: string
  age: number
  cn: string
}

const searchKey = 'name'
const mentionList: MentionItem[] = [
  { name: 'Jack', age: 26, cn: 'Jack 杰克' },
  { name: 'Lucy', age: 22, cn: 'Lucy 露西' },
]

const TOOLBAR_CONFIG = [
  ['undo', 'redo', 'clean', 'format-painter'],
  [
    { header: [1, 2, 3, 4, 5, 6, false] },
    { font: [] },
    { size: ['12px', '14px', '16px', '18px', '20px', '24px', '32px', '36px', '48px', '72px'] }
  ],
  ['bold', 'italic', 'strike', 'underline'],
  [{ color: [] }, { background: [] }],
  [{ align: [] }, { list: 'ordered' }, { list: 'bullet' }, { list: 'check' }],
  [{ script: 'sub' }, { script: 'super' }],
  [{ indent: '-1' }, { indent: '+1' }],
  [{ direction: 'rtl' }],
  ['link', 'blockquote', 'code', 'code-block'],
  ['image', 'file'],
  ['emoji', 'video', 'formula', 'screenshot'],
]

const updateHTML = (html: string) => {
  if (articleRef.value) {
    articleRef.value.innerHTML = html
  }
}

onMounted(async () => {
  // 动态导入客户端专用库
  const module = await import('@opentiny/fluent-editor')
  const FluentEditor = module.default

  editor.value = new FluentEditor('#editor-get-content-html', {
    theme: 'snow',
    modules: {
      toolbar: TOOLBAR_CONFIG,
      syntax: { hljs },
      'emoji-toolbar': true,
      file: true,
      mention: {
        itemKey: 'cn',
        searchKey,
        search: (term: string) => {
          return mentionList.filter(item =>
              String(item[searchKey as keyof MentionItem]).includes(term)
          )
        }
      }
    }
  })

  updateHTML(editor.value.root.innerHTML)
  editor.value.on('text-change', () => {
    updateHTML(editor.value?.root.innerHTML || '')
  })
})


</script>

<template>
  <div id="editor-get-content-html">
    <p>Hello <strong>TinyEditor</strong>!</p>
  </div>
  <br>
  预览效果:
  <div
      ref="articleRef"
      class="article ql-editor"
  />
</template>
运行效果
5.国际化

将使用语言通过 options 传入,目前支持语言 zh-CNen-US,默认使用 en-US

Welcome to commit PR for more language support.

可通过函数 changeLanguage({ lang, langText }) 修改当前语言

复制代码
import type { I18N } from '@opentiny/fluent-editor'

 在modules使用
 modules: {
      ...
      i18n: {
        lang: 'zh-CN',
      },
    }

动态变更:

复制代码
function switchLanguage() {
  // 'zh-CN'  'en-US' 
  (editor.getModule('i18n') as I18N).changeLanguage({ lang: 'zh-CN' })
}
总结

TinyEditor 结合 Quill 2.0 的稳定性和扩展性,为开发者提供高效的富文本解决方案。通过灵活的配置和模块化设计,可快速适配不同业务场景。

相关推荐
怀旧,20 分钟前
【Python】3.函数与列表
java·前端·python
唐人街都是苦瓜脸1 小时前
uni-app 提供的页面跳转方法详细解释及其区别
前端·uni-app
咔咔库奇1 小时前
性能优化深度实践:突破vue应用性能
前端·vue.js·性能优化
Bingo_BIG2 小时前
甘特图 dhtmlxGantt.js UA实例
javascript·甘特图·ua
stubborn丶lili2 小时前
Vite打包优化实践:从分包到性能提升
vue.js
编程乐学(Arfan开发工程师)2 小时前
28、请求处理-【源码分析】-请求映射原理
java·前端·spring boot·后端·spring
咔咔库奇2 小时前
前端开源JavaScrip库
前端·开源
_r0bin_3 小时前
前端面试准备2
前端·html
白皎3 小时前
立志成为一名优秀测试开发工程师(第九天)——使用fiddler工具、request库进行接口测试
前端·python·fiddler
召田最帅boy3 小时前
基于URL弹窗的图片链接生成功能技术实现
android·java·javascript