You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
dart run devtools_extensions build_and_copy produces extension builds that are CDN-configured (the default for flutter build web), yet copies the entire local canvaskit/ directory — every engine variant plus debug symbols — into extension/devtools/build/, and hardcodes --no-tree-shake-icons. The result is ~14 MB of published assets per package that the extension never fetches at runtime.
Since the extension build is published inside each package's pub archive, every package that ships a DevTools extension carries this weight, and every consumer downloads it on pub get.
Evidence
My package (kaisel): archive was 15 MB. After pruning build/canvaskit/ and rebuilding with icon tree-shaking, it is 1 MB, with no runtime behavior
change:
flutter_bootstrap.js in the build references gstatic.com/flutter-canvaskit, so the local canvaskit/ files (canvaskit.wasm 6.9 MB, chromium/ 5.5 MB, skwasm_heavy 4.9 MB, experimental_webparagraph/ 3.9 MB, skwasm 3.4 MB, plus ~7 MB of .js.symbols) are never requested.
The build is compileTarget: dart2js, so the skwasm* variants are unreachable regardless of CDN configuration.
Rebuilding without --no-tree-shake-icons succeeds — the compiler's own verification passed (it fails the build on non-const IconData) — and MaterialIcons went from 1,645,184 bytes to 9,040 bytes (99.5%).
Proposal
Prune build/canvaskit/ in the copy step when the build is CDN-configured (the default). At minimum, always prune the skwasm* / experimental variants for dart2js builds, where they are unreachable. If an author builds with --no-web-resources-cdn (e.g. for offline use — related: DevTools fails to load with no internet connection #4721), keep canvaskit.wasm + chromium/canvaskit.wasm and drop only the unreachable variants and .js.symbols.
Expose a --tree-shake-icons passthrough (keeping today's --no-tree-shake-icons as the default if desired). Tree-shaking is verified at compile time — it fails loudly when an extension constructs IconData dynamically — so extensions that pass the check could opt into the ~1.6 MB saving safely.
Summary
dart run devtools_extensions build_and_copyproduces extension builds that are CDN-configured (the default forflutter build web), yet copies the entire localcanvaskit/directory — every engine variant plus debug symbols — intoextension/devtools/build/, and hardcodes--no-tree-shake-icons. The result is ~14 MB of published assets per package that the extension never fetches at runtime.Since the extension build is published inside each package's pub archive, every package that ships a DevTools extension carries this weight, and every consumer downloads it on
pub get.Evidence
My package (kaisel): archive was 15 MB. After pruning
build/canvaskit/and rebuilding with icon tree-shaking, it is 1 MB, with no runtime behaviorchange:
flutter_bootstrap.jsin the build referencesgstatic.com/flutter-canvaskit, so the localcanvaskit/files (canvaskit.wasm 6.9 MB, chromium/ 5.5 MB, skwasm_heavy 4.9 MB, experimental_webparagraph/ 3.9 MB, skwasm 3.4 MB, plus ~7 MB of.js.symbols) are never requested.compileTarget: dart2js, so theskwasm*variants are unreachable regardless of CDN configuration.--no-tree-shake-iconssucceeds — the compiler's own verification passed (it fails the build on non-constIconData) — and MaterialIcons went from 1,645,184 bytes to 9,040 bytes (99.5%).Proposal
build/canvaskit/in the copy step when the build is CDN-configured (the default). At minimum, always prune theskwasm*/ experimental variants for dart2js builds, where they are unreachable. If an author builds with--no-web-resources-cdn(e.g. for offline use — related: DevTools fails to load with no internet connection #4721), keepcanvaskit.wasm+chromium/canvaskit.wasmand drop only the unreachable variants and.js.symbols.--tree-shake-iconspassthrough (keeping today's--no-tree-shake-iconsas the default if desired). Tree-shaking is verified at compile time — it fails loudly when an extension constructsIconDatadynamically — so extensions that pass the check could opt into the ~1.6 MB saving safely.Environment: devtools_extensions 0.5.1, Flutter 3.44.2 (Dart 3.12.2), macOS.