diff --git a/global/scripts/compress-dist.mjs b/global/scripts/compress-dist.mjs new file mode 100644 index 0000000..a427497 --- /dev/null +++ b/global/scripts/compress-dist.mjs @@ -0,0 +1,30 @@ +#!/usr/bin/env node +import { readdirSync, statSync, createReadStream, createWriteStream } from 'fs'; +import { join } from 'path'; +import { createGzip, createBrotliCompress, constants } from 'zlib'; +import { pipeline } from 'stream/promises'; + +const COMPRESS_EXT = ['.html', '.js', '.css', '.xml', '.json', '.svg']; + +function walk(dir) { + const results = []; + for (const f of readdirSync(dir)) { + const p = join(dir, f); + if (statSync(p).isDirectory()) results.push(...walk(p)); + else if (COMPRESS_EXT.some(e => f.endsWith(e))) results.push(p); + } + return results; +} + +let gz = 0, br = 0; +for (const file of walk('dist')) { + await pipeline(createReadStream(file), createGzip({ level: 9 }), createWriteStream(`${file}.gz`)); + gz++; + await pipeline( + createReadStream(file), + createBrotliCompress({ params: { [constants.BROTLI_PARAM_QUALITY]: 11 } }), + createWriteStream(`${file}.br`) + ); + br++; +} +console.log(`[compress] gzip: ${gz} files, brotli: ${br} files`);