Содержание статьи
В мае 2024 года команда Flutter выпустила версию Flutter 22, в которой они стабилизировали поддержку WebAssembly, объединив компилятор Dart с системой сборки мусора WebAssembly — WASM GC. С тех пор появилось очень много работ, в которых WebAssembly вёл себя намного лучше, чем JavaScript. WASM доказал свою эффективность в реальных приложениях. Например, Dart DevTool, сложное высокоинтерактивное веб-приложение Flutter, поставляется с WebAssembly по умолчанию с конца 2024 года.
Примерно с этого же времени я много экспериментировал со сборками WASM и, в принципе, для широкого круга приложений они работают не хуже JavaScript, кроме двух интересных проблем. Это несовместимость данной технологии с браузерами Firefox и Safari.
Мне было интересно, почему вообще возникает такая несовместимость, потому что на неё я наткнулся на одном из комментов на Medium. И, понятное дело, там хейтят в этом именно Flutter. Но я решил покопаться в этом вопросе: то есть при чём здесь вообще Flutter и действительно ли команда Flutter не занимается этой ситуацией и почему не занимается.
В чем дело?
Flutter при сборке с —wasm создаёт два варианта:
-
main.dart.wasm — Wasm;
-
main.dart.js — автоматический резервный вариант.
Если Flutter считает Wasm-путь браузера несовместимым, загрузчик переключается на JavaScript. Поэтому пользователь увидит работающее приложение, но не получит Wasm-производительность. Flutter Documentation
Firefox
Официальная поддержка Flutter/Wasm в Firefox пока не восстановлена.
Firefox поддерживает WasmGC начиная с Firefox 120, поэтому сам Dart-код теоретически способен исполняться как Wasm. Однако Flutter не включает этот режим по умолчанию из-за проблемы рендерера Skwasm: Firefox при передаче изображения из OffscreenCanvas выполняет дорогое копирование через CPU. В опубликованном тесте Firefox тратил примерно 25–30 мс на операцию, тогда как Chrome — около 0–0,1 мс. Соответствующий баг Mozilla №1788206 остаётся открытым со статусом NEW и без назначенного исполнителя. Виноват не Flutter, Flutter Documentation
Следовательно:
-
приложение в Firefox запустится;
-
по умолчанию загрузится main.dart.js + CanvasKit;
-
реальный main.dart.wasm + Skwasm официально пока не считается поддерживаемым;
Safari
В Safari ситуация улучшилась, но полноценная официальная поддержка Flutter/Wasm ещё не включена.
Safari 18.2 получил поддержку WasmGC. Старый критический WebKit-баг, вызывавший падение Dart/Wasm, был исправлен, и команда Flutter сообщала, что на Safari 26+ Wasm уже показывает хорошую производительность. Однако Flutter всё ещё не разрешает этот путь по умолчанию: официальный issue об активации Wasm в Safari остаётся открытым. WebKit
В августе 2026 года Flutter закрыл PR, который просто разрешал Wasm для Safari 26 по номеру версии. Команда решила вместо этого реализовать проверку реальной совместимости браузера. Закрытие PR не означает, что поддержка уже выпущена. GitHub
Дополнительно в WebKit остаётся открытой проблема медленной передачи Canvas/ImageBitmap между потоками и canvas-контекстами. WebKit Bugzilla
Safari и другие браузеры на iPhone/iPad
Здесь ответ однозначный: Flutter/Wasm сейчас официально не работает. Это относится не только к Safari, но и к Chrome, Firefox и Edge на iOS, поскольку они используют WebKit. Flutter загружает JavaScript fallback. Flutter Documentation
Задача Flutter №178893 на включение Wasm остаётся Open. Ранее исправленное падение действительно устранено, но проблема производительности копирования между canvas — WebKit №267291 — всё ещё имеет статус NEW.
Итог
Браузер
Приложение откроется
Реально запустится как Flutter Wasm по умолчанию
Chrome/Edge на компьютере и Android
Да
Да, начиная с Chromium 119
Firefox
Да
Нет — JS fallback
Safari на macOS
Да
Пока нет — JS fallback
Safari на iPhone/iPad
Да
Нет — JS fallback
Chrome/Firefox на iPhone/iPad
Да
Нет — JS fallback
Проверить фактический режим можно внутри Dart:
const isActuallyRunningWithWasm = bool.fromEnvironment(‘dart.tool.dart2wasm’);
То есть проблемы частично исправлены, особенно в новых Safari, но кроссбраузерная поддержка Flutter/Wasm на текущий момент ещё не завершена. Для production-сайта —wasm применять можно: Chromium получит Wasm, Firefox и Safari автоматически получат JS-версию.
Я опробовал протестировать производительность WASM по сравнению с JavaScript в Chromium на Mac. Выводы неоднозначные. То есть тех цифр, которые приводятся командой — я в своих кейсах не получил. Но тем не менее визуально приложение действительно работает быстрее. В скором времени опубликую тесты WASM vs JS. А исправления багов для работы в Firefox и Safari ждем.
