[devtools_extensions] build_and_copy ships ~14 MB of assets the extension never loads (CanvasKit variants + un-tree-shaken icon font)
- Dominant language
- Dart
- Stars
- 1.7k
- Forks
- 404
- Avg merge
- 6d 17h
- Merged PRs (30d)
- 18
Description
## 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](https://pub.dev/packages/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: #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.
Contributor guide
Research direction
Start with the implementation of `dart run devtools_extensions build_and_copy` and inspect how it invokes the Flutter web build and copies `extension/devtools/build/`. Compare the generated `flutter_bootstrap.js` references with the copied `canvaskit/` contents, including the icon-shaking flag. Done means CDN builds omit unused assets while offline builds retain the required files, and icon tree-shaking can be selected without breaking valid extensions.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- dart
- Domain
- build-system, tooling
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 52/100