详解使用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 相关文章推荐
json-lib出现There is a cycle in the hierarchy解决办法
Feb 24 Javascript
node.js使用require()函数加载模块
Nov 26 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
Mar 28 Javascript
JavaScript实现三级联动菜单实例代码
Jun 26 Javascript
Vue 中批量下载文件并打包的示例代码
Nov 20 Javascript
对layui中表单元素的使用详解
Aug 15 Javascript
vue完成项目后,打包成静态文件的方法
Sep 03 Javascript
javascript实现计算指定范围内的质数示例
Dec 29 Javascript
使用vue重构资讯页面的实例代码解析
Nov 26 Javascript
es6 super关键字的理解与应用实例分析
Feb 15 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
Aug 04 Javascript
解决Antd Table组件表头不对齐的问题
Oct 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 正则表达式的学习探讨
2013/06/06 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
因str_replace导致的注入问题总结
2019/08/08 PHP
javascript Array.prototype.slice使用说明
2010/10/11 Javascript
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
jQuery修改CSS伪元素属性的方法
2014/07/30 Javascript
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
JQuery 传送中文乱码问题的简单解决办法
2016/05/24 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
Vue.js每天必学之Class与样式绑定
2016/09/05 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
2017/02/24 Javascript
微信小程序自定义组件
2017/08/16 Javascript
angular2路由之routerLinkActive指令【推荐】
2018/05/30 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
2019/08/27 Javascript
解决axios post 后端无法接收数据的问题
2019/10/29 Javascript
详解Typescript里的This的使用方法
2021/01/08 Javascript
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
手把手教你python实现SVM算法
2017/12/27 Python
python购物车程序简单代码
2018/04/18 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
2019/01/07 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
Python学习笔记之装饰器
2020/08/06 Python
新西兰网上购物,折扣店:BestDeals.co.nz
2019/03/20 全球购物
党的群众路线教育实践活动宣传方案
2014/02/23 职场文书
《长征》教学反思
2014/04/27 职场文书
2014年行政工作总结
2014/11/19 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
2015年南京大屠杀纪念日活动总结
2015/03/24 职场文书
整改通知书
2015/04/20 职场文书
幼儿园安全工作总结2015
2015/04/20 职场文书
欠条范文
2015/07/03 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书
导游词之吉林吉塔
2019/11/11 职场文书