mirror of
https://github.com/home-assistant/frontend.git
synced 2026-08-17 10:32:44 +01:00
Compress with zopfli in a worker pool compress-app gzips every build artifact with zopfli, but @gfx/zopfli is synchronous WASM: it ran on the main thread, pinned a single core and blocked the event loop for the whole step, so it dominated the production build. Replace gulp-zopfli-green with an equivalent gulp transform that runs the same compressor in a pool of worker_threads sized to availableParallelism(). The compressed output is byte-identical, and @gfx/zopfli is no longer loaded on the main thread of every gulp invocation. On a 12-core machine compress-app drops from 6.98 min to 1.27 min, and the full production build from 8.87 min to 3.32 min.
19 lines
710 B
JavaScript
19 lines
710 B
JavaScript
// Worker side of the zopfli pool. @gfx/zopfli is a synchronous WASM build, so
|
|
// compressing on the main thread blocks the event loop; one instance per worker
|
|
// is what makes the work parallel.
|
|
|
|
import { parentPort } from "node:worker_threads";
|
|
import zopfli from "@gfx/zopfli";
|
|
|
|
parentPort.on("message", ({ contents, options }) => {
|
|
zopfli.gzip(contents, options, (error, result) => {
|
|
if (error) {
|
|
parentPort.postMessage({ error: error.message ?? String(error) });
|
|
return;
|
|
}
|
|
// `result` is a fresh Uint8Array copied out of the WASM heap, so it owns
|
|
// its ArrayBuffer and can be transferred instead of cloned.
|
|
parentPort.postMessage({ result }, [result.buffer]);
|
|
});
|
|
});
|