Skip to content

[devtools_extensions] build_and_copy ships ~14 MB of assets the extension never loads (CanvasKit variants + un-tree-shaken icon font) #9897

Description

@Mastersam07

Summary

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

  1. 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.
  2. 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.

Environment: devtools_extensions 0.5.1, Flutter 3.44.2 (Dart 3.12.2), macOS.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions