- // 直接打包成zip包
-
- const pluginZip = function (fileName = 'WaterBrain', output) {
- const path = require('path');
- if (!output) output = path.resolve(__dirname, './../../WaterBrain');
- 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;