Проблемы с загрузкой ресурсов

Архитектура рендеринга в MapLibre GL JS опирается на динамическую подгрузку множества внешних ресурсов: стиль карты, тайлы, спрайты и шрифты. Каждый из этих компонентов загружается асинхронно и проходит через отдельные сетевые и кэш-слои браузера, что делает систему чувствительной к ошибкам инфраструктуры и конфигурации сервера.

Модель загрузки данных и зависимостей

Рендер карты формируется из цепочки зависимостей:

  • Style JSON — центральное описание карты
  • Sources — источники данных (vector/raster tiles)
  • Tiles — геоданные по тайловой схеме
  • Sprites — иконки и символы стиля
  • Glyphs — растеризованные шрифты для текста

Каждый элемент загружается независимо, но ошибки в одном звене часто приводят к каскадной деградации отображения.

Ключевая особенность: рендер не блокируется полностью при частичной недоступности ресурсов, но визуальная целостность нарушается.


Ошибки загрузки Style JSON

Style JSON является точкой входа. Его недоступность приводит к полной невозможности инициализации карты.

Типичные проблемы:

  • 404 Not Found — неверный путь к стилю
  • 403 Forbidden — отсутствуют права доступа
  • CORS-блокировка при загрузке с другого домена
  • некорректный JSON (ошибки синтаксиса или структуры)

Особенность загрузки заключается в том, что стиль подгружается до инициализации WebGL-контекста, поэтому любые ошибки здесь останавливают дальнейший пайплайн.


Проблемы с тайлами (Tiles)

Тайлы являются основным источником геометрии. Ошибки загрузки проявляются как пустые области карты или частичная прорисовка слоёв.

Основные причины:

  • неправильный шаблон URL ({z}/{x}/{y})
  • несоответствие формата (vector vs raster)
  • отсутствие тайлов на сервере
  • превышение лимитов запросов (rate limiting)
  • проблемы CDN-кеширования

Векторные тайлы особенно чувствительны к версии схемы и сжатию (MVT, gzip, pbf).

При ошибках загрузки тайлов часто наблюдаются повторные запросы, что увеличивает нагрузку на сеть и сервер.


Sprites: проблемы загрузки и декомпозиции

Sprite состоит из двух файлов:

  • .png — изображение
  • .json — метаданные координат

Типичные сбои:

  • рассинхронизация JSON и PNG версий
  • 404 на одном из файлов пары
  • CORS-ошибки при загрузке изображений
  • кеширование старой версии одного из файлов

Даже частичная недоступность спрайта не вызывает падения карты, но приводит к исчезновению иконок и символов.


Glyphs и проблемы шрифтов

Glyphs используются для рендеринга текста в слоях symbol.

Частые проблемы:

  • отсутствующие диапазоны символов (missing glyph ranges)
  • неверный URL шаблона {fontstack}/{range}.pbf
  • большие задержки загрузки при первом обращении
  • блокировка шрифтов по CORS

При недоступности glyph-ресурсов текст может отображаться пустыми блоками или заменяться системным fallback-шрифтом.

Особенно критичны ошибки при работе с многоязычными картами, где требуется широкий набор Unicode диапазонов.


CORS и ограничения браузера

Cross-Origin Resource Sharing является одной из наиболее частых причин сбоев.

Типовые сценарии:

  • отсутствие заголовка Access-Control-Allow-Origin
  • несовпадение протоколов (HTTPS → HTTP)
  • запросы к CDN без разрешения origin
  • preflight-запросы OPTIONS, возвращающие ошибку

MapLibre GL JS выполняет множество параллельных запросов, поэтому даже одна некорректная CORS-конфигурация может привести к частичной недоступности данных.


Ошибки сети и HTTP-уровня

На уровне сети проявляются следующие классы проблем:

  • DNS resolution failure
  • connection timeout
  • TLS handshake failure
  • HTTP 429 (rate limit)
  • HTTP 500 (ошибки сервера)

Особенность рендеринга заключается в том, что такие ошибки часто повторяются автоматически, создавая цикл повторных загрузок.


Mixed Content и HTTPS

При использовании HTTPS-страницы любые HTTP-ресурсы блокируются браузером.

Типичные ошибки:

  • стиль загружен по HTTPS, но тайлы по HTTP
  • sprite URL использует небезопасный протокол
  • glyphs подгружаются с HTTP CDN

Современные браузеры полностью блокируют такие запросы без возможности обхода на уровне клиента.


TransformRequest и контроль загрузки

Mechanism transformRequest позволяет модифицировать все исходящие запросы:

  • добавление заголовков авторизации
  • перенаправление URL на локальные зеркала
  • реализация подписанных URL
  • логирование запросов

Ошибки в этой функции часто приводят к:

  • некорректным URL (двойные слэши, обрезанные пути)
  • потере query-параметров
  • случайной блокировке запросов

Так как функция применяется ко всем типам ресурсов, дефект в ней может разрушить весь пайплайн загрузки.


Кэширование и его побочные эффекты

Браузерный и CDN-кеш часто становятся источником трудноуловимых ошибок:

  • загрузка старой версии style JSON с несовместимыми слоями
  • рассинхронизация sprite JSON и PNG
  • использование устаревших тайлов после обновления источника данных

HTTP-заголовки Cache-Control, ETag, Last-Modified играют ключевую роль в консистентности отображения.

При агрессивном кешировании возможно состояние, при котором карта визуально «ломается» без сетевых ошибок.


Worker-среда и загрузка ресурсов

MapLibre GL JS использует Web Workers для парсинга тайлов и подготовки данных к рендеру.

Проблемы:

  • блокировка worker-скриптов CSP-политиками
  • невозможность загрузки worker bundle с CDN
  • ошибки синхронизации между main thread и worker thread
  • повреждённые бинарные данные тайлов

При сбоях worker часто наблюдается деградация производительности вплоть до полной остановки обновления карты.


Отсутствие ресурсов и fallback-режимы

При частичной недоступности данных система переходит в деградированное состояние:

  • отсутствующие тайлы заменяются пустыми квадратами
  • missing sprites → пустые иконки
  • missing glyphs → пустые символы
  • partial style → неполное отображение слоёв

Fallback-логика не централизована, а распределена по типам ресурсов, что усложняет диагностику.


Диагностика загрузочных проблем

Основные инструменты анализа:

  • Network tab DevTools (поиск 404/403/blocked)
  • console warnings MapLibre GL JS
  • анализ waterfall-загрузки ресурсов
  • проверка CORS headers
  • инспекция worker logs

Дополнительный уровень диагностики:

  • включение debug-режимов рендера
  • перехват запросов через transformRequest
  • временное отключение кеширования

Характерные цепочки отказов

Некоторые ошибки проявляются не изолированно, а каскадно:

  • недоступен style JSON → отсутствуют sources → нет тайлов → пустая карта
  • ошибка sprite → отсутствуют иконки → символы теряют визуальные метки
  • glyph failure → текстовые подписи исчезают при сохранении геометрии

Такие цепочки делают важным контроль каждого уровня загрузки независимо, а не только итогового результата отображения.