From 026debdc06505fbe7e12db3e390464e46464dcab Mon Sep 17 00:00:00 2001 From: bilalgursen Date: Sat, 8 Aug 2026 13:51:44 +0300 Subject: [PATCH] perf: analytics stratejisi, radix tree-shaking, DevPanel, motion/mini (Faz 2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rybbit Script beforeInteractive -> afterInteractive: analitik artık hydration'dan önce kritik yolda çalışmıyor (yalnızca preload hint'i kalıyor) - next.config: experimental.optimizePackageImports ["radix-ui"] — 36 alt paketli kök barrel modül grafiğini şişiriyordu (VPS build OOM geçmişi) - DevPanel: dev-panel-mount.tsx ile prod'da import() erişilemez dalda; dev kodu + dev action proxy'leri prod chunk'lardan çıktı (rota başına ~21 KB) - motion/mini: use-pixel-heat + sihirbaz-cagri-karti yalnızca duration/ease kullanıyor; WAAPI tabanlı mini animate tam motoru bundle'dan çıkarır Co-Authored-By: Claude Fable 5 --- next.config.ts | 22 +++++++++---- src/app/layout.tsx | 32 +++++++++---------- src/components/dev/dev-panel-mount.tsx | 18 +++++++++++ src/components/use-pixel-heat.ts | 6 +++- .../components/sihirbaz-cagri-karti.tsx | 2 +- 5 files changed, 55 insertions(+), 25 deletions(-) create mode 100644 src/components/dev/dev-panel-mount.tsx diff --git a/next.config.ts b/next.config.ts index b875547..eab2aae 100644 --- a/next.config.ts +++ b/next.config.ts @@ -22,12 +22,13 @@ const nextConfig: NextConfig = { "openai", "resend", ], - ...(kaynakKisitli - ? { - // cacheComponents açıkken prerender fazında source map üretimi varsayılan - // açık; 1900+ statik sayfada ciddi bellek maliyeti var. - enablePrerenderSourceMaps: false, - experimental: { + experimental: { + // radix-ui kök barrel'ı 36 alt paketi çeker ve Next'in varsayılan + // optimize listesinde yoktur; named import'lar doğrudan alt modüle + // çevrilir (dev boot / build modül grafiği küçülür). + optimizePackageImports: ["radix-ui"], + ...(kaynakKisitli + ? { // Turbopack'ın Rust tarafı NODE_OPTIONS heap sınırını görmez; bellek // hedefi byte cinsinden ayrıca verilir (1.5 GB). turbopackMemoryLimit: 1_610_612_736, @@ -35,7 +36,14 @@ const nextConfig: NextConfig = { // worker × 4 sayfa. Her worker ayrı bir Node süreci/heap'idir. cpus: 1, staticGenerationMaxConcurrency: 4, - }, + } + : {}), + }, + ...(kaynakKisitli + ? { + // cacheComponents açıkken prerender fazında source map üretimi varsayılan + // açık; 1900+ statik sayfada ciddi bellek maliyeti var. + enablePrerenderSourceMaps: false, } : {}), async redirects() { diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 97fcb66..6303e82 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -10,7 +10,7 @@ import { KaydetBannerLazy } from "@/features/liste/components/kaydet-banner-lazy import { TercihProfiliKapisiLazy } from "@/features/liste/components/tercih-profili-kapisi-lazy"; import { HeaderGate } from "@/components/header-gate"; import { ProgressiveBlur } from "@/components/ui/skiper-ui/skiper41"; -import { DevPanel } from "@/components/dev/dev-panel"; +import { DevPanelMount } from "@/components/dev/dev-panel-mount"; import { ScrollFlow } from "@/components/scroll-flow"; import { JsonLd, organizationJsonLd, webSiteJsonLd, SITE_URL } from "@/lib/seo"; import "./globals.css"; @@ -85,19 +85,6 @@ export default function RootLayout({ // içerikle büyümeli, viewport tabanı body'deki min-h-dvh'den gelir. className={`${calSans.variable} ${clarityCity.variable} ${geistMono.variable} ${bricolage.variable} antialiased`} > - {/* Rybbit analitik — beforeInteractive her zaman içine defer olarak - enjekte edilir. Yalnızca prod build'de: Rybbit localhost'u da takip - ettiği için dev trafiği prod verisini kirletmesin (DevPanel ile aynı - kapı). mask-patterns: /sonuc URL'i ham başarı sıralamasını, - /odeme/sonuc sipariş kimliğini taşıyor — path tek satırda toplanır. */} - {process.env.NODE_ENV === "production" ? ( -