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 的稳定性和扩展性,为开发者提供高效的富文本解决方案。通过灵活的配置和模块化设计,可快速适配不同业务场景。

相关推荐
0wioiw03 分钟前
Flutter基础(前端教程⑤-组件重叠)
开发语言·前端·javascript
冰天糖葫芦15 分钟前
VUE实现数字翻牌效果
前端·javascript·vue.js
Brilliant Nemo17 分钟前
集成CommitLInt+ESLint+Prettier+StyleLint+LintStaged
javascript
嘉琪00120 分钟前
2025 js——面试题(7)——ajax相关
开发语言·javascript·ajax
南岸月明25 分钟前
我与技术无缘,只想副业搞钱
前端
liu_yueyang27 分钟前
JavaScript VMP (Virtual Machine Protection) 分析与调试
开发语言·javascript·ecmascript
gzzeason1 小时前
在HTML中CSS三种使用方式
前端·css·html
hnlucky1 小时前
《Nginx + 双Tomcat实战:域名解析、静态服务与反向代理、负载均衡全指南》
java·linux·服务器·前端·nginx·tomcat·web
huihuihuanhuan.xin1 小时前
前端八股-promise
前端·javascript
星语卿1 小时前
浏览器重绘与重排
前端·浏览器