From 53b792efaa6ea68514f6cde101c7ca7f466358b1 Mon Sep 17 00:00:00 2001 From: Arlo Vance <30844134+invisibletype@users.noreply.github.com> Date: Wed, 14 Oct 2026 15:51:37 -0400 Subject: [PATCH] fix(publisher): minify published runtime script bundles Published module bundles carry their npm dependencies, and esbuild ran without minify, so GSAP alone shipped at ~170 kB. Publish builds are now minified (GSAP: 170 kB to 71 kB, 28 kB gzipped). Canvas builds stay unminified for their inline source maps; classic scripts are still emitted byte-for-byte. Co-Authored-By: Claude Opus 5.5 (1M context) --- .../__tests__/runtime-bundle-scripts.test.ts | 35 +++++++++++++++++++ server/publish/runtime/bundleScripts.ts | 4 +++ 2 files changed, 39 insertions(+) diff --git a/server/__tests__/runtime-bundle-scripts.test.ts b/server/__tests__/runtime-bundle-scripts.test.ts index c89bfa0e7..11f325c15 100644 --- a/server/__tests__/runtime-bundle-scripts.test.ts +++ b/server/__tests__/runtime-bundle-scripts.test.ts @@ -86,4 +86,39 @@ describe('buildSiteRuntimeScripts', () => { expect(result.runtimeAssets.scripts[0].format).toBe('classic') expect(result.runtimeAssets.scripts[0].src).toContain('/_instatic/assets/version-1/classic/') }) + + it('minifies module bundles for publish but not for the canvas', async () => { + const page = makeRuntimePage() + const site = makeRuntimeSite(page) + site.files = [{ + id: 'motion', + path: 'scripts/motion.ts', + type: 'script', + content: [ + '// motion setup', + 'const readableName = document.documentElement', + 'readableName.dataset.ready = "yes"', + ].join('\n'), + createdAt: 1, + updatedAt: 1, + }] + site.runtime.scripts = { motion: { ...DEFAULT_SCRIPT_RUNTIME_CONFIG } } + + const build = (target: 'publish' | 'canvas') => buildSiteRuntimeScripts({ + site, + page, + target, + assetBasePath: '/_instatic/assets/version-1/', + }) + const entryContent = (result: Awaited>) => + result.files.find((file) => file.path.includes('entries/'))?.content ?? '' + + const published = entryContent(await build('publish')) + const canvas = entryContent(await build('canvas')) + + expect(published).toContain('dataset.ready="yes"') + expect(published).not.toContain('readableName') + expect(published).not.toContain('// motion setup') + expect(canvas).toContain('readableName') + }) }) diff --git a/server/publish/runtime/bundleScripts.ts b/server/publish/runtime/bundleScripts.ts index 8f513e19f..1394cafcb 100644 --- a/server/publish/runtime/bundleScripts.ts +++ b/server/publish/runtime/bundleScripts.ts @@ -372,6 +372,10 @@ export async function buildSiteRuntimeScripts( format: 'esm', logLevel: 'silent', metafile: true, + // Published bundles carry their npm dependencies (GSAP alone is ~170 kB + // unminified), so publish output is minified. Canvas builds stay + // readable for the inline source maps below. + minify: input.target === 'publish', nodePaths: [ ...( input.dependencyCache?.nodeModulesDir