欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

webpack如何打包一個按需引入的vue組件庫

 更新時間:2022年02月11日 14:41:18   作者:瑜生  
在vue項(xiàng)目開發(fā)中,我們會將經(jīng)常用到的邏輯或模塊抽象成組件,對于那些多個項(xiàng)目都有用到的組件,可以考慮封裝成組件庫,這篇文章主要給大家介紹了關(guān)于webpack如何打包一個按需引入的vue組件庫的相關(guān)資料,需要的朋友可以參考下

前言

在公司里一般有多個相同技術(shù)棧的項(xiàng)目,畢竟在多個項(xiàng)目間copy公共組件代碼太繁瑣,也不利于組件庫的維護(hù),所以怎么高效維護(hù)一套公共的組件代碼很重要。這種情況,一般我們可以考慮封裝成組件庫,發(fā)布到npm上。在每個項(xiàng)目里只需要npm install xxx 即可使用,避免了在項(xiàng)目間相互copy。我們這就開始使用webpack打包一個公共的vue組件庫。

在項(xiàng)目中使用vue組件庫的一般姿勢

  • 1、通過import引入,并在入口文件main.js里使用Vue.use方法完成組件的全局注冊,便可在任何單文件組件中直接使用。如下
import Vue from "vue"
import App from "./App.vue"
import mylib from "mylib"
Vue.use(mylib)
new Vue({
  render: h => h(App)
}).$mount("#app");
  • 2、上面的方式看似是一勞永逸,可隨著組件庫越發(fā)的壯大,會出現(xiàn)我引入了整個組件庫代碼,但我在目前的項(xiàng)目里只使用了其中一小部分組件,但在項(xiàng)目最終打包的時候卻把組件庫里所有的組件代碼都打包進(jìn)了bundle文件里,影響了最終代碼體積,這明顯是不合理的。所以便有了按需引入組件庫的方式,這里我們參考element-ui的按需引入方式,如下。

接下來,如果你只希望引入部分組件,比如 Button 和 Select,那么需要在 main.js 中寫入以下內(nèi)容:

import Vue from 'vue'; 
import { Button, Select } from 'element-ui'; 
import App from './App.vue'; 
Vue.component(Button.name, Button); 
Vue.component(Select.name, Select);  
new Vue({
    el: '#app', 
    render: h => h(App) 
});

為什么這樣具名導(dǎo)入組件就可以做到按需引入呢?其實(shí)是babel-plugin-component插件幫我們完成了轉(zhuǎn)換的工作。在babel-plugin-component內(nèi)部會把

import { Button, Select } from 'element-ui'; 

轉(zhuǎn)換成

var button = require('element-ui/lib/button')
var select = require('element-ui/lib/select')
require('element-ui/lib/theme-chalk/button/style.css')
require('element-ui/lib/theme-chalk/select/style.css')

上面的element-ui是組件庫名,theme-chalk是組件庫樣式所在的文件夾名,都是可以配置的。button、select是組件名,lib是babel-plugin-component插件默認(rèn)尋找組件的文件夾。

webpack實(shí)現(xiàn)可按需引入的組件庫

npm init創(chuàng)建項(xiàng)目,因?yàn)槭敲總€組件單獨(dú)打包,所以每個組件都導(dǎo)出一個函數(shù),再Vue.use()的時候執(zhí)行這個函數(shù),完成組件的全局注冊。項(xiàng)目目錄結(jié)構(gòu)如下

components/navbar/navbar.vue
<template>
  <div class="header__all">{{text}}</div>
</template>
<script>
export default {
  name: "navbar",
  props: {
    text: String
  }
};
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.header__all{
    background-color: #000000;
    color: #FFFFFF;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 50px;
    width: 100%;
}
</style>
components/navbar/index.js
import navbar from "./navbar.vue";
export default function(Vue) {
    Vue.component(navbar.name,navbar);
}
src/index.js
import navbar from "./components/navbar"
function install(Vue){
  Vue.use(navbar)
}
if(window && window.Vue) {
  Vue.use(install)
}
export default install

接下來就是使用webpack打包

  • 第一步:先安裝所有需要用到的依賴
