相关文章推荐
耍酷的炒饭  ·  Java调用Elasticsearch ...·  10 月前    · 
跑龙套的大白菜  ·  .NetCore JWT ...·  1 年前    · 
愤怒的大象  ·  Frame/IFrame onload ...·  1 年前    · 
低调的风衣  ·  Android WebView ...·  1 年前    · 
11612

富文本编辑器是一个在后台管理系统项目中很大几率会使用到的组件。市面上的富文本编辑器非常多,但是该如何选择呢?个人觉得适合自己的才是最好的,最近项目中就有富文本编辑器使用的需求,在此记录一下实践过程,方便后期查阅。

常见富文本编辑器对比

WangEditor :轻量级 web 富文本编辑器,配置方便,使用简单。支持 IE10+ 浏览器。 vue版本 。一个国人独立开发的基于javascript和css开发的web富文本编辑器,之前用过感觉还是很不错的,UI漂亮,中文文档齐全并且开源。不足的地方在于更新不及时,没有强大的团队支撑。不过细心的会发现现在开始有动作了,成立了wangeditor-team来进行维护,可能也是应了广大用户的需求。

UEditor :由百度「FEX前端研发团队」开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码。不足在于官方很久没有更新了,现在已没有专门维护了,很多在线体验、下载地址都关闭了,而且样式比较老旧,不符合新时代的审美。插件使用复杂,前后端不分离。

Kindeditor :一套开源的在线HTML编辑器,主要用于让用户在网站上获得所见即所得编辑效果,开发人员可以用 KindEditor 把传统的多行文本输入框(textarea)替换为可视化的富文本输入框。文档齐全,为中文,阅读方便。缺点:图片上传存在问题,上传历史过多,会全部加载,导致浏览器卡顿。

TinyMCE :是一款易用、且功能强大的所见即所得的富文本编辑器。优势:插件丰富,自带插件基本涵盖日常所需功能;接口丰富,可扩展性强,有能力可以无限拓展功能;界面好看,符合现代审美;提供经典、内联、沉浸无干扰三种模式;多语言支持,官网可下载几十种语言。官方也在之前发布了 vue 版本的 tinymce-vue ,帮你封装好了很多东西

Vue-Quill-Editor :基于 Quill 、适用于 Vue 的富文本编辑器,支持服务端渲染和单页应用。据说大企业用的比较多,不限制框架,但是需要定制,理念很先进。

站在巨人的肩膀,适合自己的才是最重要的。这里我就以 TinyMCE 和 vue-quill-editor的在vue中基本使用来展示

Vue-Quill-Editor

中文文档地址: www.kancloud.cn/liuwave/qui…

在线体验demo: github.surmon.me/vue-quill-e…

下载依赖包:

npm install vue-quill-editor --save
npm install quill-image-extend-module // 增强模块:用来图片上传服务
npm install quill-image-resize-module // 增强模块:用来调整图像大小
1.全局安装
import Vue from 'vue'
import VueQuillEditor from 'vue-quill-editor'
// require styles
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
Vue.use(VueQuillEditor, /* { default global options } */)
2.局部安装(与页面一起使用)
// require styles
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
import { quillEditor, Quill } from 'vue-quill-editor'
// 增强模块:提供图片上传到服务器的功能+复制插入+拖拽插入+显示上传进度+显示上传成功或者失败
import { container, ImageExtend, QuillWatch } from 'quill-image-extend-module'
// 增强模块:调整图片大小
import ImageResize from 'quill-image-resize-module'
Quill.register('modules/ImageExtend', ImageExtend)
Quill.register('modules/ImageResize', ImageResize)

使用组件:

