Frontend Patterns

SkillMedia

React, Next.js, TypeScript frontend patterns - component design, state management, performance

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Frontend Patterns skill

What this skill tells your AI

The instructions your AI receives, as published by vibeeval/vibecosystem in skills/frontend-patterns/SKILL.md and read by ahel’s review.

Component Design

Composition over Inheritance

// DOGRU: Composition
function Card({ children, header }: { children: ReactNode; header: ReactNode }) {
  return (
    <div className="card">
      <div className="card-header">{header}</div>
      <div className="card-body">{children}</div>
    </div>
  );
}

// Kullanim
<Card header={<h2>Title</h2>}>
  <p>Content here</p>
</Card>

Container/Presenter Pattern

// Container: Data fetching + logic
function UserListContainer() {
  const { data, isLoading } = useQuery(['users'], fetchUsers);
  if (isLoading) return <Skeleton />;
  return <UserList users={data} />;
}

// Presenter: Pure rendering
function UserList({ users }: { users: User[] }) {
  return (
    <ul>
      {users.map(u => <UserItem key={u.id} user={u} />)}
    </ul>
  );
}

State Management

CozumNe ZamanKarmasiklik
useStateLocal component stateDusuk
useReducerComplex local stateOrta
ContextTheme, auth, localeDusuk-Orta
ZustandGlobal client stateOrta
React QueryServer stateOrta
URL paramsNavigation stateDusuk

Performance

// React.memo: Expensive render onleme
const ExpensiveList = React.memo(({ items }: { items: Item[] }) => (
  <ul>{items.map(i => <ListItem key={i.id} item={i} />)}</ul>
));

// useMemo: Expensive hesaplama cache
const filtered = useMemo(
  () => items.filter(i => i.status === status),
  [items, status]
);

// useCallback: Referans stabilitesi
const handleClick = useCallback((id: string) => {
  setSelected(id);
}, []);

Next.js Patterns

FeatureNe Zaman
Server ComponentData fetch, no interactivity
Client ComponentonClick, useState, useEffect
Route HandlerAPI endpoint
MiddlewareAuth, redirect, rewrite
StreamingBuyuk data, progressive rendering

shadcn/ui Best Practices

// Theme config: globals.css'te CSS variable kullan
// shadcn/ui dark mode: class strategy (Tailwind darkMode: 'class')

// Component override: cn() ile extend et, fork etme
import { Button } from '@/components/ui/button'
<Button variant="outline" className={cn('custom-class', className)} />

// Compose, override etme:
function SubmitButton({ children, ...props }: ButtonProps) {
  return <Button type="submit" variant="default" {...props}>{children}</Button>
}

// A11y: shadcn radix tabanli, otomatik ARIA ama kontrol et
// Dark mode: CSS variable'lar otomatik switch eder

Performance Budget

MetrikEsikOlcum
LCP (Largest Contentful Paint)< 2.5sCore Web Vital
CLS (Cumulative Layout Shift)< 0.1Core Web Vital
INP (Interaction to Next Paint)< 200msCore Web Vital
FCP (First Contentful Paint)< 1.8sLighthouse
TTI (Time to Interactive)< 3.8sLighthouse
Total JS bundle< 200KB gzippedBuild analiz

React Performance Top 10

  1. React.memo sadece gercekten expensive render'larda
  2. useMemo/useCallback sadece referans stability gerektiginde
  3. Code splitting: React.lazy() + Suspense route bazli
  4. Image optimization: next/image, lazy loading, WebP/AVIF
  5. Virtual scroll: 100+ item listede @tanstack/virtual
  6. Debounce: Arama input'unda 300ms debounce
  7. Skeleton UI: Loading state icin layout shift onleme
  8. Bundle analyze: @next/bundle-analyzer ile kontrol
  9. Prefetch: <Link prefetch> kritik navigation'larda
  10. Server Component: Default RSC, client sadece interactive icin

Anti-Patterns

Anti-PatternDogru Yol
Prop drilling (5+ level)Context veya state library
useEffect for derived stateuseMemo kullan
Index as keyUnique ID kullan
Premature optimizationProfiler ile olc, sonra optimize et

Signals

GitHub stars
530
Forks
44
Last commit
Aug 2026
Advanced
Catalog kind
skill
Gateway key
frontend-patterns-vibeeval
Source
github.com/vibeeval/vibecosystem