详解使用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 相关文章推荐
jQuery 使用手册(二)
Sep 23 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
Jul 29 Javascript
jQuery validate验证插件使用详解
May 11 Javascript
jQuery实现根据生日计算年龄 星座 生肖
Nov 23 Javascript
浅谈键盘上回车按钮的js触发事件
Feb 13 Javascript
React中如何引入Angular组件详解
Aug 09 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
Sep 03 Javascript
JavaScript常见事件对象与操作实例总结
Jan 05 Javascript
微信小程序Echarts覆盖正常组件问题解决
Jul 13 Javascript
tracking.js实现前端人脸识别功能
Apr 16 Javascript
vant 时间选择器--开始时间和结束时间实例
Nov 04 Javascript
React Fragment介绍与使用详解
Nov 11 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源代码数组统计count分析
2011/08/02 PHP
PHP同时连接多个mysql数据库示例代码
2014/03/17 PHP
PHP实现图片压缩的两则实例
2014/07/19 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
2017/03/16 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
2009/11/14 Javascript
JQuery判断radio(单选框)是否选中和获取选中值方法总结
2015/04/15 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
ES6学习笔记之Set和Map数据结构详解
2017/04/07 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
2017/07/27 Javascript
JsChart组件使用详解
2018/03/04 Javascript
webpack配置proxyTable时pathRewrite无效的解决方法
2018/12/13 Javascript
微信小程序 云开发模糊查询实现解析
2019/09/02 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
2020/01/04 Javascript
vue实现信息管理系统
2020/05/30 Javascript
微信小程序实现canvas分享朋友圈海报
2020/06/21 Javascript
python的几种开发工具介绍
2007/03/07 Python
python实现键盘控制鼠标移动
2020/11/27 Python
Win系统PyQt5安装和使用教程
2019/12/25 Python
详解vscode实现远程linux服务器上Python开发
2020/11/10 Python
详解如何解决canvas图片getImageData,toDataURL跨域问题
2018/09/17 HTML / CSS
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
上海某公司.net方向笔试题
2014/09/14 面试题
致跳远、跳高运动员广播稿
2014/01/09 职场文书
高三学生评语大全
2014/04/25 职场文书
加强作风建设演讲稿
2014/10/24 职场文书
中层干部考核评语
2015/01/04 职场文书
2016年第104个国际护士节活动总结
2016/04/06 职场文书
劳动合同变更协议书范本
2019/04/18 职场文书
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python
Go语言读取txt文档的操作方法
2022/01/22 Golang
日本动漫十大公认神作:第五现已全网禁播,《死亡笔记》在榜
2022/03/18 日漫
基于Python实现射击小游戏的制作
2022/04/06 Python
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS