flutter / flutter/devtools

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

Đang mở
#9,897 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
cost: medium devtools extensions P2
Ngôn ngữ chính
Dart
Star
1.7k
Fork
404
Merge trung bình
6 ngày 17 giờ
Pull request đã merge (30 ngày)
18

Mô tả

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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

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.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
dart
Lĩnh vực
build-system, tooling
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Ít trao đổi
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
52/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.