zoukankan      html  css  js  c++  java
  • vue-quill-editor 富文本集成quill-image-extend-module插件实例,以及UglifyJsPlugin打包抱错问题处理

    官网

    vue-quill-editor
    Toolbar Module - Quill
    vue-quill-image-upload

    图片支持上传服务器并调整大小

    1.在 package.json 中加入 "quill-image-extend-module": "^1.1.2" 依赖
    2.在编辑器组件中引入以下代码

    <template>
      <div class="in-editor-panel">
        <quill-editor ref="quillEditor" v-model="content" :options="editorOption" @change="onChange">
        </quill-editor>
      </div>
    </template>
    
    <script type="text/ecmascript-6">
      import 'quill/dist/quill.core.css'
      import 'quill/dist/quill.snow.css'
      import { quillEditor, Quill } from 'vue-quill-editor'
      import { ImageExtend, QuillWatch } from 'quill-image-extend-module'
      import { hasClass } from 'assets/scripts/dom/dom'
    
      Quill.register('modules/ImageExtend', ImageExtend)
    
      export default {
        props: {
          value: {
            type: String,
            default: ''
          },
          toolbarMode: {
            type: Number,
            default: 0
          },
          placeholder: {
            type: String,
            default: '请输入内容'
          },
          height: {
            type: Number,
            default: 170
          },
          imagePath: {
            type: String,
            default: ''
          }
        },
        data () {
          return {
            content: '',
            toolbars: [
              [
                ['bold', 'italic', 'underline', 'strike'],
                ['blockquote', 'code-block'],
                [{'header': 1}, {'header': 2}],
                [{'list': 'ordered'}, {'list': 'bullet'}],
                [{'script': 'sub'}, {'script': 'super'}],
                [{'indent': '-1'}, {'indent': '+1'}],
                [{'direction': 'rtl'}],
                [{'size': ['small', false, 'large', 'huge']}],
                [{'header': [1, 2, 3, 4, 5, 6, false]}],
                [{'font': []}],
                [{'color': []}, {'background': []}],
                [{'align': []}],
                ['clean'],
                ['link', 'image', 'video']
              ],
              [
                ['bold', 'italic', 'underline'],
                ['blockquote', 'code-block'],
                [{'list': 'ordered'}, {'list': 'bullet'}],
                [{'header': [1, 2, 3, 4, 5, 6, false]}],
                [{'color': []}, {'background': []}],
                [{'align': []}],
                ['link', 'image', 'video']
              ],
              [
                ['bold', 'italic', 'underline'],
                ['blockquote', 'code-block'],
                [{'list': 'ordered'}, {'list': 'bullet'}],
                [{'color': []}, {'background': []}],
                ['insert']
              ]
            ],
            editorOption: {
              modules: {
                ImageExtend: {
                  loading: true,
                  name: 'image',
                  size: 2,
                  action: `/api/file/upload/image?filePath=${JSON.stringify(this.imagePath)}`,
                  response: (res) => {
                    return res.data
                  }
                },
                toolbar: {
                  container: [],
                  handlers: {
                    'image': function () {
                      QuillWatch.emit(this.quill.id)
                    }
                  }
                }
              },
              placeholder: this.placeholder
            }
          }
        },
        computed: {
          editor () {
            return this.$refs.quillEditor.quill
          }
        },
        watch: {
          // 监听父组件传入的内容
          value (newVal) {
            this.$nextTick(() => {
              this._listenerImage()
            })
    
            if (newVal === this.content) {
              return false
            }
    
            // 传入的内容不等于编辑器自身内容,则更新
            this.content = newVal
          },
          'content' () {
            this._listenerImage()
          }
        },
        created () {
          // 指定工具栏
          this.editorOption.modules.toolbar.container = this.toolbars[this.toolbarMode]
        },
        mounted () {
          // 设置编辑器高度
          this.editor.container.style.height = `${this.height}px`
        },
        methods: {
          // 显示宽度修改框
          _showWidthBox (event) {
            // 获取当前图片对象
            let currentImg = event.target
    
            // 弹出宽度输入框
            this.$prompt('请输入宽度', '提示', {
              inputValue: currentImg.width,
              confirmButtonText: '确定',
              cancelButtonText: '取消'
            }).then(({value}) => {
              // 赋值新宽度
              currentImg.width = value
            }).catch(() => {})
          },
          // 监听图片点击
          _listenerImage () {
            // 获取DOM对象
            let editor = document.getElementsByClassName('ql-editor')[0]
            let img = editor.getElementsByTagName('img')
    
            // 非空验证
            if (img.length === 0) {
              return
            }
    
            for (let i = 0; i < img.length; i++) {
              let currentImg = img[i]
    
              // 绑定且防止重复绑定
              currentImg.removeEventListener('dblclick', this._showWidthBox, false)
              currentImg.addEventListener('dblclick', this._showWidthBox, false)
            }
          },
          onChange () {
            // 告知父组件内容发生变化
            this.$emit('input', this.content)
          }
        },
        components: {
          quillEditor
        }
      }
    </script>
    
    

    集成quill-image-extend-module后打包抱错:

    在这里插入图片描述

    原因是因为 uglifyjs 不支持ES6 (ES2015), 所以你需要在webpack uglify 之前, 把报错的文件(或文件夹)用babel-loader 处理

    vue webpack template 有个 build/webpack.base.conf.js 文件

    在这里插入图片描述
    这文件的有这一段

    var path = require('path')
    var utils = require('./utils')
    ...
    module.exports = {
    ...
      module: {
        ...
          {
            test: /.js$/,
            loader: 'babel-loader',
            include: [
              resolve('src'),
              resolve('test')
            ]
          },
    

    这段代表的就是用 babel-loader 把 这些 include 的所有文件(和文件夹里任何文件), 用babel-loader 处理, 你会发现你的src 也在这个 include 列组里 (很容易理解,因为写Vue, 就基本会用到 ES6 syntax)

    只需要吧这个插件的路径加到下面就行(如下):
    在这里插入图片描述
    主要记住一个原理就是

    基本上任何与javascript syntax 有关的问题 (build 会报错是哪个文件, 而且一般都是在uglify 环节), 都可以放到这里。指定先用babel-loader 转换成最基础的javascript 格式, 这样一般后续环节都不会有javascript syntax 问题 (因为最基础的javascript 格式总该都要支持吧)。

  • 相关阅读:
    Mac下安装brew
    Mac下安装node.js
    Mac下mysql服务端密码重置及环境配置
    Mac配置jdk以及maven
    Mac下卸载jdk
    34个漂亮的应用程序后台管理界面(系列一)
    ViewState
    get和post
    无刷新 分页评论
    isPostBack原理
  • 原文地址:https://www.cnblogs.com/both-eyes/p/10623233.html
Copyright © 2011-2022 走看看