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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2important to work on, but not at the top of the work list.cost: mediumMedium engineering cost to implementdevtools-extensionsIssues related to DevTools extensions

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions