flutter / flutter/devtools

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

Abierto
#9,897 0 comentarios 0 reacciones 0 asignados Ver en GitHub
cost: medium devtools extensions P2
Lenguaje dominante
Dart
Estrellas
1.7k
Forks
404
Merge medio
6 d 17 h
PR fusionados (30 d)
18

Descripción

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

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

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.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
dart
Área
build-system, tooling
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Tranquilo
Claridad
Bastante claro
Aptitud para principiantes
52/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.