返回顶部
首页 > 资讯 > 前端开发 > JavaScript >webpack如何打包一个按需引入的vue组件库
  • 233
分享到

webpack如何打包一个按需引入的vue组件库

2024-04-02 19:04:59 233人浏览 独家记忆
摘要

目录前言在项目中使用Vue组件库的一般姿势webpack实现可按需引入的组件库接下来就是使用WEBpack打包调试组件库npm 发布步骤非常简单,只需4步调试组件库按需引入总结前言

前言

在公司里一般有多个相同技术栈的项目,毕竟在多个项目间copy公共组件代码太繁琐,也不利于组件库的维护,所以怎么高效维护一套公共的组件代码很重要。这种情况,一般我们可以考虑封装成组件库,发布到npm上。在每个项目里只需要npm install xxx 即可使用,避免了在项目间相互copy。我们这就开始使用webpack打包一个公共的vue组件库。

在项目中使用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、上面的方式看似是一劳永逸,可随着组件库越发的壮大,会出现我引入了整个组件库代码,但我在目前的项目里只使用了其中一小部分组件,但在项目最终打包的时候却把组件库里所有的组件代码都打包进了bundle文件里,影响了最终代码体积,这明显是不合理的。所以便有了按需引入组件库的方式,这里我们参考element-ui的按需引入方式,如下。

接下来,如果你只希望引入部分组件,比如 Button 和 Select,那么需要在 main.js 中写入以下内容:

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) 
});

为什么这样具名导入组件就可以做到按需引入呢?其实是babel-plugin-component插件帮我们完成了转换的工作。在babel-plugin-component内部会把

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

转换成

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是组件库样式所在的文件夹名,都是可以配置的。buttonselect是组件名,lib是babel-plugin-component插件默认寻找组件的文件夹。

webpack实现可按需引入的组件库

npm init创建项目,因为是每个组件单独打包,所以每个组件都导出一个函数,再Vue.use()的时候执行这个函数,完成组件的全局注册。项目目录结构如下

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"
}
  • 第四步:执行 npm run build 打包组件库,成功后项目多了个lib文件夹,存放打包后组件库的代码。lib文件夹里每个文件都有一个对应的.min文件,.min文件分别用terser-webpack-plugin插件和cssnano压缩。

调试组件库

有两种方式可调试本地的组件库

  • 新建test.html,然后以
  • vuecli新建个测试项目,然后通过npm link的方式链接到测试项目中去使用

这里展示就使用最粗暴的方式一,新建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>

测试结果:

到这一步,至少说明代码构建没什么大问题,但按需引入功能还没验收,接下来我们就继续把组件库发布到npm上,完全效仿element-ui的使用方式在vuecli项目中使用,看看实现的效果如何。

npm 发布

步骤非常简单,只需4步

  • 在npm官网注册账号并验证邮箱。
  • 在命令行中输入 npm login 完成登录。
  • 如果npm使用的是淘宝镜像源,需要切回npm源。
  • 进入需要发布的项目目录执行npm publish 发布。

完成后,接着就在测试项目里 npm install 安装我们自己的组件库。

调试组件库按需引入

在测试项目里的babel.config.js,添加babel-plugin-component配置,并重启项目。
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组件库我们就构建完成了。文中使用webpack做为构建工具,其实webpack一般都用来构建应用项目,构建公共库的话,用得更多的是rollup,等我rollup更熟悉的时候再用rollup实现一次,下次见。

总结

到此这篇关于webpack如何打包一个按需引入vue组件库的文章就介绍到这了,更多相关webpack打包按需引入vue组件库内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: webpack如何打包一个按需引入的vue组件库

