Практика и частые проблемы: загрузка, ошибки, деплой
Эта статья — про то, что чаще всего ломается в рантайме: загрузка remoteEntry, подкачка чанков exposed-модулей, совместимость окружения и нюансы деплоя. Базовые понятия (remoteEntry, exposes, remotes, shared) уже разобраны в предыдущих материалах.
Как мыслить про загрузку в браузере
Удобная ментальная модель — две сетевые стадии:
Поэтому «remoteEntry загрузился» ещё не означает, что модуль загрузится: вторая стадия чаще всего ломается из‑за путей, кэша или CORS.
Быстрая диагностическая таблица
| Симптом | Где смотреть | Типовая причина | Быстрый фикс/проверка |
|---|---|---|---|
| remoteEntry.js 404 | Network | неправильный URL в remotes, не тот домен/путь | открыть URL remoteEntry напрямую в браузере |
| remoteEntry 200, но дальше ChunkLoadError | Network → chunk requests | неверный publicPath у remote, деплой под подпапку | проверить, откуда грузятся чанки (Origin/Path) |
| container.get is not a function / undefined | Console | контейнер не зарегистрирован/переопределён глобально | проверить совпадение имён контейнера и алиаса, отсутствие конфликтов имён |
| Ошибка инициализации shared | Console | несовместимые версии/настройки shared | временно выключить strictVersion, выровнять версии, проверить singleton-пары |
| Работает локально, падает на стенде | Network/Console | CORS, mixed content (http/https), CSP | проверить заголовки CORS, протоколы, CSP script-src |
Частые “подводные камни” деплоя
Кэширование remoteEntry
- Если
remoteEntry.js закэширован «навечно», host может жить на старом контракте.
- Практика: либо короткий TTL для
remoteEntry, либо версионированный URL (а host получает актуальный URL через конфиг окружения).
Rollback без сюрпризов
- Откат remote должен быть совместим с тем, что ожидают текущие host’ы.
- Практика: не ломать публичные ключи exposed-модулей; изменения делать совместимыми, пока все host не обновятся.
CORS и безопасность
- Remote часто лежит на другом домене/CDN.
- Нужны корректные CORS-заголовки для загрузки скриптов и политика CSP, разрешающая источник remote.
Разные окружения (dev/stage/prod)
- Ошибка класса «не там ищем remote» решается не кодом, а конфигурацией.
- Практика: адреса remote задавать через переменные окружения/конфиг, а не “хардкодить”.
Чеклист перед релизом
Проверить доступность remoteEntry и всех чанков (не только первого файла).
Пройти сценарий с «чистым кэшем» и с «тёплым кэшем».
Убедиться, что политика кэша осознанная: что можно кэшировать долго, а что нет.
Протестировать кросс-доменную загрузку (CORS/CSP/https).
Зафиксировать контракт: какие exposed-модули считаются публичными и как меняются.<details>
<summary>
Практика для отладки “в поле”
</summary>
Логируйте URL remote и фактические запросы чанков: часто проблема видна прямо в Network.
Делайте фолбэк в UI на случай недоступности remote (например, заглушка/сообщение), чтобы падение remote не роняло весь host.
Если ошибки плавающие — ищите гонки деплоя: CDN обновил remoteEntry, а чанки ещё старые (или наоборот). Решение — атомарный деплой артефактов или версионирование путей.</details>