无需CI/CD!手把手教你用Webpack插件实现Vue项目一键标准化打包

问题背景

在使用 Vue CLI 进行项目打包时,生成的 dist 目录包含所有编译后的文件。为了方便部署,通常需要将 dist 目录压缩成 ZIP 文件。然而,直接使用 Webpack 打包后生成的 ZIP 文件可能会出现以下问题:

  1. 部署过程繁琐: 每次部署完后,都需要手动将文件进行压缩打包。
  2. 目录结构不一致 :人员压缩打包使用的工具,可能不同,会导致ZIP 文件解压后,dist 目录可能被包含在 ZIP 文件的根目录中,导致目录结构不一致。
  3. 命名规范不统一:人员可能并不完全遵从包名命名规范,导致不同环境下的 ZIP 文件难以区分。

解决方案

这边比较推荐的方案有两个

  1. 引入持续集成/持续部署(CI/CD)工具
    • 使用Jenkins、GitLab CI、CircleCI等工具来自动执行构建和打包任务,保证每次构建的结果都是一致的。
    • CI/CD 工具还可以用来运行测试,确保代码质量并防止不符合规范的代码进入主分支。
  1. 使用脚本自动化打包过程
    • 编写脚本来自动完成打包过程,确保每次打包的一致性。可以使用批处理脚本(Windows)、Shell脚本(Linux/Mac)或构建工具如Ant、Maven、Gradle等。
    • 脚本应该能够根据规范创建正确的目录结构,并按照命名规则生成ZIP文件。

两个方案中,还是比较推荐CICD自动化部署的,CI/CD自动化部署通过实现代码变更的自动构建、测试和发布,显著加快了软件交付速度,同时提高了软件质量和稳定性,降低了人为错误的风险,并使得团队能够更频繁地安全更新产品,从而快速响应用户需求和市场变化,增强了整体开发效率和竞争力。

只可惜这边开发,是内网环境,开发环境和生产环境是隔离开的,使用不了这些工具。所以选择了第二种方案进行解决。

为了解决上述问题,我们可以使用 zip-webpack-plugin 插件。该插件可以自定义 ZIP 文件的输出路径、文件名以及压缩内容,从而确保生成的 ZIP 文件结构一致且命名规范统一。

步骤

步骤 1:安装 zip-webpack-plugin

首先,需要安装 zip-webpack-plugin 作为开发依赖。

sql 复制代码
For Webpack 4 / 5:
npm install zip-webpack-plugin --save-dev

For Webpack 3:
npm install zip-webpack-plugin@2.0.0 --save-dev

步骤 2:配置 vue.config.js

  1. 配置 vue.config.js
    vue.config.js 文件中,你需要配置 configureWebpackchainWebpack 来添加 zip-webpack-plugin 插件。以下是使用 configureWebpack 的示例:
arduino 复制代码
const ZipPlugin = require('zip-webpack-plugin');

module.exports = {
  // 其他配置...
  configureWebpack: (config) => {
    const plugins = [];

    if (process.env.NODE_ENV === 'production') {
      // 其他生产环境配置...
      
      plugins.push(
        new ZipPlugin({
          path: path.join(__dirname, './'), // 输出路径
          filename: 'dist.zip', // 输出文件名
          extension: 'zip', // 文件扩展名
        })
      )

    } else {
      config.devtool = 'eval-source-map';
    }

    config.plugins = [...config.plugins, ...plugins];
  }
};

按照上面的步骤,即可实现打包编译后,自动将编译的文件打包成zip

如果您有定制化需求,可以自行调整配置。例如:将打包后的dist进行压缩并输出到distZip里,解压后第一层是dist,命名规范:项目名称_环境_日期_时间

例:

javascript 复制代码
const ZipPlugin = require('zip-webpack-plugin');
const isProduction = ['production'].includes(process.env.NODE_ENV)
let { name } = require('./package.json')

module.exports = {
  // 其他配置...
  configureWebpack: (config) => {
    const plugins = [];

    // 只有生产环境才需要进行压缩
    if (isProduction) {
      // 其他生产环境配置...

      // 将打包文件压缩成zip包,方便发布上线
      const currentDate = new Date()
      const year = currentDate.getFullYear()
      const month = String(currentDate.getMonth() + 1).padStart(2, '0')
      const day = String(currentDate.getDate()).padStart(2, '0')
      const hours = String(currentDate.getHours()).padStart(2, '0')
      const minutes = String(currentDate.getMinutes()).padStart(2, '0')
      const environment = process.env.VUE_APP_BUILD_ENV || process.env.NODE_ENV
      plugins.push(
        new ZipPlugin({
          path: path.join(__dirname, 'distZip'), // 输出路径
          filename: `${name}_${environment}_${year}${month}${day}_${hours}${minutes}.zip`, // 输出文件名
          extension: 'zip', // 文件扩展名
          // 确保 dist 目录及其内容一起打包
          pathPrefix: 'dist/'
        })
      )

    } else {
      config.devtool = 'eval-source-map';
    }

    config.plugins = [...config.plugins, ...plugins];
  }
};

环境变量 文件 .env.build.prod

ini 复制代码
NODE_ENV = production
# 生产环境名称
VUE_APP_BUILD_ENV = PROD

如果不希望编译出来的文件上传到git,可以配置下.gitignore

bash 复制代码
node_modules
/dist
/distZip
  1. 构建项目:

完成上述配置后,你可以运行构建命令来生成 ZIP 文件。

arduino 复制代码
npm run build

结论

通过使用 zip-webpack-plugin,我们可以轻松地将前端打包编译后的 dist 目录压缩成 ZIP 文件,并确保生成的 ZIP 文件结构一致且命名规范统一。这不仅提高了部署的效率,还减少了因文件结构不一致导致的部署问题。希望这篇文章对你有所帮助!如果有任何问题或建议,欢迎随时交流。

相关推荐
刘发财3 小时前
弃用html2pdf.js,这个html转pdf方案能力是它的几十倍
前端·javascript·github
牛奶5 小时前
2026年大模型怎么选?前端人实用对比
前端·人工智能·ai编程
牛奶6 小时前
前端人为什么要学AI?
前端·人工智能·ai编程
Kagol8 小时前
🎉OpenTiny NEXT-SDK 重磅发布:四步把你的前端应用变成智能应用!
前端·开源·agent
GIS之路9 小时前
ArcGIS Pro 中的 notebook 初识
前端
JavaGuide9 小时前
7 道 RAG 基础概念知识点/面试题总结
前端·后端
ssshooter10 小时前
看完就懂 useSyncExternalStore
前端·javascript·react.js
格砸10 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
Live0000011 小时前
在鸿蒙中使用 Repeat 渲染嵌套列表,修改内层列表的一个元素,页面不会更新
前端·javascript·react native
柳杉11 小时前
使用Ai从零开发智慧水利态势感知大屏(开源)
前端·javascript·数据可视化