Newer
Older
Nanping_sponge / vite / plugins / buildZip.js
@liyingjing liyingjing on 25 Oct 1 KB 南平登录模块
//  直接打包成zip包

const pluginZip = function (fileName = "doorDist", output) {
  const path = require("path");
  if (!output) output = path.resolve(__dirname, "./../../doorDist");
  fileName += ".zip";
  const makeZip = function () {
    const path = require("path");
    const fs = require("fs");
    const JSZip = require("jszip");
    const zip = new JSZip();
    const distPath = path.resolve(output);
    const readDir = function (zip, dirPath) {
      // 读取dist下的根文件目录
      const files = fs.readdirSync(dirPath);
      files.forEach((fileName) => {
        const fillPath = path.join(dirPath, "./", fileName);
        const file = fs.statSync(fillPath);
        // 如果是文件夹的话需要递归遍历下面的子文件
        if (file.isDirectory()) {
          const dirZip = zip.folder(fileName);
          readDir(dirZip, fillPath);
        } else {
          // 读取每个文件为buffer存到zip中
          zip.file(fileName, fs.readFileSync(fillPath));
        }
      });
    };
    const removeExistedZip = () => {
      const dest = path.join(distPath, "./" + fileName);
      if (fs.existsSync(dest)) {
        fs.unlinkSync(dest);
      }
    };
    const zipDir = function () {
      readDir(zip, distPath);
      zip
        .generateAsync({
          type: "nodebuffer", // 压缩类型
          compression: "DEFLATE", // 压缩算法
          compressionOptions: {
            // 压缩级别
            level: 9,
          },
        })
        .then((content) => {
          const dest = path.join(distPath, "../" + fileName);
          removeExistedZip();
          // 把zip包写到硬盘中,这个content现在是一段buffer
          fs.writeFileSync(dest, content);
        });
    };
    removeExistedZip();
    zipDir(distPath);
  };
  return {
    name: "vite-plugin-auto-zip",
    apply: "build",
    closeBundle() {
      makeZip();
    },
  };
};
module.exports = pluginZip;