Налаштування Shopify Hydrogen (React Storefront)

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

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

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

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

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Налаштування Shopify Hydrogen (React Storefront)
Складна
~2-4 тижні
Часті питання

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

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

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

  • 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

Налаштування Shopify Hydrogen (React Storefront)

Hydrogen — офіційний React-фреймворк від Shopify для headless commerce. Побудований на Remix, оптимізований для роботи зі Storefront API, розгортається на Oxygen (CDN-хостинг Shopify) або будь-якому сумісному з Node.js хостингу.

Чому Hydrogen, а не просто Next.js

Next.js + Storefront API — робочий варіант. Hydrogen додає:

  • Oxygen-розгортання — безплатний глобальний edge-хостинг, вбудований в Shopify (від плану Basic). Немає окремої інфраструктури для розгортання.
  • Remix routing — вкладені маршрути, server-side завантаження даних через loader, оптимістичний UI через action
  • Shopify-специфічні примітивиShopifyProvider, хуки для корзини, аналітики, стратегії кешування
  • Cache API — управління кешуванням на рівні Cloudflare Workers
  • Streaming SSR — Progressive HTML rendering з коробки

Ініціалізація проекту

npm create @shopify/hydrogen@latest
# Вибір: Demo Store / Hello World
# Розгортання: Oxygen / Self-hosted

cd my-hydrogen-app
npm install
npm run dev

Змінні середовища (.env):

SHOPIFY_STORE_DOMAIN=my-store.myshopify.com
SHOPIFY_STOREFRONT_ACCESS_TOKEN=abc123...
SHOPIFY_PUBLIC_STORE_DOMAIN=my-store.myshopify.com
SESSION_SECRET=random-secret-string

Структура проекту

hydrogen-app/
├── app/
│   ├── components/      # UI компоненти
│   ├── lib/             # утиліти, Shopify-клієнт
│   ├── routes/          # файловий роутинг Remix
│   │   ├── _index.tsx   # головна сторінка
│   │   ├── products.$handle.tsx   # сторінка продукту
│   │   ├── collections.$handle.tsx
│   │   └── cart.tsx
│   ├── styles/          # глобальні CSS
│   └── root.tsx         # кореневий layout
├── public/
├── server.ts            # Oxygen/Node entry point
└── vite.config.ts

Маршрут продукту з loader

// app/routes/products.$handle.tsx
import { json, type LoaderFunctionArgs } from '@shopify/remix-oxygen';
import { useLoaderData, type MetaFunction } from '@remix-run/react';
import { getSelectedProductOptions, Analytics } from '@shopify/hydrogen';
import { AddToCartButton } from '~/components/AddToCartButton';

const PRODUCT_QUERY = `#graphql
  query Product($handle: String!, $country: CountryCode, $language: LanguageCode)
    @inContext(country: $country, language: $language) {
    product(handle: $handle) {
      id
      title
      handle
      descriptionHtml
      options {
        name
        values
      }
      selectedVariant: variantBySelectedOptions(
        selectedOptions: $selectedOptions
        ignoreUnknownOptions: true
        caseInsensitiveMatch: true
      ) {
        id
        availableForSale
        image {
          url
          altText
          width
          height
        }
        price {
          amount
          currencyCode
        }
        compareAtPrice {
          amount
          currencyCode
        }
        sku
        title
        unitPrice {
          amount
          currencyCode
        }
      }
      media(first: 7) {
        nodes {
          ... on MediaImage {
            mediaContentType
            image {
              id
              url
              altText
              width
              height
            }
          }
        }
      }
    }
  }
`;

export async function loader({ params, context }: LoaderFunctionArgs) {
  const { handle } = params;

  const { storefront } = context;

  const { product } = await storefront.query(PRODUCT_QUERY, {
    variables: {
      handle,
      selectedOptions: getSelectedProductOptions(request),
    },
  });

  if (!product?.id) {
    throw new Response(null, { status: 404 });
  }

  return json({
    product,
    url: request.url,
  });
}

export const meta: MetaFunction<typeof loader> = ({ data }) => {
  return [
    { title: `${data?.product?.title ?? 'Product'}` },
    { description: data?.product?.descriptionHtml ?? '' },
  ];
};

export default function Product() {
  const { product } = useLoaderData<typeof loader>();

  return (
    <div className="product">
      <h1>{product.title}</h1>
      <img
        src={product.selectedVariant?.image?.url}
        alt={product.selectedVariant?.image?.altText}
      />
      <p>{product.descriptionHtml}</p>
      <AddToCartButton variant={product.selectedVariant} />
    </div>
  );
}

Інтеграція з Oxygen

Розгортання на Oxygen (безплатний CDN):

npm run build
npm run deploy  # через Oxygen CLI

Oxygen автоматично обробляє кешування, edge rendering та глобальне розподілення.