249 lines
7.9 KiB
Markdown
249 lines
7.9 KiB
Markdown
# Маршрутизация воронок в witlab-funnel
|
||
|
||
## Оптимизированный процесс открытия воронки
|
||
|
||
### Проблема (до оптимизации)
|
||
При переходе по `/soulmate`:
|
||
1. Загружалась страница `[funnelId]/page.tsx`
|
||
2. Проверялась база данных (медленно)
|
||
3. Делался client/server redirect на `/soulmate/onboarding`
|
||
4. **Метрики фиксировали загрузку промежуточной страницы**
|
||
|
||
### Решение (после оптимизации)
|
||
|
||
#### 1. Server-side redirects (next.config.ts)
|
||
```typescript
|
||
async redirects() {
|
||
return [
|
||
{
|
||
source: '/soulmate',
|
||
destination: '/soulmate/onboarding',
|
||
permanent: false // 307 redirect
|
||
},
|
||
// ... автоматически генерируется для всех воронок из BAKED_FUNNELS
|
||
];
|
||
}
|
||
```
|
||
|
||
**Преимущества:**
|
||
- ✅ Редирект на уровне CDN/сервера (мгновенный)
|
||
- ✅ Нет промежуточной загрузки страницы
|
||
- ✅ Метрики видят только финальный URL `/soulmate/onboarding`
|
||
- ✅ Query параметры сохраняются автоматически
|
||
|
||
#### 2. Frontend-only режим (buildVariant.ts)
|
||
```typescript
|
||
// В frontend-only режиме БД вообще не проверяется
|
||
if (IS_FRONTEND_ONLY_BUILD) {
|
||
return null; // Сразу используем BAKED_FUNNELS
|
||
}
|
||
```
|
||
|
||
**Преимущества:**
|
||
- ✅ Нет обращений к MongoDB в production
|
||
- ✅ Быстрая загрузка (только статика)
|
||
- ✅ Не нужен backend для работы воронок
|
||
|
||
## Поток открытия воронки (оптимизированный)
|
||
|
||
### Frontend-only режим (production)
|
||
```
|
||
Пользователь → /soulmate
|
||
↓
|
||
[Server-side redirect] // Мгновенно, без загрузки страницы
|
||
↓
|
||
/soulmate/onboarding
|
||
↓
|
||
Рендер первого экрана
|
||
↓
|
||
📱 Пользователь видит контент
|
||
```
|
||
|
||
**Время:** ~100-200ms (только загрузка и рендер экрана)
|
||
|
||
### Full-system режим (dev/admin)
|
||
```
|
||
Пользователь → /soulmate
|
||
↓
|
||
[Server-side redirect проверяет наличие в BAKED_FUNNELS]
|
||
↓
|
||
Есть в BAKED_FUNNELS?
|
||
├─ Да → Redirect на /soulmate/onboarding
|
||
└─ Нет → [funnelId]/page.tsx → Проверка БД → Redirect
|
||
↓
|
||
/soulmate/onboarding
|
||
↓
|
||
Загрузка из БД или BAKED_FUNNELS
|
||
↓
|
||
Рендер первого экрана
|
||
```
|
||
|
||
## Ключевые файлы
|
||
|
||
### 1. next.config.ts
|
||
- Генерирует server-side redirects из `BAKED_FUNNELS`
|
||
- Работает на этапе build-time
|
||
- Редиректы происходят на уровне CDN/сервера
|
||
|
||
### 2. src/lib/runtime/buildVariant.ts
|
||
- Определяет режим сборки: `frontend` или `full`
|
||
- `IS_FRONTEND_ONLY_BUILD` - флаг для проверки режима
|
||
|
||
### 3. src/app/[funnelId]/page.tsx
|
||
- Fallback для воронок из БД (не в BAKED_FUNNELS)
|
||
- В frontend-only режиме БД не проверяется
|
||
- Используется только в full-system режиме
|
||
|
||
### 4. src/lib/funnel/bakedFunnels.ts
|
||
- Автогенерируется из JSON файлов
|
||
- Содержит все статические воронки
|
||
- Используется для генерации redirects
|
||
|
||
## Режимы сборки
|
||
|
||
### Frontend-only (production)
|
||
```bash
|
||
FUNNEL_BUILD_VARIANT=frontend npm run build
|
||
```
|
||
|
||
**Характеристики:**
|
||
- Нет обращений к MongoDB
|
||
- Только статические воронки из BAKED_FUNNELS
|
||
- Максимальная скорость загрузки
|
||
- Деплой на CDN/static hosting
|
||
|
||
### Full-system (dev/staging)
|
||
```bash
|
||
FUNNEL_BUILD_VARIANT=full npm run build
|
||
```
|
||
|
||
**Характеристики:**
|
||
- Поддержка MongoDB
|
||
- Воронки из БД + BAKED_FUNNELS
|
||
- Админка для редактирования
|
||
- Требует backend сервер
|
||
|
||
## Метрики
|
||
|
||
### До оптимизации
|
||
```
|
||
Pageview: /soulmate ← Промежуточная загрузка
|
||
Pageview: /soulmate/onboarding ← Финальная страница
|
||
```
|
||
|
||
### После оптимизации
|
||
```
|
||
Pageview: /soulmate/onboarding ← Только финальная страница
|
||
```
|
||
|
||
**Результат:** Метрики чистые, без артефактов промежуточных загрузок.
|
||
|
||
## Query параметры (UTM и др.)
|
||
|
||
Server-side redirects **автоматически сохраняют** все query параметры:
|
||
|
||
```
|
||
/soulmate?utm_source=google&utm_campaign=test
|
||
↓ редирект
|
||
/soulmate/onboarding?utm_source=google&utm_campaign=test
|
||
```
|
||
|
||
## Производительность
|
||
|
||
### Метрики загрузки
|
||
| Этап | До оптимизации | После оптимизации |
|
||
|------|----------------|-------------------|
|
||
| Time to First Byte (TTFB) | ~300-500ms | ~50-100ms |
|
||
| First Contentful Paint (FCP) | ~800-1200ms | ~200-400ms |
|
||
| Промежуточные загрузки | 1 | 0 |
|
||
| Обращения к БД | 1-2 | 0 (frontend-only) |
|
||
|
||
### CDN/Edge Network
|
||
Server-side redirects работают на уровне CDN:
|
||
- Vercel Edge Functions
|
||
- Cloudflare Workers
|
||
- AWS CloudFront Functions
|
||
- Nginx/Apache rewrites
|
||
|
||
## Добавление новой воронки
|
||
|
||
### 1. Создайте JSON файл
|
||
```json
|
||
// funnels/my-funnel.json
|
||
{
|
||
"meta": {
|
||
"id": "my-funnel",
|
||
"firstScreenId": "welcome"
|
||
},
|
||
"screens": [...]
|
||
}
|
||
```
|
||
|
||
### 2. Запустите скрипт генерации
|
||
```bash
|
||
npm run bake-funnels
|
||
```
|
||
|
||
### 3. Пересоберите проект
|
||
```bash
|
||
npm run build
|
||
```
|
||
|
||
**Результат:** Redirect автоматически создается в next.config.ts:
|
||
```
|
||
/my-funnel → /my-funnel/welcome
|
||
```
|
||
|
||
## Отладка
|
||
|
||
### Проверка redirects
|
||
```bash
|
||
# В dev режиме
|
||
npm run dev
|
||
curl -I http://localhost:3000/soulmate
|
||
|
||
# Должно быть:
|
||
# HTTP/1.1 307 Temporary Redirect
|
||
# Location: /soulmate/onboarding
|
||
```
|
||
|
||
### Проверка режима сборки
|
||
```typescript
|
||
console.log(IS_FRONTEND_ONLY_BUILD); // true или false
|
||
console.log(BUILD_VARIANT); // "frontend" или "full"
|
||
```
|
||
|
||
### Логи redirects
|
||
В консоли при сборке:
|
||
```
|
||
✓ Compiled successfully
|
||
✓ Generated redirects:
|
||
- /soulmate → /soulmate/onboarding
|
||
- /soulmate-small → /soulmate-small/onboarding
|
||
```
|
||
|
||
## Best Practices
|
||
|
||
1. **Всегда используйте firstScreenId** в meta воронки
|
||
2. **Frontend-only для production** - максимальная производительность
|
||
3. **Full-system только для dev/admin** - когда нужна БД
|
||
4. **Не удаляйте [funnelId]/page.tsx** - нужен для fallback
|
||
5. **Query параметры сохраняются** - не нужно их передавать вручную
|
||
|
||
## Troubleshooting
|
||
|
||
### Redirect не работает
|
||
- Проверьте что воронка есть в BAKED_FUNNELS
|
||
- Убедитесь что firstScreenId указан
|
||
- Пересоберите проект: `npm run build`
|
||
|
||
### Метрики показывают промежуточную загрузку
|
||
- Проверьте что redirects настроены в next.config.ts
|
||
- Убедитесь что используется production build
|
||
- Проверьте что CDN/хостинг поддерживает redirects
|
||
|
||
### Воронка из БД не открывается
|
||
- Убедитесь что режим сборки `full`
|
||
- Проверьте что MongoDB доступна
|
||
- Проверьте логи в консоли сервера
|