返回顶部
首页 > 资讯 > 精选 >webpack怎么打包一个按需引入的vue组件库
  • 580
分享到

webpack怎么打包一个按需引入的vue组件库

2023-06-29 03:06:09 580人浏览 泡泡鱼
摘要

这篇文章给大家分享的是有关webpack怎么打包一个按需引入的Vue组件库的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在项目中使用vue组件库的一般姿势通过import引入,并在入口文件main.js里使用Vu

这篇文章给大家分享的是有关webpack怎么打包一个按需引入的Vue组件库的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

    项目中使用vue组件库的一般姿势

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

    webpack怎么打包一个按需引入的vue组件库

    接下来,如果你只希望引入部分组件,比如 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()的时候执行这个函数,完成组件的全局注册。项目目录结构如下

    webpack怎么打包一个按需引入的vue组件库

    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.jsimport navbar from "./navbar.vue";export default function(Vue) {    Vue.component(navbar.name,navbar);}
    src/index.jsimport 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压缩。

    webpack怎么打包一个按需引入的vue组件库

    调试组件库

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

    • 新建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>

    测试结果:

    webpack怎么打包一个按需引入的vue组件库

    到这一步,至少说明代码构建没什么大问题,但按需引入功能还没验收,接下来我们就继续把组件库发布到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.jsmodule.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>

    webpack怎么打包一个按需引入的vue组件库

    感谢各位的阅读!关于“webpack怎么打包一个按需引入的vue组件库”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

    --结束END--

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

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

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

    猜你喜欢
    • webpack怎么打包一个按需引入的vue组件库
      这篇文章给大家分享的是有关webpack怎么打包一个按需引入的vue组件库的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在项目中使用vue组件库的一般姿势通过import引入,并在入口文件main.js里使用Vu...
      99+
      2023-06-29
    • webpack如何打包一个按需引入的vue组件库
      目录前言在项目中使用vue组件库的一般姿势webpack实现可按需引入的组件库接下来就是使用webpack打包调试组件库npm 发布步骤非常简单,只需4步调试组件库按需引入总结前言 ...
      99+
      2024-04-02
    • Vue组件怎么自动按需引入
      这篇文章主要为大家展示了“Vue组件怎么自动按需引入”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue组件怎么自动按需引入”这篇文章吧。在Vue中我们可以通过全局组件、局部注册的方式来使用组件...
      99+
      2023-06-22
    • Vue3怎么使用glup打包组件库并实现按需加载
      这篇文章主要介绍“Vue3怎么使用glup打包组件库并实现按需加载”,在日常操作中,相信很多人在Vue3怎么使用glup打包组件库并实现按需加载问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue3怎么使用g...
      99+
      2023-07-05
    • 利用webpack和rollup怎么对组件库进行打包
      本篇文章为大家展示了利用webpack和rollup怎么对组件库进行打包,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。webpack和rollup对比webpack算是使用程序员使用最多的打包工具,...
      99+
      2023-06-06
    • vue3怎么集成Element-plus实现按需自动引入组件
      本文小编为大家详细介绍“vue3怎么集成Element-plus实现按需自动引入组件”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue3怎么集成Element-plus实现按需自动引入组件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢...
      99+
      2023-07-02
    • vue使用element-ui按需引入时的坑怎么解决
      这篇文章主要讲解了“vue使用element-ui按需引入时的坑怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue使用element-ui按需引入时的坑怎么解决”吧!步骤:安装 e...
      99+
      2023-06-30
    • Vue一个案例引发的递归组件怎么用
      这篇文章主要介绍Vue一个案例引发的递归组件怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!信息的分类展示列表这次我们主要是实现一个信息的分类展示列表存在二级/三级的分类,如下如...
      99+
      2024-04-02
    • vue+webpack解决css引用图片打包后找不到资源文件怎么办
      这篇文章将为大家详细讲解有关vue+webpack解决css引用图片打包后找不到资源文件怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用vue打包,通过css引用...
      99+
      2024-04-02
    • React UI组件库之快速实现antd的按需引入和自定义主题
      目录React UI组件库流行的开源React UI组件库antd的基本使用antd样式按需引入antd自定义主题总结React UI组件库 流行的开源React UI组件库 mat...
      99+
      2024-04-02
    • Vue中怎么实现一个表情输入组件
      这篇文章将为大家详细讲解有关Vue中怎么实现一个表情输入组件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。html区域<template> &n...
      99+
      2024-04-02
    • vue组件引用另一个组件出现组件不显示的问题怎么解决
      这篇文章主要介绍了vue组件引用另一个组件出现组件不显示的问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue组件引用另一个组件出现组件不显示的问题怎么解决文章都会有所收获,下面我们一起来看看吧。组...
      99+
      2023-06-30
    • vue怎么实现一个单独的组件注释
      这篇文章主要介绍“vue怎么实现一个单独的组件注释”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue怎么实现一个单独的组件注释”文章能帮助大家解决问题。一个单独的组件注释写了一个组件 加了一些注释...
      99+
      2023-06-30
    • vue怎么实现打包后生成一个配置文件且可以修改IP
      本篇内容介绍了“vue怎么实现打包后生成一个配置文件且可以修改IP”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实现安装插件npm ...
      99+
      2023-07-05
    • vue项目打包之后生成一个可修改IP地址文件怎么实现
      这篇“vue项目打包之后生成一个可修改IP地址文件怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue项目打包之后生...
      99+
      2023-07-05
    • patch文件怎么打到一个目录下的所有git仓库
      这篇文章主要介绍“patch文件怎么打到一个目录下的所有git仓库”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“patch文件怎么打到一个目录下的所有git仓库”文章能帮助大家解决问题。git 将一...
      99+
      2023-07-05
    • 怎么封装一个vue中也可使用的uniapp全局弹窗组件
      这篇文章主要介绍了怎么封装一个vue中也可使用的uniapp全局弹窗组件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么封装一个vue中也可使用的uniapp全局弹窗组件文章都会有所收获,下面我们一起来看看吧...
      99+
      2023-07-05
    • Microsoft Power BI连接本地mysql 数据库 !power bi提示此连接器需要安装一个或多个其他组件才能使用怎么办!
      最终解决方案竟然是卸载8.0.33版本,下载8.0.32版本…吐血,知道真相的我眼泪掉下来 大家可以直接跳到【亲测有用——知道真相的我眼泪掉下来】这一部分。 一、步骤 (一)从菜单栏点击进入mysql数据库 点击主页>获取数据>更多 选择...
      99+
      2023-08-24
      数据库 mysql 服务器
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作