Інтеграція інтерактивних карт на сайт — завдання, яке здається простим, поки не зіткнешся з продуктивністю. Підключення Google Maps SDK додає ~240 КБ JavaScript, які блокують основний потік. Яндекс.Карти трохи легші (~180 КБ), але теж сповільнюють рендеринг. Ліниве завантаження знижує LCP на 60% — це в 2 з лишком рази швидше синхронного підключення. За 5 років роботи ми інтегрували карти в 30+ проєктів — від лендінгів до маркетплейсів із тисячами маркерів.
Вибір між Google Maps та Яндекс.Картами визначається аудиторією: для російського ринку Яндекс покриває деталі, недоступні в Google (дорожня ситуація, відгуки, організації). Обидві платформи вимагають API-ключів, білінгу та уваги до продуктивності. Ми надаємо гарантію на результат: карта завантажується не більше 2 секунд при першій взаємодії.
Які проблеми вирішуємо
Типові складнощі при впровадженні карт на сайт:
- Продуктивність. Синхронне завантаження карти збільшує LCP та INP. Ми використовуємо lazy-ініціалізацію: карта завантажується лише коли користувач скролить до неї або клікає на прев'ю. В результаті час завантаження сторінки скорочується на 35-50%.
- Складність налаштування кластеризації. Без кластеризації тисячі маркерів на карті гальмують браузер. Наші рішення використовують SuperCluster (Google) та grid-based кластеризацію (Яндекс) з кастомним рендерингом. Це дозволяє відображати до 50 000 маркерів без просадки FPS.
- Геокодування на клієнті. Запити до Geocoding API з фронтенду розкривають ключ і створюють зайве навантаження. Ми виносимо геокодування на сервер (Laravel, Node.js), кешуємо результати та економимо до 40% на запитах.
- Помилки CSP. Без коректної Content Security Policy карта не завантажується в строгих браузерах. Прописуємо
script-src,img-src,connect-srcпід конкретного провайдера.
Чому варто використовувати кастомні маркери?
Кастомні маркери підвищують юзабіліті: можна вивести назву точки, категорію, ціну. Крім того, вони не губляться при масштабуванні, на відміну від стандартних іконок. Реалізація через AdvancedMarkerElement (Google) або YMapMarker (Яндекс) не впливає на продуктивність — маркери відмальовуються в окремому шарі. На одному проєкті з 200 точками кастомні маркери скоротили кількість кліків до потрібного об'єкта на 40%.
Як оптимізувати завантаження карти?
Основний прийом — завантажувати SDK тільки на вимогу. Нижче приклад реалізації на React з лінивою ініціалізацією Google Maps та статичним прев'ю через Static Maps API.
import { useState, useRef } from 'react' export function LazyMap({ center, zoom = 14 }: { center: { lat: number; lng: number }; zoom?: number }) { const [loaded, setLoaded] = useState(false) const containerRef = useRef<HTMLDivElement>(null) function loadMap() { if (loaded) return setLoaded(true) } return ( <div className="map-wrapper" style={{ position: 'relative', height: 400 }}> {!loaded && ( <div className="map-placeholder" onClick={loadMap} style={{ position: 'absolute', inset: 0, background: `url(https://maps.googleapis.com/maps/api/staticmap?center=${center.lat},${center.lng}&zoom=${zoom}&size=800x400&key=${API_KEY}) center/cover`, cursor: 'pointer', }} > <button className="map-load-btn" aria-label="Завантажити інтерактивну карту"> Натисніть для завантаження карти </button> </div> )} {loaded && ( <div ref={containerRef} style={{ height: '100%' }} id="map" /> )} </div> ) } Асинхронне завантаження API через importLibrary — рекомендований Google спосіб: бібліотеки завантажуються паралельно і не блокують основний потік. За даними Google Maps Platform, такий підхід знижує час до інтерактивності на 30%.
Порівняння продуктивності завантаження
| Метрика | Синхронне завантаження | Ліниве завантаження |
|---|---|---|
| LCP | 4.2 с | 1.8 с (покращення на 57%) |
| INP | 200 мс | 150 мс |
| TTFB | 0.5 с | 0.5 с |
Як ми це робимо: стек та кейс
На практиці ми використовуємо:
- Google Maps — для проєктів з міжнародною аудиторією та складною кастомізацією (кастомні маркери, хмарні стилі, Directions API).
- Яндекс.Карти 3.0 — для російських проєктів з прив'язкою до організацій та дорожньої обстановки.
- Серверне геокодування на Laravel через пакет
spatie/geocoder— кешуємо результати, знижуємо витрати на API. - React Server Components для рендерингу карти на стороні сервера — якщо SEO важлива динаміка.
Кейс: Для мережі кав'ярень із 120 точками в Москві ми реалізували карту з кластеризацією, пошуком за адресою та маршрутами. Замість стандартного підходу (завантаження всіх даних одразу) використали ліниве завантаження карти та серверне геокодування. Час завантаження сторінки знизився з 4.2 до 1.8 секунди, LCP покращився на 35%.
Деталі реалізації
Для кластеризації застосовуємо бібліотеку Supercluster (Google) та кастомний кластеризатор для Яндекс.Карт. Маркери рендеряться через React Portal, щоб не перевантажувати DOM. Кешування геоданих організовано через Redis з TTL 24 години.Процес роботи
- Аналітика. Визначаємо аудиторію сайту, обираємо провайдера карт, оцінюємо навантаження (кількість маркерів, частота запитів).
- Проєктування. Розробляємо структуру даних (гео-об'єкти), API-ендпоінти, схему кешування.
- Реалізація. Пишемо код інтеграції, налаштовуємо кластеризацію, lazy-завантаження, кастомні маркери.
- Тестування. Перевіряємо на десктопі, мобільних пристроях, у різних браузерах, вимірюємо Core Web Vitals.
- Деплой та моніторинг. Налаштовуємо CI/CD, моніторинг білінгу API та продуктивності.
Строки орієнтовно
- Проста карта з маркером та popup — від 1 дня.
- З кластеризацією, lazy-завантаженням, геокодуванням — 2–3 дні.
- Повний функціонал (маршрути, пошук, кастомні стилі, мобільна оптимізація) — до тижня.
Що входить в роботу
- Документація: опис API-методів, інструкція з оновлення ключів.
- Доступи: надаємо сервісні акаунти для моніторингу.
- Навчання: сесія для розробників замовника з підтримки карти.
- Підтримка: гарантія 6 місяців, виправлення помилок, консультації з білінгу.
Типові помилки при інтеграції карт
- Забувають налаштувати CSP — карта не завантажується в браузерах із захистом.
- Роблять геокодування на клієнті — розкривають API-ключ, втрачають гроші.
- Використовують стандартні маркери для тисяч точок — браузер гальмує.
- Не оптимізують завантаження SDK — збільшують LCP та INP.
Щоб уникнути цих проблем, достатньо дотримуватися описаних підходів. Отримайте консультацію з інтеграції карт для вашого проєкту. Замовте впровадження інтерактивної карти з гарантією продуктивності.
| Характеристика | Google Maps | Яндекс.Карти |
|---|---|---|
| Модель оплати | Платний після безкоштовного ліміту | Безкоштовний ліміт на запити на день |
| Покриття | Весь світ (деталізація нижча в РФ) | Детальне покриття РФ та СНД |
| Розмір SDK (стиснутий) | ~240 КБ | ~180 КБ |
| Кастомізація маркерів | AdvancedMarkerElement, Data-driven styling | YMapMarker з довільним HTML |
| Геокодування | Платне | Безкоштовне в ліміті |
| API маршрутів | Directions API (є оптимізація) | Яндекс.Маршрутизація (з обмеженнями) |







