REACT
Bu depoda toplu olarak "React" ile yaptığım tüm çalışmalarımı ve bilgi birikimimi tutuyorum.
Create-react-app
Vite
NextJS
Eslint
kurulumu ve ayarlarıReact Stil Opsiyonları
Tailwind CSS
Styled Components
CSS
örneğin. Bu kod bir component döndürür.Render'lama
Renderlama mantığında bazı katı kurallar vardır.
Prop'lar
State'ler
Use Reducer
Ref'ler
Event Handler'lar
Use Effect'ler
Router ( Yönlendirici )
Router v6.4 İçin Yeni Kullanım
Router Loader
Router Action
TanStack Router
TanStack router'ı react-router ile karşılaştırdığımızda görebileceğimiz en büyük avantajlarından birisi typesafe olmasıdır. Olmayan bir route yazdığınızda TypeScript sizi uyarır ve bir hata olduğunu belirtir.
TanStack router hem File-Based Routing hemde Code-Based Routing için destek sunar. Bu konuda detaylı bilgi için linke gidebilirsin.
Installation ⏬
npm install @tanstack/router
npm install --save-dev @tanstack/router-vite-plugin
Vite plugin otomatik olarak routes dosyasını oluşturur.
Daha sonra vite.config.ts dosyamız bu şekilde görünmelidir
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import { TanStackRouterVite } from "@tanstack/router-vite-plugin";
export default defineConfig({
plugins: [react(), TanStackRouterVite()],
});
Bir sonraki adımda __root.tsx dosyamız içerisinde tüm route'larımız için bir root route'ı Outlet componentimiz ile oluşturuyoruz.
import { Outlet, createRootRoute } from "@tanstack/react-router";
export const Route = createRootRoute({
component: () => <Outlet />,
});
Şimdi route'larımız tanımlıdır fakat React bunu henüz bilmiyor. Dolayısıyla bir provider'a ihtiyacımız var. Bu noktada App.tsx dosyamıza gidip içeriğini aşağıdaki gibi güncelliyoruz
import './App.css';
import { RouterProvider, createRouter } from '@tanstack/react-router';
import { routeTree } from './routeTree.gen';
const router = createRouter({ routeTree });
declare module '@tanstack/react-router' {
interface Register {
router: typeof router;
}
}
function App() {
return <RouterProvider router={router} />;
}
export default App;
Bununla birlikte tüm route'larımız aktif bir şekilde çalışacaktır. Bu noktada route'larımız arasında gezinim için ihtiyacımız olan şey Link component'idir. <Link to="/">Home</Link>
. Kullanımı react-router ile aynıdır.
Tüm işlevselliğimiz apaçık bir şekilde çalışmaktadır. Şimdi bulunduğumuz sayfayı belirten bir stilleme için Link componentimize activeProps prop'u vererek aktif durumda stilleme yapabiliriz.
<Link to="/" activeProps={{ style: { fontWeight: "bold" } }}>
Home
</Link>
Bu özelliğin yanısıra custom bir active state için şu şekilde bir kullanım da mevcuttur.
<Link to="/profile">
{({ isActive }) => <>Profile {isActive && "Active"}</>}
</Link>
Custom Hooks
Context API
Redux
Redux Geliştirici Araçları (DevTools)
Redux Toolkit
React Query
React Portal
Tek Sayfa Uygulamalar [ SPA ]
Sahte Giriş (Fake Login) ve Kullanıcı Doğrulaması (User Authentatication)
API Cağırıları ve Hata yakalama
Performans ve Optimizasyon ☄
memo Fonksiyonu
useMemo & useCallback
Kod bölme (Code Splitting)
Local Storage
SUPABASE
CONTENT DELIVERY NETWORK [ CDN ]
NEXTJS
CLIENT TARAFLI RENDERLAMA [CSR]
SUNUCU TARAFLI RENDERLAMA [SSR]
Static Rendering
Dynamic Rendering
HYDRATION
ESKI NEXT JS [ PAGES ROUTER ]
MODERN NEXT JS [ APP ROUTER ]
CLIENT COMPONENTS - SERVER COMPONENTS
REACT SERVER COMPONENTS
OLUMLU YÖNLER
OLUMSUZ YÖNLER
RSC vs SSR
APP ROUTER
SUSPENSE
DYNAMIC ROUTES
ERROR BOUNDARY IN NEXTJS
NOT-FOUND PAGE
NEXTJS CACHING
NextJS'de normal reacttan farklı olarak cache sistemi daha agresiftir. Basit olarak saklanabilecek herşey cache'e alınır. [ Fetched data, visited routes etc. ]
NextJS cache revalidation için API'lar dağıtır. Cache işlemi önceki verinin tamamen kaldırılması ve yenisinin cache'e alınmasıyla ilgilidir.
Caching, NextJS uygulamalarını daha performanslı ve daha az maliyetli kılar.
Default olarak caching NextJS'de sürekli aktiftir. Bu durumda beklenmedi davranışlara yol açabilir. Bazı cache'lemeler kapatılamaz.
Bu durum fazla kafa karıştırıcı olabilir çünkü NextJS'de caching'i kontrol etmek için çok fazla API vardır.
Caching development aşamasında beklendiği gibi çalışmaz. Caching kapalıdır. Caching durumunu simüle edebilmek için build ve start scriptlerini kombine edip çalıştırırsak caching kullanabiliriz. Custom script oluşturarak kullanabiliriz. 👉 npm run build && npm run start. Yaptığımız değişiklikler ekrana anlık yansımaz, serveri kapatıp tekrar çalıştırmamız gerekir.
4 Farklı Caching mekanizması vardır. 1: Request Memoization, 2: Data Cache, 3: Full Route Cache, 4: Router Cache.
Request Memoization
Cache olarak server'ı kullanır.
Get requestleri gibi veri tarzlarını cache'e alır.
Birden fazla yerde yapılan aynı istek tekrar tekrar API isteği oluşturmaz, tek bir istekte alınan veriler tüm isteklerde kullanılır. Fakat bu durum sadece fetch() fonksiyonu ile çalışır ve istekler birebir aynı olmalıdır.
Yeniden doğrulama yapma mümkün değildir.
Vazgeçmek için ise AbortController kullanılabilir.
Data Cache
Cache olarak server'ı kullanır.
Veri olarak bir route'da yakalanan verileri veya te bir fetch isteğini cache'e alır.
Yakalanan veriler sonsuza kadar cache'de kalır. (Revalidate yapmak istesek bile)
Özellikle static sayfalar için kullanılır. Milyon tane kullanıcıya aynı verileri göstermek için mükemmeldir.
Açık ara geliştiriciler için düşünülmesi en önemli cache diyebiliriz.
Yeniden doğrulama için kullanabileceğimiz birden fazla yöntem vardır.
Time-based (otomatik) sayfadaki tüm veri için [ export const revalidate = time page.js'de ]
Time-based(otomatik) tek bir veri isteği için [ fetch(... , { next: { revalidate: time }}) ]
İsteğe bağlı olarak (manuel) revalidatePath veya revalidateTag
Tüm sayfada Vazgeçmek/iptal etmek için ise export const revalidate = 0 page.js'de veya export const dynamic = "force-dynamic" yine page.js'de kullanabiliriz.
Tek bir istek için Vazgeçmek/iptal etmek için fetch(... , { cache: 'no-store'}) veya Tek bir server komponent için noStore() fonksiyonu kullanılabilir.
Full Route Cache
Cache olarak server'ı kullanır.
Tüm static sayfaları ( HTML ve RSC Payload ) cache'e alır.
Data Cache yeniden doğrulanana veya proje yeniden deploy edilene kadar temizlenmez.
Router Cache
Cache olarak Client'ı kullanır.
Önceden yakalanmış ve anlık olarak kullanıcının uygulamada gezindiği sayfaları cache'e alır. [ Static & Dynamic ]
Yakalanan veriler sayfa dynamic ise 30 saniye, sayfa static ise 5 dakika cache'de tutulur. Yani sayfayı komple kapatıp açtığımızda dahi outdated veri görebiliriz. NextJS ile ilgili en büyük problemlerden birisi de budur.
Yeniden doğrulama için revalidatePath veya revalidateTag (Server Action'da)
router.refresh, cookies.set veya cookies.delete'de yine Server Action'da revalidate için kullanılabilir.
Vazgeçmek veya iptal etmek için herhangi bir yöntem yoktur.
INCREMENTAL STATIC REGENERATION
Incremental Static Regeneration, static bir sayfanın belirli zamanlar içerisinde yeniden oluşturulmasını ve kullanıcılara güncel veriyi göstermeyi sağlar.
Bu yapıyı export const revalidate = time şeklinde modülümüz içerisinde tanımlamalıyız. Böylece belirttiğimiz süre aralıkları ile sayfamız yeniden oluşturulur ve cache güncellenir. ( Route Level )
Veya bir komponent için bunu yapmak istersek import { unstable_noStore as noStore } from "next/cache" şeklinde import edip komponentimiz içerisinde en üst seviyede noStore() fonksiyonunu çağırıyoruz.
Route seviyesinde revalidate export etmek veya komponent seviyesinde noStore kullanmanın bir farkı yoktur. Ancak partial pre-rendering kullanıldığında bir anlam ifade eder. Tüm sayfayı static tutup sadece komponenti dynamic yapabilir ve uygulamamıza performans kazancı sağlayabiliriz.
PARTIAL PRE-RENDERING
Server - Client Boundary
Bir client component içerisinde server component import etmek ve renderlamak sorunlara yol açar. Bunu yapmanın tek yolu prop olarak componenti geçirmektir.
Traditional Way
NextJS with RSC and SA (Server Actions)
Client ve Server Komponent'larda Importing vs Rendering
NextJS Share State Between Client & Server
${pathname}?${params.toString()}
değerlerimizi verir ve yeni bir URL oluştururuz.Creating an API Endpoint with Route Handlers
NextAuth [ Auth.js ]
NextJs Middleware
NextJS Server Actions
useOptimistic
Arka planda nasıl çalışır
Daha fazla 3rd-Party React kütüphanesi 👇
React Hakkında Pratik Özetler
Diffing ( Farklılaşan )
Error Boundaries
React ile yaptığım bazı Codesandbox pratikleri
⏬Cypress Test
Commit Examples
Peer Legacy Deps Hatası