Архитектура JavaScript API от HERE Technologies строится вокруг принципа контролируемой эволюции интерфейсов, при котором новые версии библиотеки сохраняют работоспособность значительной части существующего кода. Это достигается сочетанием версионирования загрузчика, модульной структуры, слоя устаревших интерфейсов и стабильного ядра пространственных типов данных.
HERE Maps JavaScript API исторически развивался как набор версий 3.x, где ключевая идея заключается в сохранении совместимости внутри мажорной ветки.
Основные характеристики подхода:
Ключевой принцип: код, написанный под 3.0, должен продолжать работать в 3.1 и последующих минорных версиях без изменений, если он не использует явно помеченные устаревшие возможности.
Система загрузки SDK через H.service.Platform и
динамические скрипты играет ключевую роль в сохранении
совместимости.
Пример базовой структуры:
H остаётся стабильнымconst platform = new H.service.Platform({
apikey: 'YOUR_API_KEY'
});
const defaultLayers = platform.createDefaultLayers();
Даже при обновлении SDK структура H.service.Platform
сохраняется, что минимизирует необходимость рефакторинга.
Одним из главных механизмов обратной совместимости является неизменность фундаментальных классов:
H.map.MapH.geo.PointH.map.MarkerH.map.PolylineH.map.PolygonЭти классы формируют ядро API и редко подвергаются структурным изменениям. Вместо изменения поведения вводятся:
Пример расширения без нарушения совместимости:
const point = new H.geo.Point(52.5, 13.4);
map.addObject(new H.map.Marker(point));
Даже при появлении новых типов координат или проекций старый код остаётся валидным.
Для обеспечения плавной миграции используется слой устаревших API.
Основные механизмы:
Пример типичного сценария:
map.setCenter({ lat: 52.5, lng: 13.4 });
Метод остаётся рабочим, даже если внутренне предпочтительным
становится использование объектов H.geo.Point.
Современная архитектура HERE Maps API использует модульную загрузку:
mapsjs-coremapsjs-servicemapsjs-uimapsjs-mapeventsСовместимость обеспечивается тем, что:
Пример подключения:
<script src="https://js.api.here.com/v3/3.1/mapsjs-core.js"></script>
<script src="https://js.api.here.com/v3/3.1/mapsjs-service.js"></script>
<script src="https://js.api.here.com/v3/3.1/mapsjs-ui.js"></script>
<script src="https://js.api.here.com/v3/3.1/mapsjs-mapevents.js"></script>
Даже при добавлении новых модулей старые продолжат функционировать без изменений в коде приложения.
Система событий в H.mapevents и H.ui
сохраняет единый подход:
addEventListener или
addListenerПример:
map.addEventListener('tap', function (evt) {
console.log(evt.currentPointer);
});
Даже при расширении структуры события evt старые поля
остаются доступными.
Сервисы платформы (геокодинг, маршрутизация, изохроны) развиваются независимо от визуального слоя карты, но сохраняют совместимые контракты ответов.
Пример:
platform.getSearchService().geocode({
q: 'Berlin'
}, result => {
console.log(result.items);
}, error => {
console.error(error);
});
Стабильность обеспечивается за счёт:
items,
position, address)Одним из ключевых механизмов сохранения обратной совместимости является правило:
“Не изменять — расширять”
Применяется к:
Пример эволюции API:
// ранний вариант
map.setZoom(10);
// расширенный вариант
map.setZoom(10, true);
Старый вызов продолжает работать без изменений.
UI-компоненты библиотеки проектируются с учётом стабильности:
ZoomControl,
ScaleBar) сохраняют APIconst ui = H.ui.UI.createDefault(map, defaultLayers);
Даже при изменении внутреннего DOM-рендеринга публичный API UI остаётся прежним.
Для минимизации риска регрессий применяется механизм скрытых флагов:
Это позволяет поддерживать стабильную ветку API без разрушения существующих приложений.
JavaScript API сохраняет совместимость на уровне структур данных:
lat и lngПример:
const line = new H.map.Polyline([
{ lat: 52.5, lng: 13.4 },
{ lat: 52.6, lng: 13.5 }
]);
Даже при внутренних оптимизациях структура входных данных не ломается.
Обратная совместимость в HERE Maps JavaScript API реализуется через многоуровневую стратегию:
HТакая модель позволяет одновременно развивать функциональность платформы и поддерживать большое количество существующих интеграций без необходимости переписывания клиентского кода.