From 54ba2a9dafeb4a352eea434861cb3e42eb495ade Mon Sep 17 00:00:00 2001 From: Dustin Brett Date: Fri, 14 Mar 2025 19:33:20 -0700 Subject: [PATCH] Embed workers into index --- scripts/minifyJs.js | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/scripts/minifyJs.js b/scripts/minifyJs.js index f4ff41b3..41ffea45 100644 --- a/scripts/minifyJs.js +++ b/scripts/minifyJs.js @@ -14,6 +14,30 @@ const JS_MINIFIER_CONFIG = { sourceMap: false, }; +const workerRegEx = + /new Worker\(\w+\.\w+\(new URL\(\w+\.\w+\+\w+\.\w+\(\d+\),\w+\.\w+\)\),\{name:"(\w+)"\}\)/; + +const inlineIndexWorkers = (code) => { + const [, workerName] = code.match(workerRegEx) || []; + + if (workerName) { + const workerFilename = readdirSync( + join(OUT_PATH, "_next/static/chunks") + ).find((entry) => entry.startsWith(`${workerName}.`)); + const workerSource = readFileSync( + join(OUT_PATH, "_next/static/chunks", workerFilename) + ); + const base64Worker = Buffer.from(workerSource).toString("base64"); + + return code.replace( + workerRegEx, + `new Worker("data:application/javascript;base64,${base64Worker}",{name:"${workerName}"})` + ); + } + + return code; +}; + const minifyJsFiles = (path) => Promise.all( readdirSync(path).map(async (entry) => { @@ -24,12 +48,22 @@ const minifyJsFiles = (path) => minifyJsFiles(fullPath); } else if (extname(entry).toLowerCase() === ".js") { const js = readFileSync(fullPath); - const { code: minifiedJs, error } = await minify( + let { code: minifiedJs, error } = await minify( js.toString(), JS_MINIFIER_CONFIG ); if (!error && minifiedJs?.length > 0) { + if (entry.startsWith("index-")) { + const changedCode = inlineIndexWorkers(minifiedJs); + + if (minifiedJs === changedCode) { + throw new Error("Inlining worker failed!"); + } + + minifiedJs = changedCode; + } + writeFileSync(fullPath, minifiedJs); } }