Browse Source
* feat: add the archiver plug-in to output dist.zip after build * chore: update envpull/4273/head
committed by
GitHub
21 changed files with 200 additions and 44 deletions
@ -0,0 +1,67 @@ |
|||
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<void> { |
|||
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(); |
|||
}); |
|||
} |
|||
Loading…
Reference in new issue