flutter / flutter/devtools

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

Ouverte
#9,897 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
cost: medium devtools extensions P2
Langage dominant
Dart
Étoiles
1.7k
Forks
404
Merge moyen
6 j 17 h
PR mergées (30 j)
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.

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

Commencez par l’implémentation de `dart run devtools_extensions build_and_copy` et examinez comment elle invoque le build web de Flutter et copie `extension/devtools/build/`. Comparez les références de `flutter_bootstrap.js` généré avec le contenu copié de `canvaskit/`, y compris le flag de tree-shaking des icônes. C’est terminé lorsque les builds CDN omettent les assets inutilisés tandis que les builds hors ligne conservent les fichiers requis, et que le tree-shaking des icônes peut être sélectionné sans casser les extensions valides.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
dart
Domaine
build-system, tooling
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
Calme
Clarté
Plutôt claire
Accessibilité débutants
52/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.