// 直接打包成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;