w-funnel/docs/FUNNEL_ROUTING.md
dev.daminik00 3a30f83fe5 fix
2025-10-30 13:26:26 +01:00

249 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Маршрутизация воронок в 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 доступна
- Проверьте логи в консоли сервера