Google Maps JavaScript API развивается по версиям, которые отражают изменения в архитектуре, модели загрузки, системе ключей, а также в наборе доступных библиотек. Переход между версиями требует учета обратной совместимости, различий в загрузчике API и изменений в поведении объектов карты.
В контексте JavaScript API Google Maps можно выделить два ключевых поколения:
Legacy API (v3.x) Классическая версия, основанная на
глобальном объекте google.maps. Подключение выполнялось
через <script> с указанием параметра
callback.
<script
src="https://maps.googleapis.com/maps/api/js?key=API_KEY&callback=initMap"
async
defer
></script>
Основные характеристики:
google.mapsModern API (v3.49+ и loader @googlemaps/js-api-loader) Современная модель предполагает явную загрузку модулей и использование промисов.
import { Loader } from "@googlemaps/js-api-loader";
const loader = new Loader({
apiKey: "API_KEY",
version: "weekly",
libraries: ["places"]
});
loader.load().then(async () => {
const { Map } = await google.maps.importLibrary("maps");
const map = new Map(document.getElementById("map"), {
center: { lat: 55.7558, lng: 37.6173 },
zoom: 10
});
});
Ключевые особенности:
importLibraryGoogle Maps JavaScript API использует несколько типов версий:
version=weekly
Используется в средах разработки и для тестирования новых возможностей.
version=quarterly
version=3.55
Ранее загрузка API строилась вокруг глобального объекта и callback-функции:
function initMap() {
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 40.7128, lng: -74.0060 },
zoom: 12
});
}
Недостатки подхода:
Современный API отделяет загрузку ядра от библиотек:
const { Map } = await google.maps.importLibrary("maps");
const { Marker } = await google.maps.importLibrary("marker");
Преимущества:
Одним из ключевых изменений является отказ от ожидания готовности глобального объекта.
const map = new google.maps.Map(el, options);
const marker = new google.maps.Marker({
position: { lat: 0, lng: 0 },
map
});
const { Map } = await google.maps.importLibrary("maps");
const { AdvancedMarkerElement } = await google.maps.importLibrary("marker");
const map = new Map(el, options);
new AdvancedMarkerElement({
map,
position: { lat: 0, lng: 0 }
});
Изменения:
Marker заменяется на
AdvancedMarkerElementРанее подключение дополнительных возможностей осуществлялось через
параметр libraries:
&libraries=places,drawing,geometry
Проблемы:
await google.maps.importLibrary("places");
await google.maps.importLibrary("geometry");
Каждая библиотека:
Google Maps API сохраняет совместимость на уровне:
Map, LatLng)click,
bounds_changed)Однако изменения затрагивают:
Старый API:
new google.maps.Marker({
position,
map
});
Новый API:
new google.maps.marker.AdvancedMarkerElement({
map,
position
});
Изменения:
marker библиотекиanimation)Старая модель:
const service = new google.maps.places.PlacesService(map);
Новая модель:
const { PlacesService } = await google.maps.importLibrary("places");
const service = new PlacesService(map);
Система событий сохраняет концепцию, но теперь теснее связана с модульной архитектурой.
map.addListener("click", (event) => {
console.log(event.latLng.toJSON());
});
Различия:
Современная версия API ориентирована на TypeScript.
import { Loader } from "@googlemaps/js-api-loader";
const loader = new Loader({
apiKey: "API_KEY",
version: "weekly"
});
await loader.load();
const map: google.maps.Map = new google.maps.Map(
document.getElementById("map") as HTMLElement,
{
center: { lat: 10, lng: 10 },
zoom: 5
}
);
Особенности:
Переход между версиями API напрямую влияет на производительность:
importLibraryСтарые и новые версии используют одинаковую систему ключей, однако появились дополнительные ограничения:
Переход между версиями обычно выполняется поэтапно:
Замена script tag на @googlemaps/js-api-loader.
Разделение логики загрузки по модулям.
weekly /
quarterlyСтарая архитектура строилась вокруг глобального состояния API:
google.mapsНовая архитектура:
Ранее несколько карт использовали общий глобальный контекст.
Теперь каждая карта:
importLibraryconst [mapsLib, markerLib] = await Promise.all([
google.maps.importLibrary("maps"),
google.maps.importLibrary("marker")
]);
При миграции часто возникают следующие проблемы:
importLibraryДиагностика обычно включает:
maps.googleapis.comПереход между версиями отражает общий тренд:
Такая модель позволяет строить более масштабируемые и производительные клиентские приложения, работающие с картографическими данными.