通过gulp+vite搭建vue3组件库

news2025/1/23 12:05:21

核心要点

  • 通过 vite 搭建运行环境
  • 通过 gulp 执行编译流程
  • 通过 vite 编译组件代码
  • 编写 组件
  • 测试 组件
  • 打包 编译组件
  • 上传 npm

1、通过 vite 搭建运行环境

这里主要是创建一个可以运行的测试的组件的环境,全局安装vite脚手架,并初始化项目

npm create vite@latest  mtt-component-vite -- --template vue

修改文件夹名称和基本配置的修改

在这里插入图片描述

2、通过 gulp 执行编译流程

安装gulp执行流程中所需要用到的插件

npm install -D  gulp@4.0.2 fs-extra@11.1.0 cross-spawn@7.0.3 sass gulp-sass gulp-postcss autoprefixer@9.8.6

在根目录的build文件底下创建一个gulpfile.js的文件

//gulpfile.js
const gulp = require('gulp');//执行流程
const fs = require('fs-extra');//该插件主要用于操作文件
const spawn = require('cross-spawn');//该插件主要用于运行终端命名
const sass = require('gulp-sass')(require('sass'));//该插件用于将sass编译成css
const postcss = require('gulp-postcss');//该插件处理css
const autoprefixer = require('autoprefixer');//该插件为css自动加前缀
const {pathDist, pathPackagesStyles} = require('./path.config.js');//公共路径配置

//清空组件文件
gulp.task('cleanComponents', done => {
  fs.removeSync(`${pathDist}/cjs`);
  fs.removeSync(`${pathDist}/es`);
  fs.removeSync(`${pathDist}/umd`);
  fs.removeSync(`${pathDist}/styles`);
  done();
});

//打包编译css
gulp.task('buildStyles', done => {
  gulp.src(`${pathPackagesStyles}/**/*.scss`)
      .pipe(sass().on('error', sass.logError))
      .pipe(postcss([
        autoprefixer({
          overrideBrowserslist: [
            'last 2 version',
            '>1%',
            'ios 7'
          ]
        })
      ]))
      .pipe(gulp.dest(`${pathDist}/styles`));
  done();
});

//构建组件
gulp.task('buildComponents', done => {
  spawn.sync('npm run build:vite', [], {stdio: 'inherit'});
  done();
});

//gulp执行流程
gulp.task('default', gulp.series(['cleanComponents', 'buildStyles', 'buildComponents'], done => {
  console.log('编译成功');
  done();
}));

3、通过 vite 编译组件代码

在根目录的build文件底下创建一个vite.build.js的文件

// vite.build.js
const path = require('path');
const {build, defineConfig} = require('vite');
const vue = require('@vitejs/plugin-vue');//用于处理 .vue文件,针对vue3的文件
const autoprefixer = require('autoprefixer');//该插件为css自动加前缀
const {pathDist} = require('./path.config.js');//公共路径配置
const {getPackageFiles} = require('./utils.js');//获得所有组件路径及名称

// 所有组件列表
const arrayComponents = getPackageFiles();

// 基础配置
const configBaseVite = {
  configFile: false,
  publicDir: false,
  cssCodeSplit: true,
  plugins: [
    vue({
      style: {
        css: true,
        compileTemplate: true,
        postcssPlugins: [autoprefixer({
          overrideBrowserslist: [
            'last 2 version',
            '>1%',
            'ios 7'
          ]
        })]
      }
    })
  ]
};

// 基础配置- rullup
const configBaseRollup = {
  external: ['vue'],
  output: {
    globals: {
      vue: 'Vue',
    },
  },
};

// 全量构建
const buildIndex = async (format) => {
  await build({
    ...configBaseVite,
    build: {
      rollupOptions: configBaseRollup,
      lib: {
        entry: arrayComponents[0].inputPath,
        name: 'index',
        fileName: format => `[name].js`,
        formats: [format]
      },
      outDir: path.resolve(pathDist, format)
    }
  });
};

// 单个组件构建
const buildSingle = async (item, format) => {
  await build({
    ...configBaseVite,
    build: {
      rollupOptions: configBaseRollup,
      lib: {
        entry: item.inputPath,
        name: 'index',
        fileName: format => `[name].js`,
        formats: [format]
      },
      outDir: path.resolve(pathDist, `${format}/${item.outputPath}`)
    }
  });
};

// 总打包入口
const buildDist = async () => {
  const formatArray = ['es', 'cjs', 'umd'];
  const childComponents = arrayComponents.slice(1, arrayComponents.length);
  for (let format of formatArray) {
    await buildIndex(format);
    if (format === 'umd') {
      continue;
    }
    for (let item of childComponents) {
      await buildSingle(item, format);
    }
  }
  return defineConfig({
    mode: 'production'
  });
};

buildDist()

4、编写组件

借助chatgpt编写了个简单的button组件

在这里插入图片描述

