flutter / flutter/devtools

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

Aperta
#9,897 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub
cost: medium devtools extensions P2
Lingua principale
Dart
Stelle
1.7k
Fork
404
Merge medio
6g 17h
PR unite (30g)
18

Descrizione

## 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.

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

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.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
dart
Ambito
build-system, tooling
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Tranquilla
Chiarezza
Abbastanza chiara
Idoneità per principianti
52/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.