npm i -D webpack webpack-cli babel-loader @babel/core @babel/preset-env babel-plugin-component clean-webpack-plugin css-loader mini-css-extract-plugin node-sass postcss postcss-loader autoprefixer cssnano sass-loader terser-webpack-plugin vue-loader vue-template-compiler
  • 第二步:配置webpack.config.js
const path = require('path')
const TerserPlugin = require("terser-webpack-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin")
const { VueLoaderPlugin } = require('vue-loader')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {
  mode: 'none',
  entry: {
    'navbar': './src/components/navbar/index.js',
    'navbar.min': './src/components/navbar/index.js',
    'test-lib': './src/index.js',
    'test-lib.min': './src/index.js'
    
  },
  output: {
    path: path.join(__dirname,"/lib"),
    filename: '[name].js',
    libraryTarget: 'umd',
    library: '[name]',
    libraryExport: 'default'
  },
//   externals:[],
  optimization: {
    minimize: true,
    minimizer: [
        new TerserPlugin({
            test: /\.min\.js$/,
        }),
    ],
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        use:  ['vue-loader']
      },
      {
        test: /\.css$/,
        use:  [MiniCssExtractPlugin.loader,'css-loader','postcss-loader']
      },
      {
          test: /\.s[ac]ss$/i,
          use:  [MiniCssExtractPlugin.loader,'css-loader','postcss-loader','sass-loader']
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use:{
            loader: 'babel-loader',
            options: {
                cacheDirectory: true
            }
        }
        
      }
    ]
  },
  plugins: [
    new VueLoaderPlugin(),
    new CleanWebpackPlugin(),
    new MiniCssExtractPlugin({
        filename: 'lib-style/[name].css'
    })
  ]
}
  • 第三步:更改package.json的main字段,并往scripts里添加打包命令
"main": "./lib/test-lib.min.js",
"scripts": {
    "build": "webpack --config webpack.config.js"
}
  • 第四步:執(zhí)行 npm run build 打包組件庫,成功后項(xiàng)目多了個lib文件夾,存放打包后組件庫的代碼。lib文件夾里每個文件都有一個對應(yīng)的.min文件,.min文件分別用terser-webpack-plugin插件和cssnano壓縮。

調(diào)試組件庫

有兩種方式可調(diào)試本地的組件庫

  • 新建test.html,然后以
  • vuecli新建個測試項(xiàng)目,然后通過npm link的方式鏈接到測試項(xiàng)目中去使用

這里展示就使用最粗暴的方式一,新建test.html,npm link各位看官老爺可以自己去嘗試下。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./lib/lib-style/test-lib.min.css" rel="external nofollow" >
</head>
<body>
    <div id="app">
        <navbar text="header"></navbar>
    </div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="./lib/test-lib.min.js"></script>
<script>
    new Vue({
        el: '#app'
    })
</script>
</html>

測試結(jié)果:

到這一步,至少說明代碼構(gòu)建沒什么大問題,但按需引入功能還沒驗(yàn)收,接下來我們就繼續(xù)把組件庫發(fā)布到npm上,完全效仿element-ui的使用方式在vuecli項(xiàng)目中使用,看看實(shí)現(xiàn)的效果如何。

npm 發(fā)布

步驟非常簡單,只需4步

  • 在npm官網(wǎng)注冊賬號并驗(yàn)證郵箱。
  • 在命令行中輸入 npm login 完成登錄。
  • 如果npm使用的是淘寶鏡像源,需要切回npm源。
  • 進(jìn)入需要發(fā)布的項(xiàng)目目錄執(zhí)行npm publish 發(fā)布。

完成后,接著就在測試項(xiàng)目里 npm install 安裝我們自己的組件庫。

調(diào)試組件庫按需引入

在測試項(xiàng)目里的babel.config.js,添加babel-plugin-component配置,并重啟項(xiàng)目。
babel-plugin-component基本配置參考

// babel.config.js
module.exports = {
  presets: ["@vue/cli-plugin-babel/preset"],
  plugins: [
    [
      'component',
      {
        libraryName: 'element-ui',
        styleLibraryName: 'theme-chalk'
      },
      'element-ui'
    ],
    [
      'component',
      {
        libraryName: 'test-lib',
        styleLibrary: {
          "name": "lib-style", // same with styleLibraryName
          "base": false  // if theme package has a base.css
        }
      },
      'test-lib'
    ],
  ]
};