然后,在button文件夹下,建立一个index.js,用于导出单个组件

import button from './button.vue'

// 为组件提供 install 安装方法,供按需引入
button.install = function (Vue) {
  Vue.component(button.name, button)
}

// 默认导出组件
export default button

然后,在components的根目录下,建立一个index.js,该文件用于导出所有组件

// 导入按钮
import MttButton from './button'

// 存储组件列表
const components = [
  MttButton
]

// 定义 install 方法,接收 Vue 作为参数。如果使用 use 注册插件,则所有的组件都将被注册
const install = function (Vue) {
  // 判断是否安装
  if (install.installed) return
  // 遍历注册全局组件
  components.map(component => Vue.component(component.name, component))
}

// 判断是否是直接引入文件
if (typeof window !== 'undefined' && window.Vue) {
  install(window.Vue)
}

export default {
  // 导出的对象必须具有 install,才能被 Vue.use() 方法安装
  install,
  // 以下是具体的组件列表
  MttButton
}

5、测试组件

在业务端引入组件

在这里插入图片描述

运行到浏览器,运行成功了,得出了预期的结果

在这里插入图片描述

6、打包编译组件

终端运行打包命令

 npm run build

打包完后,得到dist目录下的打包后的代码,为了方便测试,我们先不上传到npm,而是通过npm link软连接的方式,引入组件再次测试,得到一样的结果

在这里插入图片描述

7、上传 npm

配置 package.json,通过npm publish即可上传至npm,要注意的事,上传npm时,不要用淘宝镜像,切换npm自身的镜像,否则会有10分钟的延迟

在这里插入图片描述

到npm官网查看下,发现我们的发布的组件库已经成功了

在这里插入图片描述

8、附加说明

  • 该组件库可以支持全量引入和按需引入,关于按需引入方面,可以参考 element的按需引入方式
  • 目前该组件库的基础架构既可以针对vue2开发,也可以针对vue3进行组件库开发
  • 另外也写了一篇 通过 Gulp+Rollup 从零到一搭建前端组件库的文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/514507.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简单两步创建nVisual建筑场景

nVisual是一款网络基础设施可视化管理软件,通过模型可规划即将建设的机房效果,或者将已有的机房场景复刻至系统中,便于运维管理者清晰的了解机房设备及线缆路由连接关系。 数据初始我们需要将数据中心场景复刻至系统中,建筑场景也…

meta标签复习总结

文章目录 前言一、用在哪里二、用途1.charset2.http-equiv3.name4.content5.keywords 前言 我们往往忽视&#xff0c;却又很重要的一个标签&#xff0c;meta&#xff0c;它在页面细节上面还提供了不小的作用。 一、用在哪里 先来看看它用法 <!DOCTYPE html> <html …

union和位域的混合使用

1、union&#xff08;共用体&#xff09; 1.1、概述 C 语言中&#xff0c;union是一种数据类型&#xff0c;对比于结构体&#xff0c;结构体中的每个成员都占用独立的内存空间&#xff0c;而联合中所有的成员都共享同一个内存空间。 也就是说&#xff0c;union中的不同成员要…

Android WebRTC+SRS/ZLM视频通话(5):Android使用WebRTC从SRS/ZLMediaKit拉流

Android WebRTCSRS/ZLM视频通话&#xff08;5&#xff09;&#xff1a;Android使用WebRTC从SRS/ZLMediaKit拉流 来自奔三人员的焦虑日志 接着上一章内容&#xff0c;继续来记录Android是如何使用WebRTC从SRS/ZLMediaKit拉流播放。WebRTC是一种实现实时音视频通信的技术&#xf…

三分钟教你如何定义自己的ChatGPT

三分钟教你如何定义自己的ChatGPT 成品预览材料准备MyChatGPT自定义AI 成品预览 材料准备 总共有两种方式&#xff1a; 一种是使用自己的OpenAI账号&#xff0c;这种方式是可控性比较强&#xff0c;同时也会有很多问题&#xff0c;比如你需要准备国外的手机号和Visa卡&#x…

目标检测论文总结

文章目录 1.目标检测论文123456789101112131415161718192021**22****25**2627 总结改进思路 1.目标检测论文 EI https://www.engineeringvillage.com/search/quick.url 其他 A YOLOv3-based Deep Learning Application Research for Condition Monitoring of Rail Thermite …

极客公园对话 Zilliz 星爵:大模型时代,需要新的「存储基建」

大模型在以「日更」进展的同时&#xff0c;不知不觉也带来一股焦虑情绪&#xff1a;估值 130 亿美元的 AI 写作工具 Grammarly 在 ChatGPT 发布后网站用户直线下降&#xff1b;AI 聊天机器人独角兽公司 Character.AI 的自建大模型在 ChatGPT 进步之下&#xff0c;被质疑能否形成…

外观、装饰、策略模式代码详解-软件设计(七十二)

