前言:开发环境没接jenkins,每次打完包后需要手动压缩上传服务器再解压,体验比较差,因此打算写个自动部署的脚本,在这之前呢,需要对我们打包后的文件做个压缩。

jszip

这里用到的库是jszip,主要就三个关键方法:

  • const zip = new JSZIP():我们需要新建一个实例,这个实例保存着需要压缩的数据和目录结构
  • zip.generateAsync:返回一个promise,then的参数就是压缩后的内容,可以通过fs.writeFile写成zip文件。参数是一个对象

    {
        type: 'nodebuffer',
        compression: 'DEFLATE', //压缩算法
        compressionOptions: {
            level: 9 //压缩等级
        }
    }
  • zip.folder:如果是一个文件夹,需要用这个方法生成zip文件中对应的文件夹
  • zip.file:压缩一个文件

举个例子:打包后的文件在根目录下的prod文件夹中,在根目录下新建一个zip.js,具体代码如下

const path = require('path');
const JSZIP = require('jszip');
const fs = require('fs');

const zip = new JSZIP();

pushZip(zip, path.resolve(__dirname, './prod'));
zip.generateAsync({
    type: 'nodebuffer',
    compression: 'DEFLATE',
    compressionOptions: {
        level: 9
    }
}).then(function(content) {
    fs.writeFile(path.resolve(__dirname, './prod/XX.zip'), content, err => {
        if (err) throw err;
        console.log('文件已被保存');
    });
});

function pushZip(floder, pPath) {
    const files = fs.readdirSync(pPath, {withFileTypes: true});
    files.forEach((dirent, index) => {
        let filePath = `${pPath}/${dirent.name}`;
        if (dirent.isDirectory()) {
            let zipFloder = zip.folder(filePath.replace(`${__dirname}\\prod/`, ''));
            pushZip(zipFloder, filePath);
        } else {
            floder.file(dirent.name, fs.readFileSync(filePath));
        }
    });
}

执行node zip.js即可看到prod文件夹中多了一个XX.zip文件


布列瑟农的星空
1.4k 声望18 粉丝