В Mapbox GL JS архитектура построена вокруг изолированных областей
ответственности, где каждый уровень — от источника данных до рендера —
имеет собственные ограничения видимости и влияния. Понимание этих
ограничений критично для предсказуемого поведения карт, особенно при
работе с большим количеством слоёв, источников и динамическими
стилями.
Scope в данном контексте не является единым понятием языка
JavaScript; он распределён между несколькими подсистемами: стилем карты,
источниками данных, слоями, выражениями, событиями и WebGL-рендером.
Scope стиля (Style Scope)
Стиль в Mapbox GL JS представляет собой изолированное описание
визуального состояния карты. Он определяет:
- источники данных (sources)
- слои (layers)
- спрайты (sprite)
- шрифты (glyphs)
- параметры отображения (light, transition)
Ограниченность стиля
Стиль не имеет прямого доступа к внешнему состоянию приложения. Это
означает:
- нельзя передавать произвольные JavaScript-объекты внутрь стиля
- нельзя выполнять произвольный код внутри описания стиля
- все динамические изменения должны проходить через API Mapbox GL
JS
Стиль существует как декларативная структура, сериализуемая в JSON,
что ограничивает его scope строго описанными полями спецификации.
Scope источников данных
(Source Scope)
Каждый источник данных (geojson, vector tiles, raster tiles)
существует в собственной области видимости.
Основные ограничения:
- слой может ссылаться только на те источники, которые
зарегистрированы в текущем стиле
- источник не может быть «частично видимым» — он либо подключён, либо
нет
- данные источника доступны только в рамках слоёв, которые его
используют
Важный аспект изоляции
Несколько слоёв могут использовать один источник, но:
- фильтрация данных выполняется на уровне слоя
- трансформации геометрии не изменяют сам источник
- один и тот же source не может иметь разные версии данных для разных
слоёв
Таким образом, scope источника — глобальный внутри карты, но
локальный в контексте слоя.
Scope слоёв (Layer Scope)
Слой — это основная единица визуализации. Его scope ограничен
следующими параметрами:
- source и source-layer (для vector tiles)
- фильтры (filter expressions)
- paint properties
- layout properties
Изоляция слоёв
Каждый слой:
- не знает о других слоях напрямую
- не может модифицировать состояние других слоёв
- рендерится независимо в рамках WebGL пайплайна
Даже при визуальном наложении слоёв их логические области остаются
изолированными.
Порядок отрисовки как часть
scope
Z-index в Mapbox GL JS определяется порядком слоёв в стиле:
- более поздний слой перекрывает предыдущие
- нет глобального механизма автоматического управления слоями
- порядок является частью декларативного scope стиля
Scope выражений (Expressions
Scope)
Выражения в Mapbox GL JS — это мини-язык для вычисления значений
свойств.
Они работают в строго ограниченной среде:
- нет доступа к DOM
- нет доступа к глобальному JavaScript окружению
- нет пользовательских функций
- нет сетевых запросов
Доступные входные данные
Выражения могут использовать только:
- свойства фичи (feature properties)
- zoom level
- feature state
- глобальные переменные стиля (limited)
- константы
Изоляция вычислений
Каждое выражение:
- вычисляется в контексте конкретной геометрии
- не имеет побочных эффектов
- не может изменять состояние карты
Это делает scope выражений строго функциональным.
Scope событий (Event Scope)
Mapbox GL JS предоставляет систему событий (click, hover, move),
которая имеет локализованный scope.
Уровни событий:
- карта (map-level events)
- слой (layer-specific events)
- feature (feature-based events)
Ограничения событийного
scope:
- событие всегда связано с конкретным canvas контекстом
- события не «перетекают» между картами
- доступ к данным ограничен результатом hit-testing
Feature scope в событиях
При клике на объект:
- возвращается только набор фич в точке клика
- нет доступа ко всем данным источника
- выборка ограничена текущим zoom и viewport
Scope рендеринга (WebGL
Scope)
Рендеринг в Mapbox GL JS основан на WebGL, что вводит аппаратные
ограничения scope.
Основные ограничения:
- лимиты GPU на количество вершин и фрагментов
- ограничение числа одновременно активных текстур
- batch-рендеринг слоёв
- невозможность прямого вмешательства в shader pipeline
Изоляция контекста
Каждая карта:
- имеет собственный WebGL context
- не делит GPU память с другими картами
- полностью изолирована по рендеру
Это означает, что scope рендера строго ограничен экземпляром
карты.
Scope данных в тайлах (Tile
Scope)
Vector tiles и raster tiles формируют отдельный уровень
ограничения.
Характеристики tile scope:
- каждый тайл содержит только часть глобальных данных
- данные загружаются по мере необходимости (on-demand)
- видимость определяется текущим zoom и viewport
Ограничение контекста:
- слой не знает, какие тайлы будут загружены заранее
- данные вне текущих тайлов недоступны
- фильтрация происходит локально внутри тайла
Таким образом, scope данных распределён пространственно.
Scope feature-state
Feature state — механизм временного состояния объектов.
Особенности scope:
- состояние привязано к конкретному feature ID
- не наследуется между источниками
- живёт в рамках экземпляра карты
Ограничения:
- нельзя хранить сложные структуры
- состояние не сериализуется в стиль
- теряется при пересоздании источника
Feature state имеет локальный, нестабильный scope.
Scope ресурсов (Glyphs и
Sprites)
Шрифты и иконки также находятся в ограниченном scope.
Glyph scope:
- загружаются по диапазонам символов
- кешируются локально
- привязаны к zoom и языковому контексту
Sprite scope:
- представляет собой атлас изображений
- доступен только через style specification
- не может быть модифицирован во время рендера
Scope экземпляра
карты (Map Instance Scope)
Каждый экземпляр карты — полностью автономная единица.
Внутренние ограничения:
- собственный стиль
- собственный WebGL контекст
- собственные источники данных
- собственный event loop обработки взаимодействий
Изоляция экземпляров:
Несколько карт на одной странице:
- не разделяют состояние по умолчанию
- не синхронизированы автоматически
- могут иметь разные стили и данные
Scope в архитектуре Mapbox GL
JS
Внутренняя архитектура Mapbox построена вокруг строгого
разделения:
- Style scope — декларативный слой описания
- Data scope — тайлы и источники
- Render scope — WebGL pipeline
- Interaction scope — события и hit-testing
- State scope — feature-state и UI-состояния
Каждый слой изолирован и взаимодействует только через строго
определённые API-границы.
Ограничения
глобального scope JavaScript
Несмотря на то что Mapbox GL JS используется внутри
JavaScript-приложений, его внутренние системы намеренно ограничивают
доступ к внешнему scope:
- стиль не видит глобальные переменные
- выражения не могут обращаться к window
- рендер не может вызывать пользовательские функции
- данные проходят через сериализованные структуры
Эта модель предотвращает непредсказуемые побочные эффекты и делает
поведение карты детерминированным.
Производные
ограничения scope при масштабировании
При увеличении количества данных и слоёв проявляются дополнительные
ограничения:
- рост числа draw calls ограничивает производительность WebGL
scope
- большое количество источников увеличивает давление на tile
scope
- сложные выражения увеличивают нагрузку expression scope
- частые обновления feature-state создают конкуренцию за state
scope
Эти ограничения не являются ошибками, а следствием архитектуры
изолированных областей исполнения.