Newer
Older
Nanping_sponge_HHDP / vite / plugins / buildZip.js
@liyingjing liyingjing on 25 Oct 2023 1 KB 海绵大屏
//  直接打包成zip包

const pluginZip = function (fileName = 'NFProductTemplate', output) {
  const path = require('path');
  if (!output) output = path.resolve(__dirname, './../../NFProductTemplate');
  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;