Структура файлов библиотеки

Исходный код библиотеки Leaflet организован как модульная структура, рассчитанная на поддержку расширяемости, сборки и повторного использования компонентов. Репозиторий построен таким образом, чтобы отделять исходные модули, утилиты, стили, конфигурации сборки и готовые артефакты дистрибуции.

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

Структура src:

  • map/ — реализация объекта карты, управление состоянием, слоями, событиями взаимодействия.
  • layer/ — набор классов слоёв, включая тайловые, векторные и группы слоёв.
  • geo/ — географические вычисления, преобразования координат, работа с проекциями.
  • dom/ — утилиты для взаимодействия с DOM, обработка событий мыши и сенсорных устройств.
  • control/ — элементы управления интерфейсом карты (зум, слои, масштабная линейка).
  • geometry/ — математические структуры: точки, границы, прямоугольники, полигоны.
  • util/ — вспомогательные функции общего назначения.

Каждый модуль внутри этих директорий реализует отдельный класс или набор связанных функций, минимизируя взаимные зависимости.

Организация ядра карты

Ключевым компонентом является объект карты, определённый в модуле Map. Он не существует изолированно, а связан с системой слоёв и системой координат.

Внутри структуры исходников логика карты отделена от визуального представления. Это выражается в том, что:

  • управление состоянием вынесено в отдельные классы;
  • обработка событий отделена от рендеринга;
  • математические преобразования не зависят от DOM.

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

Слои и их внутренняя структура

Директория layer содержит реализацию всех типов слоёв, которые добавляются на карту. Каждый слой наследуется от базового класса Layer, определяющего общий интерфейс жизненного цикла.

Основные подтипы:

  • тайловые слои (TileLayer) — загрузка изображений по сетке координат;
  • векторные слои (Path, Polyline, Polygon) — работа с геометрией;
  • группы слоёв (LayerGroup) — объединение нескольких слоёв в единый объект.

Каждый слой реализует стандартные методы:

  • инициализация (onAdd);
  • удаление (onRemove);
  • обновление состояния при изменении карты.

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

Географическая подсистема

Каталог geo отвечает за математическую модель отображения карты. В нём реализованы:

  • проекции координат (широта/долгота → пиксели);
  • обратные преобразования (пиксели → координаты);
  • расчёт расстояний и границ.

Важная часть этой подсистемы — работа с проекцией Web Mercator, которая используется для большинства тайловых карт. Здесь же находятся функции масштабирования и вычисления тайловых индексов.

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

DOM-слой и обработка событий

Модуль dom изолирует работу с браузерным окружением. Он обеспечивает:

  • нормализацию событий мыши и касаний;
  • кроссбраузерную обработку pointer events;
  • управление привязкой обработчиков;
  • оптимизацию перерисовок через requestAnimationFrame.

Важной особенностью является абстракция над нативными DOM-событиями. Leaflet приводит их к унифицированному формату, используемому внутри всей библиотеки.

Контролы интерфейса

Директория control содержит элементы пользовательского интерфейса, которые накладываются поверх карты.

Типичная структура контролов:

  • базовый класс Control, определяющий позиционирование и жизненный цикл;
  • расширения для конкретных элементов;
  • механизм добавления/удаления через API карты.

Контролы реализуются как DOM-элементы, но интегрируются в систему событий карты, что позволяет им реагировать на изменения состояния карты без прямых зависимостей.

Геометрические примитивы

Модуль geometry содержит базовые структуры данных:

  • Point — точка в пикселях;
  • LatLng — географическая координата;
  • Bounds — прямоугольная область;
  • LatLngBounds — географические границы.

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

Операции над геометрией реализованы как чистые функции или методы классов без побочных эффектов, что упрощает тестирование и повторное использование.

Утилиты и вспомогательные функции

Каталог util включает функции общего назначения:

  • работа с объектами (merge, extend);
  • проверка типов;
  • генерация уникальных идентификаторов;
  • управление массивами и коллекциями.

Эти функции используются в разных частях библиотеки и не привязаны к конкретной предметной области. Их задача — минимизировать дублирование кода.

Исходные стили и визуальные компоненты

Стили библиотеки находятся отдельно от JavaScript-кода. Они определяют:

  • позиционирование контейнера карты;
  • оформление тайлов;
  • поведение контролов;
  • базовые визуальные эффекты.

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

Сборка и дистрибуция

Каталог сборки обычно включает конфигурации и скрипты, отвечающие за генерацию финальных файлов библиотеки.

Типичные компоненты:

  • конфигурации сборщика (Rollup или аналогичный инструмент);
  • входные точки для сборки модулей;
  • генерация минифицированных версий;
  • создание source maps.

В результате сборки формируются файлы:

  • основной UMD-бандл;
  • ES-модули для современных сборщиков;
  • минифицированные версии для продакшена.

Публичный API и экспорт модулей

Финальная структура дистрибуции организована вокруг единой глобальной точки входа и модульных экспортов.

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

  • каждый модуль может быть импортирован отдельно;
  • сохранена обратная совместимость;
  • публичные методы отделены от внутренних реализаций.

Экспортируемая часть минимизирует поверхность API, скрывая внутренние детали реализации.

Тестовая инфраструктура

В репозитории присутствует каталог тестов, в котором проверяется:

  • корректность геометрических вычислений;
  • поведение слоёв;
  • обработка событий;
  • совместимость API.

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

Документация и примеры

Отдельный каталог содержит примеры использования библиотеки. Он включает:

  • демонстрационные карты;
  • базовые сценарии работы со слоями;
  • примеры кастомных контролов;
  • тестовые конфигурации.

Примеры синхронизированы с исходным кодом, что позволяет отслеживать актуальность API.

Архитектурные принципы организации файлов

Структура файлов построена вокруг нескольких базовых принципов:

  • разделение ответственности между модулями;
  • минимизация связности компонентов;
  • изоляция браузерной специфики;
  • единообразие интерфейсов классов;
  • предсказуемость структуры каталогов.

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