详解使用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高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
Aug 22 Javascript
关于javascript中的typeof和instanceof介绍
Dec 04 Javascript
JS在textarea光标处插入文本的小例子
Mar 22 Javascript
Javascript实现禁止输入中文或英文的例子
Dec 09 Javascript
谈谈JavaScript类型系统之Math
Jan 06 Javascript
JavaScript原生对象常用方法总结(推荐)
May 13 Javascript
JavaScript数据结构链表知识详解
Nov 21 Javascript
vue resource post请求时遇到的坑
Oct 19 Javascript
使用Vue写一个datepicker的示例
Jan 27 Javascript
d3.js实现图形缩放平移
Dec 19 Javascript
vue动态渲染svg、添加点击事件的实现
Mar 13 Javascript
原生JavaScript创建不可变对象的方法简单示例
May 07 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中看实例学正则表达式
2006/12/25 PHP
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
2011/04/18 PHP
深入探讨<br />和 \r\n两者有什么区别??
2013/06/05 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
2013/08/31 PHP
php替换字符串中间字符为省略号的方法
2015/05/04 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
PHP文件缓存smarty模板应用实例分析
2016/02/26 PHP
学习PHP的数组总结【经验】
2016/05/05 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
2019/04/02 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
Exitjs获取DataView中图片文件名
2009/11/26 Javascript
Javascript学习笔记5 类和对象
2010/01/11 Javascript
jquery tab插件制作实现代码
2010/06/22 Javascript
事件绑定之小测试  onclick &amp;&amp; addEventListener
2011/07/31 Javascript
js实现TAB切换对应不同颜色的代码
2015/08/31 Javascript
javascript数组去重小结
2016/03/07 Javascript
javascript创建对象、对象继承的实用方式详解
2016/03/08 Javascript
分享jQuery网页元素拖拽插件
2020/12/01 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
2017/05/08 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
2017/09/14 Javascript
koa socket即时通讯的示例代码
2018/09/07 Javascript
python支持断点续传的多线程下载示例
2014/01/16 Python
python重试装饰器示例
2014/02/11 Python
Python爬取京东的商品分类与链接
2016/08/26 Python
对numpy中shape的深入理解
2018/06/15 Python
ALEX AND ANI:手镯,项链,耳环和更多
2017/04/20 全球购物
J2EE是技术还是平台还是框架
2016/08/14 面试题
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
销售代表求职自荐信
2013/10/01 职场文书
诚信考试承诺书
2014/03/27 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
postgres之jsonb属性的使用操作
2021/06/23 PostgreSQL
python中urllib包的网络请求教程
2022/04/19 Python