通过gulp+vite搭建vue3组件库

本文详细介绍了如何通过vite搭建运行环境,利用gulp执行编译流程,编译Vue3组件代码,编写、测试及打包组件,并最终上传到npm。组件库支持全量和按需引入,兼容Vue2和Vue3。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

核心要点

  • 通过 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、附加说明

### Webpack、GulpVite 的主要区别与适用场景 #### 1. **Webpack** Webpack 是一种模块打包器,主要用于现代 JavaScript 应用程序的构建。它通过将各种静态资源视为模块并将其组合成一个或多个 bundle 文件来优化前端项目的性能。 - 它支持复杂的依赖关系处理以及插件扩展机制[^1]。 - 对于 Vue 或 React 这样的单页面应用程序 (SPA),Webpack 提供了足够的功能来满足开发需求。 - 如果遇到特定的功能缺失(如雪碧图生成),可以与其他工具(如 Gulp)集成以弥补不足。 ```javascript // Webpack 配置文件示例 const path = require('path'); module.exports = { entry: './src/index.js', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') }, module: { rules: [ { test: /\.css$/, use: ['style-loader', 'css-loader'] } ] } }; ``` #### 2. **Gulp** Gulp 是一款基于流的任务运行器,适合用于自动化重复性的任务,比如压缩 CSS/JS 文件、图片优化或者代码 linting 等操作。 - 虽然其核心并不涉及模块打包,但它可以通过管道的方式高效完成多种预处理工作,并且经常被用来补充像 Webpack 这样更专注于模块化的工具所无法覆盖的部分。 - 当需要执行一些简单的脚本转换而无需复杂配置时,单独使用 Gulp 可能更加轻便快捷[^2]。 ```javascript // Gulp 示例 const gulp = require('gulp'); const sass = require('gulp-sass')(require('sass')); function compileSASS() { return gulp.src('./scss/**/*.scss') // 获取 SCSS 文件路径 .pipe(sass().on('error', sass.logError)) // 编译 SASS 到 CSS .pipe(gulp.dest('./css')); // 输出到目标目录 } exports.default = compileSASS; ``` #### 3. **Vite** 作为新一代快速冷启动开发服务器解决方案之一,Vite 借助原生 ES Module 导入特性显著提升了初始加载效率,在大型项目中有明显优势。 - 尽管起步迅速且拥有良好生态支持,但由于发展时间较短加上部分高级特性和稳定性尚待完善等原因,暂时还不足以全面取代成熟稳定的 Webpack 成为主流选择[^3]。 - 特别是在非 Vue 生态圈外的应用场合下,Vite 的普及程度相对较低,更多时候充当实验性质的新技术尝试点角色存在。 --- ### 总结对比表 | 功能维度 | Webpack | Gulp | Vite | |----------------|----------------------------------|-----------------------------------|------------------------------------| | 工具定位 | 模块打包 | 自动化任务运行 | 开发环境加速 | | 学习曲线 | 较陡峭 | 平坦 | 中等 | | 社区活跃度 | 极高 | 减少但仍广泛 | 新兴但增长迅猛 | | 启动速度 | 相对慢 | 不影响启动 | 明显更快 | ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值