详解使用webpack打包编写一个vue-toast插件


Posted in Javascript onNovember 08, 2017

本文介绍了使用webpack打包编写一个vue插件,分享给大家。具体如下:

一、说明:

需求:创建一个toast插件

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

# 项目目录:
|_ package.json
|_ webpack.config.js
|_ .babelrc
|_ dist
|_ src
 |_ index.html
 |_ lib
  |_ index.js
  |_ vue-toast.vue

1.1 webpack基础

1、基础插件

- html-webpack-plugin :根据同一个模板生成多个页面
- extract-text-webpack-plugin
- UglifyJSPlugin : js压缩插件
- CommonsChunkPlugin : 把多个页面中公用的文件抽出
- clean-webpack-plugin : 打包过程前清除以前的文件
- copy-webpack-plugin:

2、常用loader解析器

- css-loader (解析css文件)
- sass-loader/less-loader/node-sass (预编译解析)
- file-loader/url-loader 解析图片(png,jpg/svg/gif)
- 给css添加前缀: postcss-loader,autoprefixer

3、webpack.config.js配置文件

//webpack3.0不再支持相对路径,所以在node项目中,可以使用path模块来将相对路径转为绝对路径
var path = require('path'); 

// 核心配置
module.exports={
 // 入口文件
 entry:'./src/lib/index.js', 
 // 出口配置
 output:{
  path:path.join(__dirname,'./dist'), //输入路径
  filename:'vue-toast-demo.js', //打包后文件名
// 打包后的格式(三种规范amd,cmd,common.js)通过umd规范可以适应各种规范,以及全局window属性
  libraryTarget:'umd', 
  library: 'VueToastDemo'
 },
 module:{
  rules:[ //解析模块时需要的模块加载器
   {
    test:/\.vue$/,
    loader:'vue-loader'
   },
   { test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" }
  ]
 },
 plugins:[]
}

 二、开发一个vue-toast插件

  1. 借助npm平台发布一个vue插件
  2. 流程: 声明插件——写插件——注册插件——使用插件

官方文档中说明:写插件有四种方法:

# 1.添加全局方法或属性
Vue.myGlobalMethod = function(){...}

# 2. 添加全局资源
Vue.directive('my-directive',{
 bind(el,binding,vnode,oldVnode){...}
})
# 3. 注入组件
Vue.mixin({
  created:function(){}
 })
# 4. 添加实例方法
Vue.prototype.$myMethod =function(options){}

开发vue插件的几个基本步骤:

1、Vue.js 的插件应当有一个公开方法 install 。

2、install方法的第一个参数是 Vue 构造器,第二个参数是一个可选的选项对象

myplugin.install = function(Vue,options){...}

官方说明:https://cn.vuejs.org/v2/guide/plugins.html#使用插件

import ToastComonent from './vue-toast.vue' //引入vue模板组件

let Toast = {}
Toast.install = function(){ //通过install注册插件
 Vue.prototype.$toast = function(){
  Vue.extend(ToastComponent)
 }
} 
if(window.Vue){
//如果是直接用script标签引入插件,可通过此法注册插件到vue
 Vue.use(Toast) 
}
export default Toast; //导出toast

实践

需求:一个toast弹层功能

1、template.vue。提供html模板

<template>
 <section class="toast-container" :class="visible?'fade-in':'fade-out'">
  <div class="toast">
   <span>{{message}}</span>
  </div>
 </section>
</template>
<script>
 export default {
  name:'tmp',
  data(){
   return{
    visible:true,
    message:'默认提示语'
   }
  }
 }
</script>
<style>
</style>

2、index.js

import ToastComponent from './vue-toast.vue'

let Toast = {}
Toast.install = function(Vue,options){
 var opt={
  duration:3000,

 }
 for(var key in options){
  opt[key] = options[key];
 }
 Vue.prototype.$toast=function(msg,option){
  if(typeof option =='object'){
   for(var key in option){
    opt[key]=option[key]
   }
  }
  const ToastController= Vue.extend(ToastComponent);

  var instance = new ToastController().$mount(document.createElement('div'))

  instance.message = msg;
  instance.visible = true;

  document.body.appendChild(instance.$el)
  setTimeout(()=>{
   instance.visible=false;
   document.body.removeChild(instance.$el)
  },opt.duration)
 }
 Vue.prototype.$toast['show']=function(msg,option){
  Vue.prototype.$toast(msg,option);
 }
}
if(window.Vue){
 Vue.use(Toast)
}

export default Toast;

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 for mobile{{msg}}</h1>
 <div class="demo-box">
  <button @click="test">默认效果</button>
  <button>5s后自动关闭</button>
  <button>消失后执行回调</button>
 </div>
</div>
<script>
 var vm = new Vue({
  el:"#app",
  data:{
   msg:'你好'
  },
  methods:{
   test(){
   // 使用
    this.$toast.show('再来',{
     duration:1000
    })
   }
  }
 })
</script>
</body>
</html>

总结

  1. 使用基础Vue构造器,通过vue组件来创建一个子类:Vue.extend(component)
  2. 编写vue插件的四种方法:常用-Vue.prototype.$method, 其他:Vue.method,Vue.mixin(option),Vue.directive(‘method',option)
  3. webpack配置output的path必须为绝对路径
  4. webpack配置三大属性,entry,output,module,plugins

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
Jul 31 Javascript
Javascript中使用A标签获取当前目录的绝对路径方法
Mar 02 Javascript
javascript实现类似java中getClass()得到对象类名的方法
Jul 27 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
Sep 15 Javascript
jquery Deferred 快速解决异步回调的问题
Apr 05 Javascript
Three.js学习之Lamber材质和Phong材质
Aug 04 Javascript
Windows系统下安装Node.js的步骤图文详解
Nov 15 Javascript
js 毫秒转天时分秒的实例
Nov 17 Javascript
JavaScript实现微信红包算法及问题解决方法
Apr 26 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
Oct 12 Javascript
小程序获取周围IBeacon设备的方法
Oct 31 Javascript
原生js实现自定义消息提示框
Nov 19 Javascript
结合mint-ui移动端下拉加载实践方法总结
Nov 08 #Javascript
详解如何使用webpack在vue项目中写jsx语法
Nov 08 #Javascript
thinkjs 文件上传功能实例代码
Nov 08 #Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
Nov 08 #jQuery
在React 组件中使用Echarts的示例代码
Nov 08 #Javascript
浅谈mint-ui loadmore组件注意的问题
Nov 08 #Javascript
es6在react中的应用代码解析
Nov 08 #Javascript
You might like
APMServ使用说明
2006/10/23 PHP
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
thinkphp5使html5实现动态跳转的例子
2019/10/16 PHP
js类 from qq
2006/11/13 Javascript
JS 学习笔记 防止发生命名冲突
2009/07/30 Javascript
IE6下CSS图片缓存问题解决方法
2010/12/09 Javascript
Javascript 页面模板化很多人没有使用过的方法
2012/06/05 Javascript
JS+css 图片自动缩放自适应大小
2013/08/08 Javascript
解决Jquery load()加载GB2312页面时出现乱码的两种方案
2013/09/10 Javascript
jQuery中mouseover事件用法实例
2014/12/26 Javascript
js Calender控件使用详解
2015/01/05 Javascript
bootstrap多种样式进度条展示
2016/12/20 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
9种改善AngularJS性能的方法
2017/11/28 Javascript
Vue.js添加组件操作示例
2018/06/13 Javascript
微信小程序实现弹出层效果
2020/05/26 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
2019/04/19 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
2019/11/01 Javascript
React实现轮播效果
2020/08/25 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
使用python去除图片白色像素的实例
2019/12/12 Python
浅析Python数字类型和字符串类型的内置方法
2019/12/22 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
python 爬虫请求模块requests详解
2020/12/04 Python
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
牛津在线药房:Oxford Online Pharmacy
2020/11/16 全球购物
二年级评语大全
2014/04/23 职场文书
危货运输企业安全生产责任书
2014/07/28 职场文书
教师工作证明范本
2015/06/12 职场文书
导游词之丹东鸭绿江
2019/10/24 职场文书
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python
pd.drop_duplicates删除重复行的方法实现
2022/06/16 Python