14 KiB
☁️ BROJS.RU Landing - Полная документация
📋 Оглавление
- Обзор проекта
- Структура проекта
- Static Site Generation (SSG)
- Страница пользовательского соглашения
- Команды и скрипты
- Технологии
- Deployment
Обзор проекта
BROJS.RU Landing - это статический лендинг платформы обучения фронтенд-разработке на базе React + SSG.
Особенности:
✅ React 18 с TypeScript
✅ Static Site Generation - HTML вкомпилирован для SEO
✅ Chakra UI - современный UI framework
✅ i18next - мультиязычность (ru/en)
✅ React Router - клиентский роутинг
✅ Hydration - гидратация статического контента
Страницы:
/- главная страница "в разработке"/terms- пользовательское соглашение (полное, SEO-оптимизировано)
Структура проекта
bro.landing/
├── src/
│ ├── pages/
│ │ ├── under-construction/ # Главная страница
│ │ ├── terms/ # Пользовательское соглашение
│ │ └── index.ts # Экспорт страниц
│ ├── app.tsx # Root компонент
│ ├── dashboard.tsx # Роутинг
│ ├── index.tsx # Entry point + hydration
│ └── index.ejs # HTML шаблон
├── scripts/
│ ├── prerender-multi.js # ⭐ Основной SSG скрипт
│ └── ssr-prerender.js # Альтернативный SSR
├── dist/ # Сборка (генерируется)
│ ├── index.html # Главная (SSG)
│ ├── terms.html # Соглашение (SSG)
│ └── index.js # React bundle
├── package.json
└── cloud.md # 📚 Эта документация
Static Site Generation (SSG)
Как работает?
- Webpack собирает React →
dist/index.js - Скрипт
prerender-multi.jsавтоматически:- Читает
dist/index.html(пустой шаблон) - Вставляет статический контент в
<div id="app"></div> - Генерирует
dist/terms.htmlизterma.md
- Читает
- React hydration при загрузке оживляет статический HTML
Преимущества SSG:
- 🚀 Быстрая загрузка - контент виден до загрузки JS
- 🔍 SEO - поисковики индексируют полный HTML
- ♿ Доступность - работает без JavaScript
- 📊 Метрики - улучшенные FCP и LCP
Hydration в index.tsx:
const hasPrerenderedContent = MOUNT_NODE.hasChildNodes();
if (hasPrerenderedContent) {
hydrateRoot(MOUNT_NODE, <App />); // Оживляем статику
} else {
createRoot(MOUNT_NODE).render(<App />); // Обычный рендер
}
Скрипт prerender-multi.js:
Что делает:
- Читает
terma.md(исходник соглашения) - Парсит markdown → HTML со стилями
- Создает
dist/index.htmlс контентом главной - Создает
dist/terms.htmlс полным соглашением (~13KB)
Автоматический запуск:
npm run build:prod- после webpack сборкиnpm run build:prod:ssr- альтернативный SSR
Страница пользовательского соглашения
Источник: terma.md
⚠️ Важно: terma.md - единственный источник правды для соглашения!
Чтобы обновить соглашение:
- Отредактируйте
terma.md - Запустите
npm run build:prod dist/terms.htmlобновится автоматически
Структура terma.md:
Пользовательское соглашение для BROJS.RU
Последнее обновление: 25 мая 2025 г.
1. Термины
...
10. Контакты
Для обращений: primakov.pro@yandex.ru
React компонент: Terms.tsx
- Путь:
src/pages/terms/Terms.tsx - Дизайн: Chakra UI, официальный стиль документа
- SEO: Helmet с meta-тегами
- Роут:
/termsв dashboard.tsx
SEO-версия: terms.html
Генерируется автоматически из terma.md:
<title>Пользовательское соглашение - BROJS.RU</title>
<meta name="description" content="Полное пользовательское соглашение..." />
<div id="app">
<div style="...красивые стили...">
<h1>Пользовательское соглашение для BROJS.RU</h1>
<h2>1. Термины</h2>
<ul>
<li>Платформа — сайт https://brojs.ru ...</li>
...
</ul>
<!-- Все 10 разделов -->
</div>
</div>
Размер: ~13.6 KB (полный текст + стили)
Содержание: Все 10 разделов с подразделами
Ссылки: Рабочие теги на email и сайты
Важные детали:
✅ Название сайта: BROJS.RU (не BRO-JS.RU)
✅ Авторизация: Yandex + Email (Google и VK исключены)
✅ Email: primakov.pro@yandex.ru
Команды и скрипты
NPM Scripts:
{
"start": "brojs server --port=8099 --with-open-browser",
"build": "npm run clean && brojs build --dev",
"build:prod": "npm run clean && brojs build && node scripts/prerender-multi.js",
"build:prod:ssr": "npm run clean && brojs build && node scripts/ssr-prerender.js",
"clean": "rimraf dist",
"eslint": "npx eslint src",
"prettier": "prettier --write .",
"test": "jest --coverage"
}
Использование:
🔧 Разработка:
npm start
# → Запускает dev сервер на http://localhost:8099/
# → Hot reload включен
# → Без SSG (быстро)
🏗️ Dev сборка:
npm run build
# → Webpack в dev режиме
# → Без минификации
# → Без SSG
# → Результат: dist/index.html (пустой шаблон)
🚀 Production сборка (с SSG):
npm run build:prod
# → Webpack в production режиме
# → Минификация
# → Автоматический SSG (prerender-multi.js)
# → Результат:
# - dist/index.html (со статическим контентом)
# - dist/terms.html (полное соглашение для SEO)
Вывод:
✅ Сборка успешно завершена!
🚀 Начинаем мульти-страничный пре-рендеринг...
✅ index.html обновлен
📝 Генерируем полный HTML из terma.md...
✅ terms.html создан с полным контентом
🎉 Пре-рендеринг завершен успешно!
🔄 Production сборка (альтернативный SSR):
npm run build:prod:ssr
# → Использует ssr-prerender.js
# → SSR с jsdom окружением
# → Результат аналогичен build:prod
Другие команды:
npm run clean # Удалить dist/
npm run eslint # Проверить код
npm run prettier # Форматировать код
npm run test # Запустить тесты
Технологии
Frontend:
- React 18.3 - UI библиотека
- TypeScript - типизация
- Chakra UI 2.8 - компоненты и стили
- Emotion - CSS-in-JS
- React Router 6 - роутинг
- React Helmet - управление <head>
State & i18n:
- Redux Toolkit - state management
- i18next - интернационализация
- i18next-browser-languagedetector - автоопределение языка
Build & Dev:
- @brojs/cli 1.9.5 - сборщик (обертка над webpack)
- Webpack 5 - бандлер
- Babel - транспиляция
- jsdom - SSR окружение
Дополнительно:
- Lottie React - анимации
- Day.js - работа с датами
- ESLint - линтинг
- Prettier - форматирование
- Jest - тестирование
Deployment
Docker + Nginx:
Проект разворачивается через Docker контейнер с Nginx.
Скрипты:
d-scripts/up-nginx.sh- запуск контейнераd-scripts/stop.sh- остановкаd-scripts/re-run.sh- перезапуск
Процесс:
# 1. Сборка
npm run build:prod
# 2. Deploy
npm run redeploy
# → Устанавливает зависимости
# → Собирает проект
# → Перезапускает Docker контейнер
Конфигурация Nginx:
Nginx раздает папку dist/:
https://brojs.ru/ → dist/index.html
https://brojs.ru/terms → React Router → terms.html (fallback)
https://brojs.ru/terms.html → dist/terms.html (прямой доступ)
https://brojs.ru/index.js → dist/index.js
Важно для SEO:
- index.html содержит статический контент (SSG)
- terms.html содержит полное соглашение (SSG)
- React Router работает на клиенте для SPA навигации
- Fallback на статические .html файлы для ботов
🎯 Чеклист при обновлениях
Обновление пользовательского соглашения:
- Отредактировать
terma.md - Проверить что нет Google/VK (только Yandex + Email)
- Проверить что название сайта: BROJS.RU
- Запустить
npm run build:prod - Проверить
dist/terms.html(должен быть ~13KB) - Задеплоить:
npm run redeploy
Добавление новой страницы:
- Создать компонент в
src/pages/ - Экспортировать в
src/pages/index.ts - Добавить роут в
src/dashboard.tsx - Если нужен SSG - обновить
scripts/prerender-multi.js - Собрать и проверить
Перед деплоем:
npm run eslint- проверить кодnpm run prettier- форматироватьnpm run test- запустить тестыnpm run build:prod- собрать- Проверить
dist/index.htmlиdist/terms.html npm run redeploy- задеплоить
🐛 Troubleshooting
Проблема: terms.html пустой или куцый
Решение: Проверьте terma.md - это единственный источник контента.
npm run build:prod
# Проверьте вывод:
# ✅ terms.html создан с полным контентом
Проблема: Hydration warning
Причина: Несоответствие серверного и клиентского HTML.
Решение: Проверьте что контент в prerender-multi.js совпадает с React компонентом.
Проблема: 404 на /terms
Nginx: Убедитесь что настроен fallback на index.html:
try_files $uri $uri/ /index.html;
Проблема: SSG не запускается
Проверьте:
scripts/prerender-multi.jsсуществует- В
package.jsonправильная команда:build:prod - Нет ошибок в webpack сборке
📚 Полезные ссылки
- Сайт: https://brojs.ru
- Email: primakov.pro@yandex.ru
- Keycloak: PostgreSQL (auth)
- Gravatar: https://gravatar.com
📝 История изменений
v2.0.2 (2025-10-24)
- ✨ Добавлена страница
/termsс пользовательским соглашением - 🎨 Официальный дизайн юридического документа
- 📄 Автоматическая генерация
terms.htmlизterma.md - 🔍 SEO-оптимизация (13.6KB полного контента)
- 🔄 Название сайта: BRO-JS.RU → BROJS.RU
- 🔐 Авторизация: только Yandex + Email
- 🧹 Очистка скриптов (удален postbuild, лишние файлы)
v2.0.1 (2025-10-24)
- 🚀 Static Site Generation (SSG)
- 💡 React 18 hydration
- 📚 Документация по SSG
Вопросы? → primakov.pro@yandex.ru
Документация актуальна: 2025-10-24