diff --git a/package.json b/package.json index bd0b5ce0932..3dc91e972e1 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ }, "./package.json": "./package.json" }, + "sideEffects": false, "homepage": "https://emberjs.com/", "bugs": { "url": "https://github.com/emberjs/ember.js/issues" diff --git a/rollup.config.mjs b/rollup.config.mjs index ceee7e37ab1..6adf95e4b15 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -100,6 +100,9 @@ function sharedESMConfig({ input, debugMacrosMode, includePackageMeta = false }) return { onLog: handleRollupWarnings, input, + treeshake: { + moduleSideEffects: moduleHasSideEffects, + }, output: { format: 'es', dir: outputDir, @@ -111,6 +114,18 @@ function sharedESMConfig({ input, debugMacrosMode, includePackageMeta = false }) }; } +// `@glimmer/debug` declares `sideEffects: false` in its own package.json, +// but rolldown loses that signal when files from it get co-bundled into +// shared chunks alongside non-pure code. Re-asserting purity at the +// chunk-level callback recovers ~8 KB raw on the hello-world bundle by +// letting unused imports of `@glimmer/debug` content drop out of those +// chunks. Add other packages here only after measuring an actual +// reduction. +function moduleHasSideEffects(id) { + if (id.includes('/packages/@glimmer/debug/')) return false; + return true; +} + function glimmerSyntaxESM() { return { onLog: handleRollupWarnings,