Плагины для OpenLayers представляют собой самостоятельные модули, расширяющие базовую функциональность библиотеки без изменения её ядра. Экосистема расширений строится вокруг принципов модульности, совместимости версий и предсказуемого подключения зависимостей. При публикации и распространении ключевую роль играет корректная упаковка, описание API, управление зависимостями и стратегия версионирования.
Плагин обычно реализуется как набор функций, классов или фабрик, которые работают поверх существующих объектов карты, слоёв и взаимодействий.
Типовая структура:
Главная идея — не дублировать функциональность ядра, а подключаться к его жизненному циклу через публичные API.
Плагин должен быть изолированным и не модифицировать глобальные объекты. Любое состояние инкапсулируется внутри экспортируемых сущностей.
Распространение плагинов для OpenLayers чаще всего осуществляется через Node.js и npm-экосистему.
Базовая структура пакета:
src/ — исходный кодdist/ — собранные артефактыpackage.json — метаданные пакетаREADME.md — документацияtypes/ или встроенные .d.ts — типы
TypeScripttest/ — тестыrollup.config.js / vite.config.js /
webpack.config.js — конфигурация сборкиКлючевые поля package.json:
name — уникальное имя (желательно scoped:
@scope/ol-plugin-name)version — версия по SemVermain — CommonJS точка входаmodule — ES module сборкаtypes — TypeScript декларацииsideEffects — управление tree-shakingpeerDependencies — зависимость от OpenLayersexports — современная карта экспорта модулейКритически важно не включать OpenLayers внутрь бандла плагина.
Библиотека должна поставляться как peerDependency.
Пример:
peerDependencies:
ol: >=7.0.0Это гарантирует, что приложение использует единственную версию OpenLayers, избегая конфликтов классов и дублирования кода.
Неправильный подход — добавление OpenLayers в
dependencies, что приводит к увеличению bundle size и
возможным runtime конфликтам.
Современные плагины ориентируются на ES Modules.
Рекомендуемая структура экспорта:
Пример exports:
{
"exports": {
".": {
"import": "./dist/index.esm.js",
"require": "./dist/index.cjs.js"
},
"./layer": "./dist/layer.esm.js",
"./interaction": "./dist/interaction.esm.js"
}
}
Это позволяет импортировать только нужные части плагина:
import { CustomLayer } from 'ol-plugin';
или
import { CustomInteraction } from 'ol-plugin/interaction';
Наиболее распространённый инструмент — Rollup.
Цели сборки:
Типичная конфигурация включает:
@rollup/plugin-node-resolve@rollup/plugin-commonjsrollup-plugin-tersertypescript или babelОсобое внимание уделяется external-зависимостям:
external: ['ol']
Это предотвращает включение OpenLayers в итоговый bundle.
Большинство современных плагинов поставляются с типизацией.
Подходы:
.d.ts через tsccomposite projects для
монорепозиториевТипы должны точно отражать API OpenLayers, особенно:
MapViewLayerSourceFeatureОшибки в типах приводят к неправильной интеграции в приложениях, использующих строгую типизацию.
Плагины строго привязаны к версиям OpenLayers.
Практика:
peerDependenciesПример:
Любые breaking changes в OpenLayers требуют пересмотра API плагина.
Процесс публикации включает:
npm version)npm publishДля scoped-пакетов:
npm publish --access public
Важно соблюдать:
Параллельно с npm часто используется GitHub:
Релиз обычно включает:
Для быстрых подключений используются CDN-сервисы:
Плагин должен предоставлять UMD-сборку:
window.OlPluginName
Однако UMD рассматривается как вторичный формат, основной — ESM.
Документация должна описывать:
Структура:
Пример важного раздела — интеграция с Map:
Плагины требуют многоуровневого тестирования:
Инструменты:
Особое внимание уделяется:
Автоматизация включает:
Стандартный pipeline:
Часто используется semantic-release для автоматического управления версиями.
Плагины должны исключать:
Также важно:
Рекомендуется:
@org/ol-*)Примеры:
@gis/ol-cluster-layer@maptools/ol-draw-enhancerИмя должно отражать тип расширения и его назначение.
src/
index.ts
layer/
CustomLayer.ts
interaction/
SelectInteraction.ts
utils/
projection.ts
dist/
types/
package.json
README.md
Основной entry:
export { CustomLayer } from './layer/CustomLayer';
export { SelectInteraction } from './interaction/SelectInteraction';
Хорошо спроектированный плагин предусматривает:
События часто реализуются через расширение стандартного event system OpenLayers.
Миграции оформляются через:
Удаление функций происходит только в мажорных версиях.
Плагины должны быть совместимыми между собой:
В крупных системах плагины собираются в единый registry, где определяется порядок инициализации и приоритет взаимодействий.