给package.json增加自动压缩功能(本地化的时候会很有用)

614 阅读1分钟

当我们需要做项目本地化的时候,往往要做很机械枯燥的一步:把打包输出的文件 压缩并用一个特定的名字进行重命名,手动做当然没问题,但次数多了就容易烦躁。所以我写了个小工具,把这个操作用代码实现。

思路很简单,利用nodejs + jszip对文件夹进行打包。所以需要在项目中执行    npm install jszip 。 安装成功后,在放webpack的文件夹中写一个js文件,因为本质上这也是打包的一种操作,所以和webpack文件放一起。内容如下 

const [fs, JSZip] = [require('fs'), require('jszip')];
const zip = new JSZip();
//读取所有参数, 把folderName 压缩为 targetName.zip
var args = process.argv.splice(2);
const [folderPath, targetName] = args;

//这个zip对象并不能直接指定一个文件夹就能用了,它需要递归搜索所有文件,使用zip.file zip.folder来收集文件
function readDir(obj, nowPath) {
    let files = fs.readdirSync(nowPath);
    files.forEach(fileName => {
        let fillPath = `${nowPath}/${fileName}`;
        let file = fs.statSync(fillPath);
        if (file.isDirectory()) {
            let dirList = obj.folder(fileName);
            readDir(dirList, fillPath);
        } else {
            obj.file(fileName, fs.readFileSync(fillPath));
        }
    })
}

//递归收集文件列表
readDir(zip.folder(`${folderPath}`), `./${folderPath}`);
//生成压缩文件的数据,并写入磁盘
zip.generateAsync({
    type: 'nodebuffer',
    compression: "DEFLATE",
    compressionOptions: {
        level: 9
    }
}).then(content => fs.writeFileSync(`./${targetName}` , content , 'utf-8'));

该代码可以直接运行。通过输入 node zip-build.js 要压缩的文件夹名 想要压缩成的文件名 然后再package.json里面对其进行定制化,比如 

{
  "name": "一个测试的项目",
  "version": "0.1.0",
  "private": true,
  "main": "zip-build.jjs.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "doZip": "node zip-build.js dist output.zip"  
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "description": "",
  "dependencies": {
    "jszip": "^3.6.0",
    "webpack": "^5.36.0"
  }
}

这样就可以很方便的用命令直接压缩了。demo文件如下