Подключение Яндекс Карты (API 3) к проекту Next.js (App Router)

31 декабря 2025 г.

Пример подключения Яндекс Карты (API 3) к проекту Next.js (App Router). Решение основано на официальной документации Яндекс.

Создание компонента Яндекс Карты

Создаём компонент Map с кодом добавления Яндекс Карты:

app/lib/map.js
"use client";
 
import Script from "next/script";
 
const apikey = "yandex-map-api-key";
 
const createMap = async () => {
  await ymaps3.ready;
 
  const { YMap, YMapDefaultSchemeLayer, YMapDefaultFeaturesLayer, YMapMarker } =
    ymaps3;
 
  const coordinates = [37.603505, 55.73775];
 
  const map = new YMap(document.querySelector("#map"), {
    location: {
      center: coordinates,
      zoom: 16,
    },
    behaviors: ["drag"],
  });
 
  map.addChild(new YMapDefaultSchemeLayer());
  map.addChild(new YMapDefaultFeaturesLayer());
 
  const marker = document.querySelector("#marker");
  map.addChild(new YMapMarker({ coordinates: coordinates }, marker));
  marker.classList.remove("hidden");
};
 
export function Map() {
  return (
    <>
      <Script
        src={`https://api-maps.yandex.ru/v3/?apikey=${apikey}&lang=ru_RU`}
        strategy="lazyOnload"
        onLoad={createMap}
      />
 
      <section id="map" className="w-full h-112"></section>
 
      <div id="marker" className="hidden chat chat-start">
        <div className="chat-bubble w-40 text-sm">Наименование маркера</div>
      </div>
    </>
  );
}

Для подключения Яндекс Карты посредством JavaScript API необходимо получить ключ для пакета «JavaScript API и HTTP Геокодер» по ссылке. Полученный ключ нужно присвоить переменной apikey в коде выше (вместо yandex-map-api-key).

Маркер (id="marker") изначально скрыт (className="hidden..."), но после подключения к карте становится видимым.

Подключение компонента Яндекс Карты

Подготовленный компонент Map можно вставить в любую страницу сайта, где это необходимо:

app/page.js
import { Map } from "@/app/lib/map";
 
export default function Page() {
  return (
    <main>
      // ...
      <Map />
      // ...
    </main>
  );
}