Інтеграція Medusa.js з фронтендом (Next.js/Gatsby)

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Інтеграція Medusa.js з фронтендом (Next.js/Gatsby)
Середня
~5 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Інтеграція Medusa.js з фронтендом (Next.js/Gatsby)

Medusa предоставляє Store API та опціональний TypeScript SDK @medusajs/js-sdk для роботи з фронтендом. Офіційний Next.js Storefront Starter — готова точка відлику, але для продукту потребує істотної доробки. Gatsby використовується рідше — підходить для каталогів з повільно мінливим контентом завдяки SSG.

Настройка Medusa JS SDK

npm install @medusajs/js-sdk @medusajs/types
import Medusa from '@medusajs/js-sdk';

export const medusaClient = new Medusa({
  baseUrl: process.env.NEXT_PUBLIC_MEDUSA_BACKEND_URL!,
  auth: {
    type: 'session',
  },
  publishableKey: process.env.NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY,
});

Next.js App Router: сторінка товара

export async function generateStaticParams() {
  const { products } = await medusaClient.store.product.list({
    fields: 'handle',
    limit: 200,
  });
  return products.map(p => ({ handle: p.handle }));
}

export async function generateMetadata({ params }): Promise<Metadata> {
  const { products } = await medusaClient.store.product.list({
    handle: params.handle,
  });
  const product = products[0];
  return {
    title: product.title,
    description: product.description,
  };
}

export default async function ProductPage({ params }) {
  const { products } = await medusaClient.store.product.list({
    handle: params.handle,
    fields: '*variants,*variants.prices,*images',
  });
  const product = products[0];
  if (!product) notFound();
  return <ProductTemplate product={product} />;
}

Управління корзиною

'use client';
import { createContext, useContext, useState, useEffect } from 'react';

type CartContextType = {
  cart: HttpTypes.StoreCart | null;
  addItem: (variantId: string, quantity: number) => Promise<void>;
};

const CartContext = createContext<CartContextType | null>(null);

export function CartProvider({ children }) {
  const [cart, setCart] = useState(null);

  useEffect(() => {
    const cartId = localStorage.getItem('cart_id');
    if (cartId) {
      medusaClient.store.cart.retrieve(cartId)
        .then(({ cart }) => setCart(cart));
    }
  }, []);

  const addItem = async (variantId: string, quantity: number) => {
    let currentCart = cart;
    if (!currentCart) {
      const { cart: newCart } = await medusaClient.store.cart.create({
        region_id: process.env.NEXT_PUBLIC_MEDUSA_REGION_ID,
      });
      localStorage.setItem('cart_id', newCart.id);
      currentCart = newCart;
    }

    const { cart: updatedCart } = await medusaClient.store.cart.createLineItem(
      currentCart.id,
      { variant_id: variantId, quantity }
    );
    setCart(updatedCart);
  };

  return (
    <CartContext.Provider value={{ cart, addItem }}>
      {children}
    </CartContext.Provider>
  );
}

export const useCart = () => useContext(CartContext);

Мультирегіональність

import { NextRequest, NextResponse } from 'next/server';

const REGION_MAP = {
  RU: process.env.MEDUSA_REGION_RU!,
  BY: process.env.MEDUSA_REGION_BY!,
  DEFAULT: process.env.MEDUSA_REGION_DEFAULT!,
};

export function middleware(request: NextRequest) {
  const country = request.geo?.country ?? 'DEFAULT';
  const regionId = REGION_MAP[country] ?? REGION_MAP.DEFAULT;

  const response = NextResponse.next();
  response.cookies.set('medusa_region', regionId, { maxAge: 60 * 60 * 24 });
  return response;
}

Терміни інтеграції

  • Next.js Storefront Starter + кастомізація: 2–3 тижні
  • Кастомний Next.js з нуля (App Router, SSR/SSG, корзина, checkout): 6–10 тижнів
  • Gatsby SSG-каталог з динамічною корзиною (hybrid): 4–6 тижнів
  • Мультирегіональний магазин з локалізацією: +2–3 тижні