К содержанию
WildRussia205 маршрутов · 24 по России205 маршрутовО проекте

О проекте

Техническое описание WildRussia demo

Демо создано для вакансии разработчика нового сайта WildRussia. Ниже перечислено только то, что реализовано в текущем репозитории.

Данные
205 маршрутов
География
8 стран и регионов
Web
Astro SSR + static routes
Аудит
4 категории × 100

Главный результат оптимизации

Mobile PageSpeed: 100 во всех основных категориях

Официальные отчёты Google для развёрнутого демо подтверждают скорость главной страницы и SSR-каталога в режиме Slow 4G.

Главная

https://wildrussia-demo.id0.it/
Открыть отчёт ↗
Performance
100
Accessibility
100
Best Practices
100
SEO
100
TTFB
0 мс
FCP
0,9 с
LCP
1,2 с
Speed Index
0,9 с
TBT
0 мс
CLS
0

10 июля 2026, 06:37 GMT+3

Каталог

https://wildrussia-demo.id0.it/catalog/
Открыть отчёт ↗
Performance
100
Accessibility
100
Best Practices
100
SEO
100
TTFB
20 мс
FCP
0,9 с
LCP
1,4 с
Speed Index
1,1 с
TBT
0 мс
CLS
0

10 июля 2026, 06:29 GMT+3

Что обеспечило результат

  • HTML до JavaScript. Главная собирается статически, каталог отдаёт начальную выдачу через SSR.
  • Гидратация только по необходимости. Vue подключается для поиска, фильтров и формы; PageSpeed фиксирует TBT 0 мс.
  • Стабильная геометрия. Изображения и контролы имеют явные размеры, поэтому CLS равен 0 на обеих страницах.
  • Приоритет критических ресурсов. Локальные шрифты, responsive images и fetchpriority удерживают LCP в пределах 1,2–1,4 с.

Это лабораторные mobile-замеры Lighthouse 13.4.0 на эмуляции Moto G Power и Slow 4G. CrUX пока не показывает field data: у нового демо недостаточно реального пользовательского трафика.

01

Реализованный функционал

Список сгруппирован по владельцам и пользовательским сценариям.

apps/web · /

Главная страница

  • Статический Astro-маршрут Основной HTML формируется во время сборки без обязательной клиентской гидратации всей страницы.

  • Быстрый подбор тура Форма передаёт в каталог поисковую строку, формат путешествия и месяц через URL-параметры.

  • Автодополнение поиска Подсказки собираются из названий, направлений, стран и типов путешествий текущего каталога.

  • Популярные маршруты Карточки строятся из тех же fixtures и web-проекций, что используются каталогом.

  • Оптимизированный первый экран Hero-изображение имеет явные размеры, responsive-набор и высокий приоритет загрузки.

apps/web · /catalog/

Каталог туров

  • SSR-выдача Начальный список фильтруется на сервере по URL запроса и присутствует в HTML до запуска Vue.

  • Полнотекстовый поиск Поиск работает по названию, описанию, направлению, стране и форматам путешествия.

  • Многопараметрические фильтры Реализованы направление, страна, тип тура, месяц, сложность и диапазон длительности.

  • Предсказуемая логика комбинаций Значения внутри одной группы объединяются через OR, разные группы — через AND.

  • Сортировка Доступны ближайшая дата, название, длительность и цена, а также направление сортировки.

  • URL как состояние Фильтры, поиск, сортировка и страница сериализуются в URL и восстанавливаются после загрузки.

  • Активные фильтры Выбранные значения показываются отдельными тегами; каждый тег можно снять независимо или очистить всё.

  • Пагинация Astro BFF отдаёт страницы по 24 маршрута, валидирует page/pageSize и ограничивает выход за диапазон.

  • Асинхронная загрузка Повторные запросы отменяются через AbortController; предусмотрены loading, empty и error states.

  • Responsive-изображения BFF подготавливает отдельную web-модель карточки и метаданные изображений, не меняя доменный Tour.

apps/web · /tours/[slug]/

Карточка тура

  • Статические страницы Для каждого тура создаётся отдельный маршрут через getStaticPaths.

  • Основные факты На странице показаны страна, направление, форматы, длительность, сложность, даты и цена, если они есть.

  • Программа по дням Маршрут отображается последовательным timeline из доменного itinerary.

  • Состав тура Отдельно выводятся включённые и исключённые услуги.

  • Оптимизация медиа Локальные изображения обрабатываются Astro Picture в AVIF/WebP с responsive widths.

  • Форма заявки Vue-форма гидратируется в idle, проверяет поля и отправляет данные типизированным Eden-клиентом.

  • 152-ФЗ Без явного согласия на обработку персональных данных форма не отправляется; ошибки API выводятся пользователю.

