使用vue-cli编写vue插件

利用vue组件创建模板,使用webpack打包生成插件再全局使用

1、vue init webpack-simple 生成项目目录

2、调整目录结构

3、修改webpack.config.js

var path = require(‘path‘)
var webpack = require(‘webpack‘)

module.exports = {
  entry: ‘./src/index.js‘,
  output: {
    path: path.resolve(__dirname, ‘./dist‘),
    publicPath: ‘/dist/‘,
    filename: ‘vue-toast.js‘,
    // 打包后的格式(三种规范amd,cmd,common.js)通过umd规范可以适应各种规范,以及全局window属性
    libraryTarget:‘umd‘,
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: ‘vue-loader‘,
      },
      {
        test: /\.js$/,
        loader: ‘babel-loader‘,
        exclude: /node_modules/
      },

    ]
  },
  plugins:[]
}  

开发一个toast插件,可以借助npm平台发布,在这里就不做过多的说明了

toast.vue

<template>
  <transition name="toast-fade">
    <div class="toast"
      :class="objClass"
      v-show="isActive"
      @mouseenter="onMouseenter"
      @mouseleave="onMouseleave"
      >
      <button class="toast-close-button" @click="hide">×</button>
      <div class="toast-container">
        <div class="toast-title">{{title}}</div>
        <div class="toast-content">{{content}}</div>
      </div>
    </div>
  </transition>
</template>

<script>
export default {
  data: () => ({
    list: [],
    title: null,
    content: null,
    type: null,
    isActive: false,
    timer: null,
    onShow: () => {},
    onHide: () => {}
  }),
  computed: {
    objClass () {
      // 样式‘success, error, warning, default‘
      return this.type ? ‘toast-‘ + this.type : null
    }
  },
  methods: {
    // 显示
    show (params) {
      let {content, title, onShow, onHide, type} = params
      this.type = type
      this.content = content
      this.title = title
      this.onShow = onShow
      this.onHide = onHide

      this.isActive = true
      this.setTimer()
    },

    // 隐藏
    hide () {
      this.isActive = false
    },

    // 计时器
    setTimer () {
      clearTimeout(this.timer)
      this.timer = setTimeout(() => {
        this.isActive = false
      }, 4000)
    },

    // 鼠标移至组件时保持显示状态
    onMouseenter () {
      clearTimeout(this.timer)
    },

    // 鼠标移开组件时重新定时
    onMouseleave () {
      if (this.isActive) this.setTimer()
    }
  },
  watch: {
    isActive (val) {
      if (val && typeof this.onShow === ‘function‘) {
        this.onShow()
      } else if (!val && typeof this.onHide === ‘function‘) {
        this.onHide()
      }
    }
  }
}
</script>

<style>
.toast {
  position: fixed;
  top: 10px;
  right: 10px ;
  display: block;
  width: 300px;
  overflow: hidden;
  box-shadow: 0 0 6px #999;
  opacity: .8;
  border-radius: 3px 3px;
  padding: 15px 15px 15px 15px;
  background-position: 15px center;
  background-repeat: no-repeat;
  color: #333;
  background-color: #f0f3f4;
}

.toast-success {
  color: #fff;
  background-color: #51a351;
  padding: 15px 15px 15px 50px;
  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important;
}
.toast-error {
  color: #fff;
  background-color: #bd362f;
  padding: 15px 15px 15px 50px;
  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important;
}
.toast-warning {
  color: #fff;
  background-color: #f89406;
  padding: 15px 15px 15px 50px;
  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important;
}
.toast:hover {
  opacity: 1;
  box-shadow: 0 0 18px #888;
  transition: all 200ms ease;
}
.toast-container {
  vertical-align: middle;
}

.toast-fade-enter, .toast-fade-leave-active {
  opacity: 0;
  transform: translateX(100%);
}
.toast-fade-leave-active,
.toast-fade-enter-active {
  transition: all 400ms cubic-bezier(.36,.66,.04,1);
}
.toast-title {
  font-size: 14px;
  font-weight: bold;
}
.toast-close-button {
    padding: 2px 2px;
    border: none;
    background: transparent;
    position: relative;
    right: -10px;
    top: -15px;
    float: right;
    font-size: 20px;
    font-weight: bold;
    color: #ffffff;
    -webkit-text-shadow: 0 1px 0 #ffffff;
    text-shadow: 0 1px 0 #ffffff;
    -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);
    filter: alpha(opacity=80);
}

</style>

index.js

import ToastComponent from ‘./toast.vue‘
let Toast = {};
Toast.install = function(Vue, options = {}) {
    // extend组件构造器
    const VueToast = Vue.extend(ToastComponent)
    let toast = null
    function $toast(params) {
        return new Promise( resolve => {
            if(!toast) {
                toast = new VueToast()
                toast.$mount()
                document.querySelector(options.container || ‘body‘).appendChild(toast.$el)
            }
            toast.show(params)
            resolve()
        })
    }
    Vue.prototype.$toast = $toast
}
if(window.Vue){
    Vue.use(Toast)
}
export default Toast

npm run build 之后就会在根目录下生成dist文件

接下来就可以使用了

demo.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
  <!--引入-->
  <script src="node_modules/vue/dist/vue.js"></script>
  <script src="dist/vue-toast.js"></script>
</head>

<body>
  <div id="app">
    <h1>vue-toast,{{msg}}</h1>
    <div class="demo-box">
      <button @click="test">默认效果</button>
    </div>
  </div>
  <script>
    var vm = new Vue({
      el: "#app",
      data: {
        msg: ‘你好‘
      },
      methods: {
        test() {
            this.$toast({
              title:‘消息提示‘,
              content: ‘您有一条新消息‘,
              type: ‘warning‘,
              onShow: ()=>{
                  console.log(‘on toast show‘)
              },
              onHide: ()=>{
                  console.log(‘on toast hide‘)
              }
          })
        }
      }
    })

  </script>