本文链接: https://lsjlt.com/news/138896.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • webpack如何打包一个按需引入的vue组件库
    目录前言在项目中使用vue组件库的一般姿势webpack实现可按需引入的组件库接下来就是使用webpack打包调试组件库npm 发布步骤非常简单,只需4步调试组件库按需引入总结前言 ...
    99+
    2024-04-02
  • webpack怎么打包一个按需引入的vue组件库
    这篇文章给大家分享的是有关webpack怎么打包一个按需引入的vue组件库的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在项目中使用vue组件库的一般姿势通过import引入,并在入口文件main.js里使用Vu...
    99+
    2023-06-29
  • Vue组件如何自动按需引入详析
    目录全局注册局部注册局部自动注册不同方案对比关于组件名参考总结在Vue中我们可以通过全局组件、局部注册的方式来使用组件 全局注册 通过app.component来创建全局组件 i...
    99+
    2024-04-02
  • vue项目中如何实现element-ui组件按需引入
    目录element-ui组件按需引入按需引入完整引入vue项目搭建 + 引入element-ui初始化单页系统ElementUI整合项目element-ui组件按需引入 按需引入 1...
    99+
    2024-04-02
  • Vue3如何使用glup打包组件库并实现按需加载
    这篇文章主要介绍“Vue3如何使用glup打包组件库并实现按需加载”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue3如何使用glup打包组件库并实现按需加载”文章能帮助大家解决问题。使用 glu...
    99+
    2023-07-06
  • 从0搭建Vue3组件库如何使用 glup 打包组件库并实现按需加载
    目录使用 glup 打包组件库并实现按需加载自动按需引入插件删除打包文件使用 gulpgulp 打包样式打包组件使用 glup 打包组件库并实现按需加载 当我们使用 Vite 库模式...
    99+
    2023-03-23
    glup 打包组件库按需加载 vue3 glup 打包 vue打包组件库
  • 如何实现webpack打包时排除其中一个css、js文件或单独打包一个css、js文件的方法
    这篇文章主要介绍了如何实现webpack打包时排除其中一个css、js文件或单独打包一个css、js文件的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大...
    99+
    2024-04-02
  • React UI组件库之快速实现antd的按需引入和自定义主题
    目录React UI组件库流行的开源React UI组件库antd的基本使用antd样式按需引入antd自定义主题总结React UI组件库 流行的开源React UI组件库 mat...
    99+
    2024-04-02
  • ASP 教程中如何将数组打包成一个文件?
    在 ASP 中,数组是一种非常有用的数据结构。它可以用来存储一组相关的数据,并且可以轻松地对这些数据进行操作。但是,当我们需要将数组保存到文件中时,该怎么办呢?本文将介绍如何使用 ASP 将数组打包成一个文件,以便在需要时可以轻松地重新加...
    99+
    2023-08-02
    教程 打包 数组
  • linux如何显示一个组件的rpm包
    ...
    99+
    2024-04-02
  • 如何解决vue-cli项目webpack打包后iconfont文件路径的问题
    这篇文章主要介绍了如何解决vue-cli项目webpack打包后iconfont文件路径的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。...
    99+
    2024-04-02
  • 如何在 Java 中同时引入 NumPy 和 Django 并打包成一个可执行文件?
    在 Java 中同时引入 NumPy 和 Django 并打包成一个可执行文件是一项具有挑战性的任务。这需要将两种不同的编程语言结合在一起,并确保它们能够无缝协作。 在本文中,我们将介绍如何在 Java 中同时引入 NumPy 和 Djan...
    99+
    2023-09-04
    打包 numy django
  • 如何使用pyinstaller打包时引入自己编写的库
    目录pyinstaller打包引入自己编写的库场景解决方案使用第三方库pyinstallerpyinstaller打包引入自己编写的库 场景 使用pyinstaller打包某个文件后...
    99+
    2024-04-02
  • vite2.x如何实现按需加载ant-design-vue@next组件的方法
    本篇内容介绍了“vite2.x如何实现按需加载ant-design-vue@next组件的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2023-06-14
  • 如何开发一个封装iframe的vue组件
    这篇文章给大家分享的是有关如何开发一个封装iframe的vue组件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。VUE的基本组成单元,我看应该是组件。用VUE开发前端项目,就是开发一个个组件,然后搭积木一样,将项...
    99+
    2023-06-14
  • vue打包之后如何生成一个配置文件修改接口
    这篇文章主要介绍了vue打包之后如何生成一个配置文件修改接口,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言:我们的vue代码打包上传到服...
    99+
    2024-04-02
  • 如何使用Vue3.2+Vite2.7从0快速打造一个UI组件库
    目录1. 前言2. 使用Vite搭建官网2.1 创建项目2.1.1. 全局安装vite(这里我装的时候是2.7.2)2.1.2. 构建一个vue模板(项目名可以改成自己的名字)2.1...
    99+
    2024-04-02
  • Unix 打包:如何将 ASP 和 LeetCode 代码打包成一个可部署的文件?
    在软件开发中,打包是将代码、库和其他资源组合在一起以便于部署的过程。在 Unix 系统中,打包是通过 tar 命令来完成的。本文将介绍如何使用 tar 命令将 ASP 和 LeetCode 代码打包成一个可部署的文件。 ASP 是一种基于...
    99+
    2023-11-07
    leetcode 打包 unix
  • 如何将Java程序打包成一个可执行的jar文件包
    如何将Java程序打包成一个可执行的jar文件包?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先要确认自己写的程序有没有报错。第一次我写的是Web Project到现在,...
    99+
    2023-05-31
    java jar
  • vue如何设计一个倒计时秒杀的组件
    这篇文章将为大家详细讲解有关vue如何设计一个倒计时秒杀的组件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。简介:倒计时秒杀组件在电商网站中层出不穷  不过思路...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作