Микрофронтенды: границы и интеграция
При нескольких командах естественно разделить фронтенд по доменам. Границы обычно совпадают с бизнес-доменами:
- Team Catalog — каталог, фильтры, поиск, карточка товара
- Team Cart — корзина, чекаут, оплата
- Team Shell — хедер, футер, поиск, навигация, auth
Интеграция через Module Federation (Webpack 5+): каждая команда собирает свой бандл, shell-приложение загружает их в runtime. Альтернатива — npm-пакеты, но они требуют координированных релизов.
// next.config.js (shell)
const { NextFederationPlugin } = require("@module-federation/nextjs-mf");
module.exports = {
webpack(config) {
config.plugins.push(new NextFederationPlugin({
name: "shell",
remotes: {
catalog: "catalog@https://catalog.cdn.example.com/remote.js",
cart: "cart@https://cart.cdn.example.com/remote.js",
},
}));
return config;
},
};
Рендеринг: ISR + Streaming SSR
Каталог и карточки товара — ISR (Incremental Static Regeneration) с revalidate 60 секунд. Страницы генерируются статически, обновляются в фоне. Для 100K товаров on-demand revalidation при изменении цены.
Streaming SSR для первой загрузки: хедер и скелет страницы отправляются мгновенно, данные каталога подтягиваются стримом. Пользователь видит структуру за 200ms, контент за 1–2s.
URL-driven state
Фильтры каталога живут в URL query params, а не в React state. Это критично для SEO (каждая комбинация фильтров — уникальный URL) и для UX (кнопка «Назад» работает):
/catalog/electronics?brand=apple,samsung&price_min=10000&price_max=50000&sort=rating&page=2
BFF (Backend for Frontend)
Тонкий серверный слой, который агрегирует данные из нескольких микросервисов (каталог, цены, наличие, рекомендации) в один оптимизированный ответ для фронтенда. Это сокращает количество запросов и позволяет адаптировать payload под нужды UI.