在test.vue中使用組件庫

<template>
<div>
  <navbar :text="msg"></navbar>
  <el-button type="primary" class="dg-margin-t-20">element-button</el-button>
</div>
</template>
<script>
import Vue from "vue";
import { navbar } from "juejintest-lib";
import { button } from "element-ui";
Vue.use(navbar)
Vue.use(button)
export default {
  data:function() {
      return {
          msg: 'text'
      }
  }
};
</script>
<style lang="scss">
.dg-margin-t-20{
    margin-top:20px;
}
</style>

到此按需引入的vue組件庫我們就構(gòu)建完成了。文中使用webpack做為構(gòu)建工具,其實(shí)webpack一般都用來構(gòu)建應(yīng)用項(xiàng)目,構(gòu)建公共庫的話,用得更多的是rollup,等我rollup更熟悉的時候再用rollup實(shí)現(xiàn)一次,下次見。

總結(jié)

到此這篇關(guān)于webpack如何打包一個按需引入vue組件庫的文章就介紹到這了,更多相關(guān)webpack打包按需引入vue組件庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue之常用的內(nèi)置指令詳解

    Vue之常用的內(nèi)置指令詳解

    這篇文章主要為大家介紹了Vue之常用的內(nèi)置指令,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • 如何去掉el-table中自帶的邊框線

    如何去掉el-table中自帶的邊框線

    文章介紹了如何去掉Element UI中el-table組件自帶的邊框線,通常情況下,el-table沒有添加border屬性,但仍然會出現(xiàn)邊框線,可能的原因包括ElementUI的默認(rèn)樣式或表格的某些內(nèi)置樣式,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • Vue3響應(yīng)式對象Reactive和Ref的用法解讀

    Vue3響應(yīng)式對象Reactive和Ref的用法解讀

    這篇文章主要介紹了Vue3響應(yīng)式對象Reactive和Ref的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Vue使用NPM方式搭建項(xiàng)目

    Vue使用NPM方式搭建項(xiàng)目

    這篇文章主要介紹了Vue項(xiàng)目搭建過程,使用NPM方式搭建的,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2018-10-10
  • Vue參數(shù)的增刪改實(shí)例詳解

    Vue參數(shù)的增刪改實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了Vue參數(shù)的增刪改實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Vue3組件異步更新和nextTick運(yùn)行機(jī)制源碼解讀

    Vue3組件異步更新和nextTick運(yùn)行機(jī)制源碼解讀

    這篇文章主要為大家介紹了Vue3組件異步更新和nextTick運(yùn)行機(jī)制源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 關(guān)于vue3 vuex4 store的響應(yīng)式取值問題解決

    關(guān)于vue3 vuex4 store的響應(yīng)式取值問題解決

    這篇文章主要介紹了vue3 vuex4 store的響應(yīng)式取值問題,在實(shí)際生活中遇到這樣一個問題:在頁面中點(diǎn)擊按鈕,數(shù)量增加,值是存在store中的,點(diǎn)擊事件值沒變,如何解決這個問題,本文給大家分享解決方法,需要的朋友可以參考下
    2022-08-08
  • Vue使用Echarts實(shí)現(xiàn)橫向柱狀圖,并通過WebSocket即時通訊更新

    Vue使用Echarts實(shí)現(xiàn)橫向柱狀圖,并通過WebSocket即時通訊更新

    這篇文章主要介紹了Vue使用Echarts實(shí)現(xiàn)橫向柱狀圖,并通過WebSocket即時通訊更新方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Vue Router添加全局$router屬性的示例詳解

    Vue Router添加全局$router屬性的示例詳解

    這篇文章主要介紹了Vue-Router-添加全局$router屬性,在 Vue 中有一個 mixin 方法,這個方法會在每個組件創(chuàng)建之前被調(diào)用,我們可以在這個方法中將 VueRouter 實(shí)例掛載到 Vue 實(shí)例上,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • element-ui 中使用upload多文件上傳只請求一次接口

    element-ui 中使用upload多文件上傳只請求一次接口

    這篇文章主要介紹了element-ui 中使用upload多文件上傳只請求一次接口,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07

最新評論