Архитектура приложений на Mapbox GL JS строится вокруг единого
графического ядра, работающего поверх WebGL. Центральным объектом
системы выступает экземпляр Map, который связывает стиль,
источники данных, слои, пользовательские события и механизм отрисовки в
единую реактивную модель.
В основе лежит принцип декларативного описания карты: разработчик не управляет отрисовкой напрямую, а описывает состояние, которое движок приводит к визуальному результату.
Ключевые элементы архитектуры:
Map) как контейнер состоянияStyle) как декларация визуализацииSource) как поставщики геометрииLayer) как правила отображенияEvented) как механизм взаимодействияЭкземпляр Map выполняет роль диспетчера всех подсистем.
Он:
Внутри архитектуры важно понимать, что Map не является
«контейнером данных». Он ближе к orchestrator-слою, который связывает
независимые подсистемы через события и внутренние очереди задач.
Типичная схема инициализации:
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v12',
center: [69.2401, 41.2995],
zoom: 10
});
При создании объекта запускается цепочка:
Style в Mapbox GL JS представляет собой JSON-описание визуальной сцены. Он определяет не только внешний вид, но и структуру данных, которые будут загружены.
Основные компоненты стиля:
Стиль можно рассматривать как промежуточный слой между данными и рендерингом. Он не содержит логики приложения, но определяет визуальную семантику.
Пример структуры:
{
"version": 8,
"sources": {},
"layers": [],
"glyphs": "mapbox://fonts/mapbox/{fontstack}/{range}.pbf",
"sprite": "mapbox://sprites/mapbox/streets-v12"
}
Архитектурно важно, что стиль:
Sources отвечают за поставку данных в рендеринг-пайплайн. Они отделяют формат хранения от визуализации.
Основные типы:
Архитектурно источники работают как кэшируемые провайдеры данных. Они:
Внутренний pipeline:
Layers описывают, как данные из sources должны отображаться. Каждый слой:
Важно, что слой не содержит данных. Он только интерпретирует их.
Архитектурная модель слоёв — это стек, где порядок определяет приоритет отрисовки.
map.addLayer({
id: 'roads',
type: 'line',
source: 'streets',
paint: {
'line-color': '#ff0000',
'line-width': 2
}
});
Слои компилируются в WebGL-шейдеры, что делает их частью GPU pipeline.
Render loop — ключевой элемент архитектуры. Он работает по принципу «перерисовывать только при изменениях», но фактически поддерживает постоянный цикл при наличии анимаций или взаимодействий.
Основные триггеры перерисовки:
Пайплайн рендеринга:
Внутри используется WebGL как низкоуровневая графическая подсистема. Это определяет архитектурные ограничения:
Mapbox GL JS компилирует style layers в набор:
Таким образом, каждый слой становится GPU-программой.
Архитектура взаимодействия основана на event-driven подходе.
Map и связанные объекты наследуют поведение Evented.
Основные категории событий:
load, idle)move, zoom,
rotate)data, sourcedata)error)События обеспечивают слабую связанность между слоями приложения и картой.
Пример:
map.on('move', () => {
console.log(map.getCenter());
});
С точки зрения архитектуры это заменяет необходимость polling и прямого контроля состояния.
Состояние карты разделяется на несколько уровней:
UI state
Data state
Style state
Изменение состояния происходит через императивные API, но результат всегда приводит к декларативной перерисовке.
Приложения на Mapbox GL JS обычно строятся как композиция независимых модулей:
Такое разделение важно, поскольку сам Mapbox GL JS не навязывает архитектуру приложения, а предоставляет только графическое ядро.
В SPA-приложениях карта становится частью реактивного дерева компонентов.
Особенности интеграции:
Типичная проблема архитектуры — контроль жизненного цикла
Map:
Ключевые ограничения, влияющие на архитектуру:
Стратегии оптимизации:
Внутренний поток данных можно представить как последовательность:
Sources → Tile Cache → Feature Processing → Layer Evaluation → GPU Buffers → Render
Каждый этап изолирован и может быть пересчитан независимо, что позволяет эффективно обновлять только изменившиеся части сцены.
Camera в архитектуре выступает как независимый математический слой. Она определяет:
Любое взаимодействие пользователя преобразуется в изменения camera state, а не напрямую в графику.
Система масштабируется за счёт:
Это позволяет отображать огромные наборы геоданных без изменения архитектуры приложения на уровне кода разработчика.