真题详解&#xff08;索引长度计算&#xff09;-软件设计&#xff08;七十一)https://blog.csdn.net/ke1ying/article/details/130590260 外观模式 解析&#xff1a; public String getName()public void dispose(Patient patient)new ConcreteOatient(“name”)Facadenew Fa…

UPF问题解决

UPF配置文件内容解析 NWI Network Instance of the interface 结果调查&#xff0c;对upf网元配置文件进行了如下修改 将 - IF_2_NWIaccess.oai.org改为 - IF_2_NWIaccess3.oai.org 将 - IF_2_NWIaccess.oai.org改为 - IF_2_NWIaccess3.oai.org 然后两核心网接入了两个基站启…

Apache Doris 2.0 冷热分离快速体验

概述 对于任何一种数据库类软件来说&#xff0c;无论其基于传统数据库模型还是基于分布式结构&#xff0c;作为核心的永远是数据本身。而数据的生命周期&#xff0c;则体现在CRUD操作&#xff08;创建、查询、更新、删除&#xff09;上。任何一条数据从其生成的时刻开始&#…

程序设计语言与语言处理程序基础

目录 第七章、程序设计语言与语言处理程序基础1、编译与解释2、文法3、正规式 4、有限自动机5、表达式 6、传值与传址 7、多种程序语言特点 第七章、程序设计语言与语言处理程序基础 1、编译与解释 编译器是将整个高级语言程序一次性转化成目标机器的机器代码&#xff0c;编译…

Xcode安装ipa

iOS APP上架App Store其中一个步骤就是要把ipa文件上传到App Store&#xff01;​ 下面进行步骤介绍&#xff01;​ 利用Appuploader这个软件&#xff0c;可以在Windows、Linux或Mac系统中申请ios和上传IPA到App Store Connect。​ 非常的方便&#xff0c;没有Mac也可以用Ap…

手游反外挂方案解析

据中国音数协游戏工委发布的《2023年1—3月游戏产业报告》显示&#xff0c;2023年1—3月&#xff0c;中国移动游戏市场实际销售收入为486.94亿元&#xff0c;占游戏市场整体实际销售收入的72.12% &#xff0c;虽然数据同比去年略有下滑&#xff0c;但足以证明&#xff0c;移动游…

【逆向】动态链接库

文章目录 动态链接库1. 动态链接库的定义2. 动态库的由来&#xff1a;3. Dll与ExE程序区别4. DLL导出5. DLL导入6. 静态库 动态链接库 1. 动态链接库的定义 动态链接库英文DLL&#xff0c;是Dynamic Link Libarary的缩写。Dll中包含若干公用的代码、数据等&#xff0c;可供其他…

如何搭建在线产品手册

在现代社会&#xff0c;随着科技的发展&#xff0c;越来越多的企业将目光投向互联网&#xff0c;并将自己的产品推向了线上。而对于这些线上产品&#xff0c;拥有一份完备的、易用、高质量的在线产品手册显得尤为重要。 那么如何才能搭建一份高质量且易用的在线产品手册呢&…

《Android性能优化》学习笔记—启动优化

为什么要做App的启动优化&#xff1f; 网页端存在的一个定律叫8秒定律&#xff1a;即指用户访问一个网站时&#xff0c;如果等待打开的时间超过8秒&#xff0c;超过70%的用户将会放弃等待。 同样的&#xff0c;移动端也有一个8秒定律&#xff1a;如果一个App的启动时间超过8秒…

UNIAPP实战项目笔记66 当前用户更改购物车商品数量的前端和后端交互

UNIAPP实战项目笔记66 当前用户更改购物车商品数量的前端和后端交互 思路 前端改变数量的时候将数据发送到后端 后端接收到数据后更改数据库中的数据 案例截图 代码 前端代码 cart.js export default{state:{list:[/* {id:1,name:"332经济法能聚聚会技能大赛 经济法能聚…

vmware15+ubuntu+AS

一、VMware Workstation 与 Device/Credential Guard 不兼容 安装VMware15后&#xff0c;在运行启动ubuntu时一直提示与Device/Credential Guard不兼容 1、WINR打开运行&#xff0c;输入services.msc&#xff1b; 2、服务中找 HV主机服务&#xff0c;双击打开设置改为禁用&am…

【Python入门篇】——Python中判断语句(if elif else语句,判断语句的嵌套与实战案例)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; Python入门&#xff0c;本专栏主要内容为Python的基础语法&#xff0c;Python中的选择循环语句…

Day3--C高级3

一.编写一个名为myfirstshell.sh的脚本&#xff0c;它包括以下内容。 1、包含一段注释&#xff0c;列出您的姓名、脚本的名称和编写这个脚本的目的 2、和当前用户说“hello 用户名” 3、显示您的机器名 hostname 4、显示上一级目录中的所有文件的列表 5、显示变量PATH和HO…