Performance Optimization
Profiling and optimization strategies for Ring Platform applications.
⚡ React 19 Performance Patterns
Server Components Optimization
// Fetch data at the server component level
export default async function EntitiesPage() {
// This runs on the server, reducing client-side work
const entities = await getEntities()
return (
<div>
<EntitiesList entities={entities} />
<ClientComponent />
</div>
)
}
useOptimistic Hook
import { useOptimistic } from 'react'
export function EntityForm({ entities, addEntity }) {
const [optimisticEntities, addOptimisticEntity] = useOptimistic(
entities,
(state, newEntity) => [...state, { ...newEntity, id: 'temp-' + Date.now() }]
)
async function handleSubmit(formData) {
addOptimisticEntity(formData)
await addEntity(formData)
}
return (
<form action={handleSubmit}>
{/* Form fields */}
</form>
)
}
🚀 Next.js 15 Optimizations
Static Generation
// Generate static pages at build time
export async function generateStaticParams() {
const entities = await getPublicEntities()
return entities.map((entity) => ({
id: entity.id
}))
}
export default async function EntityPage({ params }) {
const entity = await getEntity(params.id)
return <EntityDetails entity={entity} />
}
Edge Runtime
// Use Edge Runtime for faster cold starts
export const runtime = 'edge'
export async function GET(request: Request) {
const { searchParams } = new URL(request.url)
const query = searchParams.get('q')
// Fast API response from edge
return Response.json({ results: await searchEntities(query) })
}
📦 Bundle Optimization
Code Splitting
// Dynamic imports for code splitting
import dynamic from 'next/dynamic'
const HeavyComponent = dynamic(() => import('./HeavyComponent'), {
loading: () => <p>Loading...</p>,
ssr: false // Skip SSR for client-only components
})
export default function Page() {
return (
<div>
<h1>Page Content</h1>
<HeavyComponent />
</div>
)
}
Tree Shaking
// Import only what you need
import { debounce } from 'lodash/debounce' // ✅ Good
import _ from 'lodash' // ❌ Imports entire library
// Use ES modules for better tree shaking
import { Button } from '@/components/ui' // ✅ Tree-shakeable
🎯 Performance Monitoring
Комплексне відстеження Web Vitals
// Використання WebVitalsCollector для комплексного моніторингу
import { startWebVitalsCollection, setWebVitalsUserId } from '@/lib/web-vitals'
// В app/layout.tsx або компоненті
useEffect(() => {
// Почати збір метрик
startWebVitalsCollection()
// Встановити ID користувача для персоналізації
if (session?.user?.id) {
setWebVitalsUserId(session.user.id)
}
}, [session?.user?.id])
// Отримати поточний performance score
const performanceScore = getWebVitalsScore() // 0-100
Web Vitals API з автоматичною звітністю
// lib/web-vitals.tsx - автоматичний збір Core Web Vitals
export const PERFORMANCE_THRESHOLDS = {
LCP: { good: 2500, poor: 4000 }, // Largest Contentful Paint
FID: { good: 100, poor: 300 }, // First Input Delay
CLS: { good: 0.1, poor: 0.25 }, // Cumulative Layout Shift
FCP: { good: 1800, poor: 3000 }, // First Contentful Paint
TTFB: { good: 800, poor: 1800 }, // Time to First Byte
INP: { good: 200, poor: 500 }, // Interaction to Next Paint
}
// Автоматичний звіт на /api/analytics/web-vitals
const collector = getWebVitalsCollector()
await collector.startCollection() // Збирає CLS, FCP, LCP, TTFB, INP
Performance Profiling
// Use React Profiler for component performance
import { Profiler } from 'react'
function onRender(id, phase, actualDuration, baseDuration, startTime, commitTime) {
// Log or send to analytics
console.log('Performance:', {
component: id,
phase,
duration: actualDuration
})
}
export default function App() {
return (
<Profiler id="App" onRender={onRender}>
<MainContent />
</Profiler>
)
}
🗄️ Database Optimization
PostgreSQL Query Optimization з Database Abstraction Layer
// Використання db.command() для абстракції запитів
import { getDatabaseService } from '@/lib/database'
const dbService = getDatabaseService()
// Оптимізований запит з фільтрами та пагінацією
const opportunitiesResult = await dbService.query({
collection: 'opportunities',
filters: [
{ field: 'type', operator: '==', value: 'request' },
{ field: 'status', operator: '==', value: 'active' }
],
orderBy: [{ field: 'created_at', direction: 'desc' }],
limit: 20,
offset: 0
})
React 19 Cache для дедуплікації запитів
// Кешування запитів vendor profiles
import { cache } from 'react'
export const getVendorByUserId = cache(async (userId: string): Promise<VendorLookupResult> => {
const dbService = getDatabaseService()
const vendorResult = await dbService.query({
collection: 'vendor_profiles',
filters: [
{ field: 'user_id', operator: '==', value: userId }
]
})
return vendorResult.success && vendorResult.data?.length > 0
? { found: true, vendorProfile: vendorResult.data[0] }
: await createPendingVendorProfile(userId)
})
// Кілька викликів getVendorByUserId(userId) будуть дедупліковані
🖼️ Image Optimization
Next.js Image Component
export function EntityAvatar({ entity }) {
return (
<Image
src={entity.avatar}
alt={entity.name}
width={64}
height={64}
priority={entity.featured} // Load important images first
placeholder="blur"
blurDataURL="data:image/jpeg;base64,..."
/>
)
}
📊 Performance Metrics
Цільові метрики Ring Platform
- Largest Contentful Paint (LCP): < 2.5s
- First Input Delay (FID): < 100ms (INP < 200ms)
- Cumulative Layout Shift (CLS): < 0.1
- First Contentful Paint (FCP): < 1.8s
- Time to First Byte (TTFB): < 800ms
- Performance Score: > 90 (Lighthouse)
Production Monitoring
Kubernetes Pod Metrics
Моніторинг ресурсів pod'ів Prometheus метрики Grafana dashboards
kubectl top pods -n ring-platform-org
kubectl port-forward svc/prometheus 9090:9090 -n monitoring
kubectl port-forward svc/grafana 3000:3000 -n monitoring
Database Performance
-- Моніторинг PostgreSQL метрик
sql
SELECT * FROM pg_stat_activity;
SELECT * FROM pg_stat_user_tables;
-- Connection pooling метрики
SHOW POOL_NODES; -- PgBouncer
Інструменти розробки
Lighthouse CI Integration
.github/workflows/ci.yml
- name: Lighthouse CI
uses: treosh/lighthouse-ci-action@v10
with:
urls: https://ring-platform.org
configPath: .lighthouserc.json
Bundle Analysis
Аналіз розміру бандлу після збірки Webpack Bundle Analyzer
npm run build
npm run analyze
npx webpack-bundle-analyzer .next/static/chunks/
React DevTools Profiler
// В development режимі
if (process.env.NODE_ENV === 'development') {
// React DevTools Profiler активний
// Використовуйте Performance tab для аналізу
}
Оптимізації для Kubernetes
Edge Runtime Optimization
// app/api/search/route.ts - Edge функції для швидкого пошуку
export const runtime = 'edge'
export async function GET(request: Request) {
const { searchParams } = new URL(request.url)
const query = searchParams.get('q')
// Швидкий пошук без cold starts
return Response.json(await searchOpportunities(query))
}
Connection Pooling
// lib/database.ts - PgBouncer connection pooling
export const dbConfig = {
host: process.env.DB_HOST,
port: 6432, // PgBouncer port
database: process.env.DB_NAME,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
max: 20, // Максимум 20 з'єднань
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 2000,
}
🚀 Production-Ready Performance
Ring Platform використовує сучасні інструменти для забезпечення високої продуктивності: Next.js 15 App Router, React 19 з Server Components, PostgreSQL з connection pooling, Redis для кешування, та Kubernetes для оркестрації.