</body>

</html>

总结:

1、使用Vue构造器,通过vue组件来创建一个子类:Vue.extend(component)

2、webpack配置output的path必须为绝对路径

3、webpack基础配置:entry,output,module,plugins

原文地址:https://www.cnblogs.com/rongjuan/p/8461261.html

时间: 2024-09-28 17:58:40

使用vue-cli编写vue插件的相关文章

[Vue CLI 3] vue inspect 的源码设计实现

首先,请记住: 它在新版本的脚手架项目里面非常重要 它有什么用呢? inspect internal webpack config 能快速地在控制台看到对应生成的 webpack 配置对象. 首先它是 vue 的一个扩展命令,在文件 @vue/cli/bin/vue.js 中定义了 command 还是依赖了工具包 commander const program = require('commander') 代码配置如下: program .command('inspect [paths...]

利用脚手架vue cli搭建vue项目

vue.js https://vuejs.org/ 基础: http://cn.vuejs.org/v2/guide/installation.html 1.安装需要利用npm包管理器,所以首先安装node.js https://nodejs.org/en/download/ 安装好后,打开cmd面板,输入 node -v  (v即 version ,查看node版本) npm是随nodeJs一起安装.所以输入 npm -v 说明npm也已经好了. (安装nodejs后,里面的npm可能不是最新

使用Vue CLI构建Vue项目

第一步:首先在控制台输入vue --version,如果出现版本号则进入第三步:否则进入第二步: 第二步:输入npm install cnpm -g --registry=https://registry.npm.taobao.org,安装淘 宝镜像,以后安装其他依赖时候就可以输入cnpm install --- 了,因为npm安装会非 常慢,一般来说会失败: 第三步:控制台输入vue init webpack my-project  注:这里的my-project就是你要创建的 项目的名称,自

Vue CLI 3.x搭建Vue项目

一.Node安装 windows 1. Node.js (>=8.9, 推荐8.11.0+) Node官网下载 .msi 文件,按步骤下载安装即可. 安装完之后在cmd中输入 node -v,若显示版本号,则说明安装成功. 2. Git(命令行终端) Git官网下载安装即可. Linux apt-get install nodejs node -v apt-get install npm npm -v npm命令1.得到原本的镜像地址 npm get registry 2.设置成淘宝 npm c

Vue CLI 3搭建vue+vuex 最全分析

一.介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.有三个组件: CLI:@vue/cli 全局安装的 npm 包,提供了终端里的vue命令(如:vue create .vue serve .vue ui 等命令) CLI 服务:@vue/cli-service是一个开发环境依赖.构建于 webpack 和 webpack-dev-server 之上(提供 如:serve.build 和 inspect 命令) CLI 插件:给Vue 项目提供可选功能的 npm 包 (如

自己动手编写vue之旅

一.为什么要自己动手写插件呢,原因有二: 其一:是因为最近产品了提了一个在web端接收,消息通知的需求,产品要求在若干个页面内如果有消息,就要弹出消息弹窗展示给用户,略加思索之后,第一反应就是写个消息的组件,在需要的页面引入,不过写好之后,发现这样写好麻烦,是不是可以写个插件在全局一次性引入呢? 其二:纯粹的想学习一下vue的插件是如何开发的 二.既然有想法了,那就开始写呗,先去查看了vue的官方文档,官方文档介绍如下: 插件通常用于为 Vue 添加全局级别的功能.然而对于插件,并没有严格限定其

vue使用一些外部插件及样式的配置

一.配置全局css及js样式 1.首先将事先写好的css文件及js文件放在src文件目录下的assets文件下 2.在main.js文件输上图右边两个红色框的代码 二.配置全局jQuery及bootstrap 安装插件步骤: jQuery >: cnpm install jquery vue/cli 3 配置jQuery:在vue.config.js中配置(没有,手动项目根目录下新建) const webpack = require("webpack"); module.expo

在vue cli 3脚手架里引入tinymce 5富文本编辑器

本文主要讲的是在Vue cli 3脚手架搭建的项目里如何引用Tinymce 5富文本编辑器. 请注意识别"版本号",不同版本的配置细节有所不同. 1. tinymce的安装 1. 安装tinymce-vue npm install @tinymce/tinymce-vue -S 2. 安装tinymce npm install tinymce -S 3. 下载中文语言包 tinymce提供的语言包很多,选择下载中文语言包 2. 使用方法 1. 文件操作 在项目根目录的public目录下

vue cli中环境变量和模式

环境变量配置 环境变量可以在以下文件中配置: .env # 在所有的环境中被载入 .env.local # 在所有的环境中被载入,但会被 git 忽略 .env.[mode] # 只在指定的模式中被载入 .env.[mode].local # 只在指定的模式中被载入,但会被 git 忽略 (.local优先于.env生效) 文件内部使用键值对的方式对变量进行配置 被载入的变量将会对 vue-cli-service 的所有命令.插件和依赖可用,同时为一个特定模式准备的环境文件的 (例如 .env.

Vue中的better-scroll插件

Vue中的better-scroll插件 在需要的文件中添加 import BScorll from 'better-scroll'; 引用的示例代码: let scroll = new BScroll(Dom对象, {//options startX: 0, startY: 0 }) Vue获得Dom对象方法, <div v-el:food-wrapper></div>//定义对象 this.$els.foodWrapper//获取对象 (Vue 更新数据时是异步的,所以在数据未