Flutter Web для нарративной RPG — не типичный CRUD. Длинный чат, боковая панель, карта, портреты и анимации создают нагрузку. Вот что реально помогло снизить время до первого хода.
Без сжатия main.dart.js весил ~3.5 MB — через FRP-туннель это критично. Включение gzip в Nginx снизило передаваемый объём до ~1 MB. Обязательно проверяйте Content-Encoding: gzip на проде — без него мобильные пользователи ждут минуту.
Шрифты, иконки и AssetManifest кэшируются агрессивно. Версионирование через asset_version в version.json даёт безопасный cache-bust при деплое без invalidation всего CDN.
Чат — самый горячий экран. Мы разбили UI на мелкие StatelessWidget, вынесли списки в ListView.builder, добавили const там, где текст статичен. Каждый лишний rebuild во время стриминга ответа ИИ ощущается как лаг.
Статический лендинг в index.html живёт до загрузки Flutter. Стили лендинга изолированы от композитора — иначе глобальные CSS правила ломают Material-тему приложения после bootstrap.