Timp de peste un deceniu, rularea codului Dart în browser s-a bazat pe compilarea în JavaScript prin compilatoarele dart2js și dartdevc. Deși foarte optimizat, JavaScript impunea limite stricte: un model de obiecte dinamic, interpretare JIT în motoarele browserelor (V8, JavaScriptCore) și pauze imprevizibile de Garbage Collection.
Odată cu adoptarea standardului WasmGC (WebAssembly Garbage Collection) de către toate motoarele majore de navigare (Chromium, Firefox, Safari) și lansarea Dart 3.4+, Dart poate fi compilat direct în binar WebAssembly. Această tehnologie permite aplicațiilor Dart și Flutter Web să ruleze cu viteze de până la 3x mai rapide, cu încărcare aproape instantanee și un consum masiv redus de resurse CPU.
# Abordarea Clasică:
# Cod Sursă Dart ───► [dart2js] ───► Fisiere .js mari ───► Parsare JS lentă în browser
# Abordarea Modernă (Dart 3.4+ / WasmGC):
# Cod Sursă Dart ───► [dart compile wasm] ───► Binar compact app.wasm
# │
# ▼
# Execuție directă WasmGC în browser!
# - Fără pas de parsare text JS
# - Instanțiere instantanee a binarului
Tabel Comparativ: Compilare WebAssembly vs JavaScript în Dart
| Metrică de Randament | WebAssembly (WasmGC) | JavaScript (dart2js) |
|---|---|---|
| Timp de Pornire (Cold Start) | Sub 200 ms (Decodare binară la viteze de magistrală) | 600 – 1500 ms (Parsare și compilare text JS) |
| Cadre pe Secundă (FPS) | 60 / 120 FPS stabile (Fără micro-întreruperi de layout) | Fluctuații la animații complexe sau scroll intens |
| Integrare Garbage Collection | Folosește GC-ul nativ ultra-rapid al browserului (WasmGC) | Emulare a obiectelor pe heap-ul JavaScript |
| Interoperabilitate JS | Prin noul pachet standard dart:js_interop |
Prin vechiul pachet dart:js / dart:html |
import 'dart:js_interop';
// Definirea unei interfețe JS externe folosind Extension Types:
@JS('console')
external JSConsole get console;
extension type JSConsole(JSObject _) implements JSObject {
external void log(JSAny? message);
external void warn(JSAny? message);
}
// Apelarea directă a ferestrei browserului:
@JS('window.alert')
external void jsAlert(JSString message);
void main() {
console.log('Mesaj trimis din binarul Dart WasmGC direct în consola Web!'.toJS);
jsAlert('Salut din WebAssembly!'.toJS);
}
# Compilare binar Wasm cu optimizări maxime de mărime și viteză:
dart compile wasm -O4 web/main.dart -o build/web/main.wasm