packages/catalog-data + apps/api

Данные и API

  • Парсер исходного сайта Cheerio извлекает данные тура из публичного HTML WildRussia.

  • Единый Tour-контракт Zod-схема валидирует slug, контент, даты, цену, сложность, itinerary, медиа и SEO-поля.

  • Fixtures Сгенерированные записи объединяются с curated-данными и повторно валидируются при импорте.

  • Общая доменная логика Фильтрация, сортировка, facets и разбор query принадлежат catalog-data и не копируются в API или web.

  • Elysia API Реализованы health, facets, список туров, тур по slug и приём заявки.

  • Типизированный клиент Browser-вызовы Elysia проходят через Eden Treaty; прямые raw fetch к API запрещены архитектурной проверкой.

  • Boundary validation Некорректные query/body получают 400 с путём проблемного поля; неожиданные response errors скрываются за безопасным 500.

  • Защита персональных данных API не возвращает и не логирует исходный e-mail заявки; в подтверждении используется маска.

apps/web · build/runtime

SEO и производительность

  • Технические метаданные BaseLayout формирует title, description и canonical для каждой страницы.

  • Индексируемые маршруты robots.txt и sitemap.xml содержат главную, каталог и статические карточки туров.

  • Структурированные данные Карточка тура публикует JSON-LD типа TouristTrip с описанием и itinerary.

  • Минимальный JavaScript Статический HTML используется по умолчанию; интерактивность подключается отдельными Vue islands.

  • Шрифты и изображения Golos Text поставляется локально, изображения имеют размеры, responsive sources и современные форматы.

  • Детерминированный Lighthouse gate Production build проверяется в чистом профиле Chrome; главная, каталог и карточка тура должны получить 100 во всех четырёх категориях.

repository + runtime

Архитектура и качество

  • pnpm-монорепозиторий Web, API, catalog-data, style-system и общие конфигурации разделены по владельцам.

  • Presentation BFF Каталог получает paginated web DTO через /catalog/routes.json; этот DTO не подменяет доменный Tour.

  • Style system Lism используется только как reset; проект владеет токенами, слоями, primitives и product-компонентами.

  • Архитектурные проверки Скрипты контролируют CSS layers, raw values, selector ownership, API-клиент и порядок стилей в production build.

  • Автоматические тесты Покрыты scraper, фильтры, API validation, API/BFF parity, pagination, response guards и proxy boundary.

  • Production runtime Web и API собираются отдельными Dockerfiles; web проксирует /api и предоставляет health endpoint.

02

Как проходят данные

Доменная логика остаётся в catalog-data; транспортные и presentation-слои её только вызывают.

  1. wildrussia.travel HTMLИсходная публичная разметка.
  2. scraper.ts + ZodПарсинг, нормализация и проверка.
  3. packages/catalog-dataFixtures, Tour, query, facets, filters и sorting.
  4. apps/api / Astro BFFElysia API для доменных данных и заявок; BFF для paginated web DTO.
  5. Astro + Vue islandsHTML страниц и локальная интерактивность каталога и форм.

03

Маршруты и API

Основные публичные поверхности текущего демо.

Web

GET/
Статическая главная страница
GET/catalog/
SSR-каталог с начальной выдачей из URL query
GET/catalog/routes.json
Presentation BFF: фильтрация, пагинация и web DTO
GET/tours/[slug]/
Статические карточки всех туров
ANY/api/[...path]
Same-origin proxy к Elysia API
GET/health
Healthcheck web-сервиса

Elysia API

GET/health
Состояние API
GET/api/facets
Полный набор доступных facets
GET/api/tours
Отфильтрованный список Tour и разобранный query
GET/api/tours/:slug
Один Tour по slug
POST/api/leads
Валидация и приём заявки с согласием 152-ФЗ

04

Проверки и результаты

Команды, которые формируют текущий release gate.

  • pnpm lint:style
  • pnpm lint
  • pnpm lint:architecture
  • pnpm typecheck
  • pnpm test
  • pnpm build
  • pnpm perf:audit