Сделайте один источник данных
Храните поля в одном модуле: стабильный slug, название, короткое описание, конечный адрес и дату проверки. В публичный список включайте только сведения, которые можно показывать посетителю. Секреты API и закрытые ставки в исходные данные сборки для браузера не передавайте. Для каждой карточки сформулируйте, кому подходит предложение и какие условия проверять.
Для экспорта задайте output: 'export' в конфигурации Next.js. Документация по статическому экспорту описывает выходную папку out и ограничения. Если хостинг ожидает /route/index.html, проверьте вариант с trailingSlash: true. Поведение зависит от сервера, поэтому откройте прямой адрес после выкладки.
Сгенерируйте страницы для известных slug
// app/offers/[slug]/page.tsx
import { offers } from '../../offers-data';
import { notFound } from 'next/navigation';
export function generateStaticParams() {
return offers.map(({ slug }) => ({ slug }));
}
export default async function Page({
params,
}: { params: Promise<{ slug: string }> }) {
const { slug } = await params;
const offer = offers.find(item => item.slug === slug);
if (!offer) notFound();
return <main><h1>{offer.title}</h1><p>{offer.description}</p></main>;
}
Пример предполагает, что app/offers-data.ts экспортирует массив offers. Сверьте документацию generateStaticParams для используемой версии. Для публичной карточки добавьте собственные метаданные, ссылку назад к списку и проверенное размещение. Не рассчитывайте, что новый slug появится на статическом сервере без сборки.
Проверьте выходную папку и обновление
Выполните npm run build на выбранном окружении. Проверьте, что в экспорте есть список и обе карточки. Поднимите локальный статический сервер для папки out и откройте карточку напрямую, а не только через клиентскую навигацию. Проверьте неизвестный slug, ссылки и мобильный экран.
Для обновления измените дату или описание одного оффера и сравните результаты сборки. Если оффер временно отключён, сохраните полезный материал и покажите статус. Старайтесь не менять slug при смене конечного продавца. Добавляйте фильтрацию по категории только после того, как работают базовые маршруты и отчёт о проверках.
Перед добавлением данных из внешнего сервиса определите, что произойдёт при недоступности API. Для первого каталога проще использовать последнюю проверенную выгрузку и помечать дату обновления. Не запускайте сборку поверх пустого набора, если импорт завершился с ошибкой. Иначе на статическом хостинге пропадут все существующие карточки.
Добавьте к сборке проверку уникальности slug. Если две записи получили один адрес, исправьте источник данных до выгрузки. Иначе страницы нельзя будет различить в каталоге и поисковых отчётах.