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