使用webpack打包编写一个vue插件


声明:本文转载自https://my.oschina.net/sichunchen/blog/1559168,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

一、说明:

需求:创建一个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插件

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

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

 # 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){...}
  3. 官方说明: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;

     
  1. 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>

总结

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

本文发表于2017年11月01日 12:34
(c)注:本文转载自https://my.oschina.net/sichunchen/blog/1559168,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2060 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1