Precompress ExifTool WASM with Brotli and serve via nginx brotli_static.

Tor first loads drop from ~25 MB raw to ~5 MB on the wire; prod build writes .wasm.br sidecars and Alpine nginx serves them under /assets with long-lived cache.
This commit is contained in:
2026-10-30 23:32:16 +01:00
parent a5f6afdc22
commit 32cd1bdb9e
5 changed files with 49 additions and 5 deletions
+1
View File
@@ -8,6 +8,7 @@
"build": "vue-tsc -b && vite build",
"preview": "vite preview",
"test": "vitest run",
"optimize-dist-wasm": "node scripts/optimize-dist-wasm.mjs",
"postinstall": "node patches/patch-exiftool-stderr.mjs && node patches/patch-zeroperl-worker-fetch.mjs"
},
"dependencies": {
+32
View File
@@ -0,0 +1,32 @@
import { brotliCompressSync, constants as zlibConstants } from 'node:zlib';
import { readdirSync, readFileSync, writeFileSync } from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const distAssetsDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../dist/assets');
const brotliOptions = {
params: {
[zlibConstants.BROTLI_PARAM_QUALITY]: 11,
[zlibConstants.BROTLI_PARAM_LGWIN]: 24
}
};
const wasmFiles = readdirSync(distAssetsDir).filter(name => name.endsWith('.wasm'));
if (wasmFiles.length === 0) {
console.error('optimize-dist-wasm: no .wasm files in dist/assets');
process.exit(1);
}
console.log('optimize-dist-wasm: brotli sidecars for', wasmFiles.length, 'file(s)');
for (const fileName of wasmFiles) {
const wasmPath = path.join(distAssetsDir, fileName);
console.log('optimize-dist-wasm: brotli', wasmPath);
const compressed = brotliCompressSync(readFileSync(wasmPath), brotliOptions);
console.log('optimize-dist-wasm: compressed', compressed.length);
writeFileSync(`${wasmPath}.br`, compressed);
}