import type { PluginOption } from 'vite'; import type { ArchiverPluginOptions } from '../typing'; import fs from 'node:fs'; import { join } from 'node:path'; import archiver from 'archiver'; export const viteArchiverPlugin = ( options: ArchiverPluginOptions = {}, ): PluginOption => { return { apply: 'build', closeBundle: { handler() { const { name = 'dist', outputDir = '.' } = options; setTimeout(async () => { const folderToZip = 'dist'; const zipOutputPath = join(process.cwd(), outputDir, `${name}.zip`); try { await zipFolder(folderToZip, zipOutputPath); console.log(`Folder has been zipped to: ${zipOutputPath}`); } catch (error) { console.error('Error zipping folder:', error); } }, 0); }, order: 'post', }, enforce: 'post', name: 'vite:archiver', }; }; async function zipFolder( folderPath: string, outputPath: string, ): Promise { return new Promise((resolve, reject) => { const output = fs.createWriteStream(outputPath); const archive = archiver('zip', { zlib: { level: 9 }, // 设置压缩级别为 9 以实现最高压缩率 }); output.on('close', () => { console.log( `ZIP file created: ${outputPath} (${archive.pointer()} total bytes)`, ); resolve(); }); archive.on('error', (err) => { reject(err); }); archive.pipe(output); // 使用 directory 方法以流的方式压缩文件夹,减少内存消耗 archive.directory(folderPath, false); // 流式处理完成 archive.finalize(); }); }