# Оптимизация производительности
## Реализованные оптимизации
### 1. Оптимизация изображений и ресурсов
#### Next.js Image компонент
- ✅ Используется `next/image` для автоматической оптимизации
- ✅ Поддержка форматов AVIF и WebP
- ✅ Адаптивные размеры для разных устройств
- ✅ Ленивая загрузка по умолчанию
**Конфигурация** (`next.config.js`):
```javascript
images: {
formats: ['image/avif', 'image/webp'],
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
domains: process.env.NEXT_PUBLIC_IMAGE_DOMAINS?.split(',') || [],
minimumCacheTTL: 60,
}
```
**Использование**:
```tsx
import AccessibleImage from '@/components/AccessibleImage';
```
#### Сжатие (gzip/brotli)
- ✅ Включено автоматическое сжатие в Next.js
- ✅ Поддержка gzip и brotli
- ✅ Настраивается через `compress: true` в `next.config.js`
#### Минификация CSS и JavaScript
- ✅ SWC минификация включена (`swcMinify: true`)
- ✅ Автоматическая минификация в production сборке
- ✅ Source maps отключены в production для уменьшения размера
#### CDN для статических ресурсов
- ✅ Настройка доменов изображений через `NEXT_PUBLIC_IMAGE_DOMAINS`
- ✅ Кэширование статических ресурсов
- ✅ Рекомендуется использовать Vercel, Cloudflare или AWS CloudFront
**Настройка**:
```env
NEXT_PUBLIC_IMAGE_DOMAINS=cdn.example.com,images.example.com
```
### 2. Lazy Loading
#### React.lazy для компонентов
- ✅ Реализован `lib/performance/lazy-components.tsx`
- ✅ Lazy загрузка модальных окон
- ✅ Lazy загрузка страниц для code splitting
**Использование**:
```tsx
import { LazyAIAgentModal, LazyComponentWrapper } from '@/lib/performance/lazy-components';
```
#### Виртуализация списков
- ✅ Реализован `VirtualizedList` компонент
- ✅ Использует `react-window` для рендеринга больших списков
- ✅ Рендерит только видимые элементы
**Использование**:
```tsx
import VirtualizedList from '@/components/VirtualizedList';
{item.name}
}
/>
```
#### Intersection Observer для отложенной загрузки
- ✅ Реализован хук `useIntersectionObserver`
- ✅ Компонент `LazyLoad` для отложенной загрузки контента
**Использование**:
```tsx
import { LazyLoad } from '@/lib/performance/intersection-observer';
Загрузка...}>
```
### 3. Оптимизация базы данных
#### Индексы
- ✅ Базовые индексы в `schema.sql`
- ✅ Дополнительные оптимизированные индексы в `optimization-indexes.sql`
- ✅ Составные индексы для частых запросов
- ✅ Частичные индексы для активных записей
- ✅ GIN индексы для полнотекстового поиска
**Выполнение**:
```bash
psql -U postgres -d klg_db -f lib/database/optimization-indexes.sql
```
#### Оптимизация запросов
- ✅ Утилиты в `lib/database/query-optimizer.ts`
- ✅ Пакетное выполнение запросов
- ✅ Оптимизированная пагинация
- ✅ Полнотекстовый поиск с использованием индексов
**Использование**:
```typescript
import { paginatedQuery, fullTextSearch } from '@/lib/database/query-optimizer';
// Пагинация
const result = await paginatedQuery(
'SELECT * FROM aircraft WHERE status = $1',
1, // page
50, // pageSize
['Активен'],
'created_at DESC'
);
// Полнотекстовый поиск
const results = await fullTextSearch(
'aircraft',
'registration_number',
'RA-12345',
['aircraft_type', 'operator_id']
);
```
#### Connection Pooling
- ✅ Реализован в `lib/database/connection.ts`
- ✅ Настраиваемый размер пула
- ✅ Автоматическое управление соединениями
- ✅ Timeout для idle соединений
**Настройка**:
```env
DB_POOL_MAX=20
DB_PORT=5432
```
#### Read Replicas
- ✅ Реализована поддержка в `lib/database/read-replica.ts`
- ✅ Автоматический fallback на primary при ошибке replica
- ✅ Разделение запросов на чтение и запись
**Настройка**:
```env
# Primary (для записи)
DB_HOST=primary.example.com
DB_PORT=5432
# Replica (для чтения)
DB_REPLICA_HOST=replica.example.com
DB_REPLICA_PORT=5432
DB_REPLICA_NAME=klg_db
DB_REPLICA_USER=postgres
DB_REPLICA_PASSWORD=password
DB_REPLICA_POOL_MAX=20
```
**Использование**:
```typescript
import { readQuery, writeQuery } from '@/lib/database/read-replica';
// Чтение (использует replica)
const result = await readQuery('SELECT * FROM aircraft');
// Запись (использует primary)
await writeQuery('INSERT INTO aircraft ...');
```
## Рекомендации по использованию
### Изображения
1. Всегда используйте `AccessibleImage` вместо обычного `
`
2. Указывайте `priority={true}` только для критических изображений (above the fold)
3. Используйте CDN для статических изображений
4. Оптимизируйте изображения перед загрузкой (сжатие, правильные размеры)
### Lazy Loading
1. Используйте `React.lazy` для больших компонентов и модальных окон
2. Применяйте `LazyLoad` для контента ниже fold
3. Виртуализируйте списки с более чем 100 элементами
### База данных
1. Регулярно обновляйте статистику: `ANALYZE table_name;`
2. Мониторьте медленные запросы через `EXPLAIN ANALYZE`
3. Используйте read replicas для распределения нагрузки
4. Применяйте пагинацию для больших выборок
5. Используйте индексы для часто запрашиваемых полей
## Мониторинг производительности
### Метрики для отслеживания
- Время загрузки страниц
- Размер bundle
- Количество запросов к БД
- Время выполнения запросов
- Использование памяти
### Инструменты
- Next.js Analytics
- Lighthouse
- PostgreSQL `pg_stat_statements`
- Sentry Performance Monitoring
## Дополнительные оптимизации
### Кэширование
- Используйте Redis для кэширования частых запросов
- Настройте CDN кэширование для статических ресурсов
- Применяйте SWR для клиентского кэширования
### Code Splitting
- Динамические импорты для больших библиотек
- Route-based code splitting (автоматически в Next.js)
- Component-based code splitting с React.lazy
### Bundle Optimization
- Анализ bundle размера: `npm run build -- --analyze`
- Удаление неиспользуемого кода
- Tree shaking для библиотек