Миграция между версиями HERE Maps API в JavaScript в первую очередь затрагивает архитектуру загрузки модулей, систему инициализации карты, работу с объектами платформы и набор доступных сервисов. Основные изменения исторически связаны с переходом от ранних версий 3.0 к 3.1 и последующими обновлениями платформы HERE.
Ключевая особенность современных версий заключается в разделении логики:
В старых реализациях многие функции были доступны через глобальные объекты, тогда как в новых версиях применяется модульная загрузка через CDN или пакетные сборки.
Ранее подключение выполнялось через единый скрипт:
<script src="https://js.api.here.com/v3/3.0/mapsjs-core.js"></script>
<script src="https://js.api.here.com/v3/3.0/mapsjs-service.js"></script>
<script src="https://js.api.here.com/v3/3.0/mapsjs-ui.js"></script>
<script src="https://js.api.here.com/v3/3.0/mapsjs-mapevents.js"></script>
Особенности:
HВ новых версиях применяется более гибкая загрузка:
<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>
Но ключевое отличие заключается не только в версии, а в возможности использования модульной архитектуры через bundler (Webpack, Vite):
import H from '@here/maps-api-for-javascript';
В таком режиме:
Одним из самых значимых изменений является обновление платформенного объекта.
const platform = new H.service.Platform({
app_id: 'APP_ID',
app_code: 'APP_CODE'
});
const platform = new H.service.Platform({
apikey: 'API_KEY'
});
app_id и app_codeapikeyconst defaultLayers = platform.createDefaultLayers();
const map = new H.Map(
document.getElementById('mapContainer'),
defaultLayers.normal.map,
{
center: { lat: 52.5, lng: 13.4 },
zoom: 10
}
);
Основной принцип остался, но изменились слои и рекомендации по рендерингу:
const layers = platform.createDefaultLayers();
const map = new H.Map(
document.getElementById('map'),
layers.vector.normal.map,
{
center: { lat: 52.5, lng: 13.4 },
zoom: 10,
pixelRatio: window.devicePixelRatio
}
);
pixelRatio для HiDPIВ старых версиях обработка событий выполнялась через
map.addEventListener, но в новых версиях предпочтение
отдаётся унифицированной системе событий H.mapevents.
map.addEventListener('tap', function (evt) {
console.log(evt.currentPointer);
});
const beh * avior = new H.mapevents.Behavior(new H.mapevents.MapEvents(map));
map.addEventListener('tap', (evt) => {
console.log(evt.type, evt.currentPointer);
});
Появление Behavior изменило логику взаимодействия:
Теперь управляются централизованно через MapEvents.
const ui = H.ui.UI.createDefault(map, defaultLayers);
В новых версиях UI стал более модульным:
const ui = H.ui.UI.createDefault(map, layers);
Но ключевые изменения касаются не синтаксиса, а внутренней структуры:
const geocoder = platform.getGeocodingService();
const service = platform.getSearchService();
Или:
const geocodingService = platform.getGeocodingService();
const router = platform.getRoutingService();
const router = platform.getRoutingService(null, 8);
или использование нового Routing V8 API через REST:
const routingParameters = {
routingMode: 'fast',
transportMode: 'car',
origin: '52.5,13.4',
destination: '52.52,13.45'
};
router.calculateRoute(routingParameters, result => {
console.log(result);
}, error => {
console.error(error);
});
При миграции часто возникает необходимость адаптации под новую структуру JSON.
{
"Response": {
"View": [{
"Result": []
}]
}
}
{
"items": [
{
"position": {
"lat": 52.5,
"lng": 13.4
}
}
]
}
const layers = platform.createDefaultLayers();
map.setBaseLayer(layers.normal.map);
const layers = platform.createDefaultLayers({
lg: 'eng'
});
И использование vector слоёв:
layers.vector.normal.map
В новых версиях основной упор сделан на:
Практический эффект:
Использование старых app_id/app_code приводит к отказу
авторизации.
Решение: переход на apikey.
Если не инициализирован MapEvents, события жестов могут
не работать.
Решение:
const mapEvents = new H.mapevents.MapEvents(map);
const beh * avior = new H.mapevents.Behavior(mapEvents);
Парсинг старых JSON-структур приводит к undefined.
Решение: адаптация под новый REST формат.
Старые кастомные CSS могут конфликтовать с новым UI-слоем.
Решение: отказ от legacy тем и переход на UI Theme API.
Последовательная миграция строится по слоям:
Каждый этап изолируется и проверяется отдельно, чтобы избежать каскадных ошибок в продакшн-среде.