components: {
  quillEditor
// html
<quill-editor  ref="myQuillEditor"  v-model="content"  :options="editorOption"  @blur="onEditorBlur($event)"  @focus="onEditorFocus($event)"  @ready="onEditorReady($event)"  @change="onEditorRChange($event)"  class="editor"/>
// data
// 富文本框参数设置      editorOption: {        modules: {          ImageExtend: { // 如果不作设置,即{}  则依然开启复制粘贴功能且以base64插入            name: 'img', // 图片参数名            size: 3, // 可选参数 图片大小,单位为M,1M = 1024kb            action: '', // 服务器地址, 如果action为空,则采用base64插入图片            // response 为一个函数用来获取服务器返回的具体图片地址            // 例如服务器返回{code: 200; data:{ url: 'baidu.com'}} 则 return res.data.url            response: (res) => {              return res.info            },            headers: (xhr) => {              // xhr.setRequestHeader('myHeader','myValue')            }, // 可选参数 设置请求头部            sizeError: () => {}, // 图片超过大小的回调            start: () => {}, // 可选参数 自定义开始上传触发事件            end: () => {}, // 可选参数 自定义上传结束触发的事件,无论成功或者失败            error: () => {}, // 可选参数 上传失败触发的事件            success: () => {}, // 可选参数  上传成功触发的事件            change: (xhr, formData) => {              // xhr.setRequestHeader('myHeader','myValue')              // formData.append('token', 'myToken')            } // 可选参数 每次选择图片触发,也可用来设置头部,但比headers多了一个参数,可设置formData          },          toolbar: { // 如果不上传图片到服务器,此处不必配置            container: container, // container为工具栏,此次引入了全部工具栏,也可自行配置            handlers: {              image: function () { // 劫持原来的图片点击按钮事件                QuillWatch.emit(this.quill.id)              }            }          },          ImageResize: true        },        placeholder: 'Compose an epic...', // 占位符文字        readOnly: false // 是否设置为只读模式      }
// 初始化
computed: {    editor () {      return this.$refs.myQuillEditor.quill    }}

运行查看:

imports报错,当前项目环境配置vue + vue-cli3,查阅资料发现原因是在vue脚手架中使用,需要单独配置webpack,解决方案:

// 在vue.config.js中
const webpack = require('webpack')
vue-cli3配置:
module.exports = {
    configureWebpack: {
        plugins: [
            new webpack.ProvidePlugin({
                'window.Quill': 'quill/dist/quill.js',
                'Quill': 'quill/dist/quill.js'
vue-cli2配置:
module.exports = {
    plugins: [
        new webpack.ProvidePlugin({
            'window.Quill': 'quill/dist/quill.js',
            'Quill': 'quill/dist/quill.js'
最后记得一定要重启服务 npm run serve才会生效

最终效果:

TinyMCE

在线体验地址:www.tiny.cloud/features/

官方vue集成方案文档:www.tiny.cloud/docs/integr…

中文文档:tinymce.ax-z.cn/

开始使用:

下载依赖包:

npm install tinymce --save
npm install @tinymce/tinymce-vue --save

下载汉化包:

地址:www.tiny.cloud/get-tiny/la…

将下载解压的文件放在pulic文件夹中:

全部安装 或 局部安装:

// 引入组件
import tinymce from 'tinymce/tinymce'
import Editor from '@tinymce/tinymce-vue'
import 'tinymce/icons/default/icons' // 解决了icons.js 报错Unexpected token '<'
// 引入富文本编辑器主题的js和css
import 'tinymce/themes/silver/theme.min.js'
import 'tinymce/skins/ui/oxide/skin.min.css'
// 扩展插件
import 'tinymce/plugins/link'
import 'tinymce/plugins/lists'
import 'tinymce/plugins/image'
import 'tinymce/plugins/code'
import 'tinymce/plugins/table'
import 'tinymce/plugins/wordcount'

!注意:一定要引入 import 'tinymce/icons/default/icons' 否则会有如下报错:

使用组件:

// 页面html
<editor
   v-model="tinymceHtml"
   id="tinymce"
   api-key="no-api-key"
   :disabled="editorOptions.disabled"
   :init="editorOptions.editorInit"
   output-format="html"
   @onChange="handleChange"
// data中编辑器初始化配置
    editorInit: {
          selector: '#tinymce', // 容器
          language_url: '/tinymce/langs/zh_CN.js',
          language: 'zh_CN',
          skin_url: '/tinymce/skins/ui/oxide', // 主题
          height: 300,
          plugins: 'link lists image code table wordcount', // 用到的插件:链接、列表、图片、代码块、表格、字数
          toolbar: 'undo redo | bold italic underline strikethrough | formatselect fontsizeselect | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist | outdent indent blockquote | link unlink table image | removeformat',
          fontsize_formats: '12px 14px 16px 18px 24px 36px 48px 56px 72px',
          // 工具栏
          images_upload_base_path: 'http://xxxx.com', // 上传图片基础路径
          images_upload_url: '/api/', // 上传图片地址
          statusbar: true, // 底部的状态栏
          menubar: false, // 最上方的菜单
          branding: false, // 水印“Powered by TinyMCE”
          max_height: 500,
          min_height: 300
// 初始化
mounted () {
  tinymce.init({})

图片上传:

两种方式,第一种是直接配置 images_upload_url 设置你的上传api,如上图。第二种:配置images_upload_handler

images_upload_handler: (blobInfo, success, failure) => { // 图片上传
    this.handleImgUpload(blobInfo, success, failure)
methods:{
    // 图片上传
    handleImgUpload (blobInfo, success, failure) {      this.baseUrl = '你的baseurl'      const imgBase64 = `data:${blobInfo.blob().type};base64,${blobInfo.base64()}`      const data = { img: [imgBase64] }      uploadImgage (data).then(res => {        // 传入success回调里的数据就是富文本编辑器里插入图片的src的值        success(`${this.baseUrl}/${res.data[0]}`)      }).catch(() => { failure('error') })    }}

以上就是vue项目中富文本编辑器vue-quill-editor 和 tinymce最基本的使用方式,在实际项目中可以封装为公共组件来使用,完整项目地址:github.com/happydele/v…

攻城狮_阿樂 Web前端工程师 25.6k
粉丝