详解使用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 相关文章推荐
网页开发中的容易忽略的问题 javascript HTML中的table
Apr 15 Javascript
神奇的7个jQuery 3D插件整理
Jan 06 Javascript
javascript使用onclick事件改变选中行的颜色
Dec 30 Javascript
用jquery写的菜单从左往右滑动出现
Apr 11 Javascript
jquery实现一个简单好用的弹出框
Sep 26 Javascript
js简单实现点击左右运动的方法
Apr 10 Javascript
jquery实现二级导航下拉菜单效果
Dec 18 Javascript
canvas的神奇用法
Feb 03 Javascript
vue props传值失败 输出undefined的解决方法
Sep 11 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
Jun 18 Javascript
layer.open回调获取弹出层参数的实现方法
Sep 10 Javascript
解决vue中的无限循环问题
Jul 27 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
php 运行效率总结(提示程序速度)
2009/11/26 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
2015/01/22 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
php精确的统计在线人数的方法
2015/10/21 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
2019/11/09 PHP
初窥JQuery(二)事件机制(2)
2010/12/06 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
2014/01/31 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
理解jQuery stop()方法
2014/11/21 Javascript
jQuery结合AJAX之在页面滚动时从服务器加载数据
2015/06/30 Javascript
js实现左侧网页tab滑动门效果代码
2015/09/06 Javascript
node网页分段渲染详解
2016/09/05 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
AngularJS2中一种button切换效果的实现方法(二)
2017/03/27 Javascript
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
原生JS实现图片网格式渐显、渐隐效果
2017/06/05 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
jQuery AJAX应用实例总结
2020/05/19 jQuery
vue实现简单的登录弹出框
2020/10/26 Javascript
Python中编写ORM框架的入门指引
2015/04/29 Python
python开发之thread实现布朗运动的方法
2015/11/11 Python
django 实现电子支付功能的示例代码
2018/07/25 Python
Django 源码WSGI剖析过程详解
2019/08/05 Python
pytorch 共享参数的示例
2019/08/17 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
2019/12/27 Python
使用Tensorboard工具查看Loss损失率
2020/02/15 Python
法国时尚童装网站:Melijoe
2016/08/10 全球购物
Chicco婴儿用品美国官网:汽车座椅、婴儿推车、高脚椅等
2018/11/05 全球购物
英国奢侈品在线精品店:Hervia
2020/09/03 全球购物
商务英语毕业生自荐信范文
2013/11/08 职场文书
项目申请汇报材料
2014/08/16 职场文书