使用webpack打包編寫一個vue插件

1、說明:

需求:建立一個toast插件 
思路:利用vue組件建立模板,使用webpack打包生成插件再全局使用。css

# 項目目錄:
|_ package.json
|_ webpack.config.js
|_ .babelrc
|_ dist
|_ src
    |_ index.html
    |_ lib
        |_ index.js
        |_ vue-toast.vue

1.1 webpack基礎

一、基礎插件 
- html-webpack-plugin :根據同一個模板生成多個頁面 
- extract-text-webpack-plugin 
- UglifyJSPlugin : js壓縮插件 
- CommonsChunkPlugin : 把多個頁面中公用的文件抽出 
- clean-webpack-plugin : 打包過程前清除之前的文件 
- copy-webpack-plugin:html

二、經常使用loader解析器 
- css-loader (解析css文件) 
- sass-loader/less-loader/node-sass (預編譯解析) 
- file-loader/url-loader 解析圖片(png,jpg/svg/gif) 
- 給css添加前綴: postcss-loader,autoprefixervue

三、webpack.config.js配置文件node

//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:[]
}

     

2、開發一個vue-toast插件

  • 藉助npm平臺發佈一個vue插件
  • 流程: 聲明插件——寫插件——註冊插件——使用插件

官方文檔中說明:寫插件有四種方法:webpack

# 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插件的幾個基本步驟:web

  1. Vue.js 的插件應當有一個公開方法 install 。
  2. install方法的第一個參數是 Vue 構造器,第二個參數是一個可選的選項對象npm

    myplugin.install = function(Vue,options){...}
  3. 官方說明:https://cn.vuejs.org/v2/guide/plugins.html#使用插件json

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彈層功能 
一、template.vue。提供html模板sass

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

二、index.jsbabel

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
相關文章
相關標籤/搜索