Software Development8 min read1548 words

How to Actually Make Your Website Fast

Alara Türkü

PlusClouds Author

Cloud & SaaS

Hızlı Özet

What Actually Made Our Site Fast: A Retrospective on Moving from Laravel to Next.js by the PlusClouds Engineering Team.

How to Actually Make Your Website Fast

Herkes hızlı bir web sitesi ister, ancak farklı web siteleri farklı yolculuklar yaşar. Bu bizim deneyimimiz, nedenlerimiz, yolculuğumuz ve sonuçlarımız. 2026 yılında web sitemizi daha hızlı hale getirmek için yaptıklarımız burada.

Web siteniz için daha kişiselleştirilmiş tavsiyeler almak istiyorsanız topluluğumuza katılın.

Community

Further questions? Ask our team

Bu gönderinin bir versiyonu var ki, size büyük bir planımız olduğunu, kusursuz bir şekilde uyguladığımızı ve mükemmel bir şekilde optimize edilmiş bir site yayınladığımızı söyleriz. Ancak bu olmadı.

Aslında olan şey, büyüyen bir kod tabanını devralmamız, bir süredir ilk Lighthouse denetimimizi yapmamız, mobilde 34 puan görmemiz ve oraya nasıl geldiğimiz hakkında uzun ve rahatsız edici bir konuşma yapmamızdı.

Laravel'dan Next.js'e Neden Geçtik

Laravel'dan Next.js'e geçmek ilk içgüdümüz değildi, ancak bariz bir seçim haline geldi. Pazarlama sitemiz bir Laravel uygulaması olarak başladı. Blade şablonları, sunucu tarafından işlenen HTML, biraz jQuery. O zamanlar bulunduğumuz ölçek için tamamen makuldü. Ancak ürün birden fazla dil, canlı veri çeken fiyatlandırma sayfaları, gerçek trafik alan bir blog, karmaşık kimlik doğrulama akışları ile büyüdükçe, bir zamanlar "tamamen makul" olan şey "sessizce pahalı" hale geldi.

Asıl sorun performans değildi. Hızdı. Her ön uç değişikliği PHP'ye dokunuyordu. Bir kopya düzenlemesi, bir arka uç dağıtımı anlamına geliyordu. Yeni bir sayfa bölümü eklemek, verilerin denetleyicilerden, görünüm bileşenlerinden, Blade dosyalarına akması anlamına geliyordu. Ön uca sahip olması gereken kişiler (tasarımcılar, pazarlamacılar, prodüksiyon) bir mühendis olmadan ona dokunamıyordu.

App Router ile Next.js 15'e geçtik. En kolay yol olduğu için değil, sunucu tarafı işleme, statik üretim, artımlı yeniden doğrulama ve uygun bir bileşen modeli sunduğu için. Karar doğruydu. Uygulama, hala pürüzlerini giderdiğimiz zorluklarla doluydu.

image

Next.js Üzerindeki İlk Lighthouse Denetimimiz Mütevazıydı

Yeni Next.js sitesindeki ilk Lighthouse denetimimiz beklediğimiz iyileşmeyi sağlamadı. Yeni siteyi kurup ilk kez çalıştırdığımızda, Laravel'e göre bir iyileşme bekliyorduk. En azından hemen bir iyileşme elde edemedik.

Bazı kategorilerde skor daha kötüydü. Bu, nedenini anlayana kadar kafa karıştırıcıydı: modern bir çerçeveye geçmek sitenizi otomatik olarak hızlı yapmaz. Size daha iyi araçlar sunar. Bu araçları doğru kullanmak ayrı bir sorundur.

Sitemizi yavaşlatan ilk şey, render-engelleyici kaynaklardı. JavaScript değil, bu konuda dikkatli olmuştuk. Sorun daha inceydi: tarayıcı ipuçları olmayan dış alanlardan veri çekiyorduk. Görsellerimiz "$static.plusclouds.com$" üzerinde yaşıyordu. API'miz "$apiv4.plusclouds.com$" idi. Hiçbiri belge başlığında bir preconnect ipucuna sahip değildi. Bu nedenle her sayfa yüklemesinde, tarayıcı HTML'yi analiz eder, bir dış alan isteğiyle karşılaşır ve ardından DNS çözümlemesi ve TCP el sıkışmasını sıfırdan başlatırdı.

Kök düzenine iki satır eklemek bunu düzeltti:

<link rel="preconnect" href="https://static.plusclouds.com" />
<link rel="preconnect" href="https://apiv4.plusclouds.com" />

Bu neredeyse çok basit görünüyor. Ancak preconnect ipuçları, her sayfa yüklemesi için, her ziyaretçi için maliyeti biriken şeylerden biridir. Tarayıcı artık ilk görüntü veya API çağrısıyla karşılaşmadan önce bu bağlantıları kurmaya başlar. Dolayısıyla, web sitenizi daha hızlı hale getirmek istiyorsanız preconnect ipuçlarına dikkat etmek önemlidir.

Daha İyi Script Yönetimi ile JavaScript Paket Boyutunu Nasıl Azalttık

Daha iyi script yönetimi ile JavaScript paket boyutunu azaltmak, görece sessiz ama en etkili kazanımlardan biriydi. Laravel döneminde, scriptler organik olarak birikmişti. Burada bir analiz, orada bir sohbet widget'ı, bir pazarlama kampanyası sırasında eklenen ve asla kaldırılmayan üçüncü taraf bir piksel. Her biri senkron veya ertelenmiş bir script etiketi idi ve eklenme sırası, sayfanın gerçekten neye ihtiyaç duyduğuna dair düşünceli bir değerlendirme değil, özelliklerin gönderildiği sırayı yansıtıyordu.

Next.js'e geçtiğimizde, bu alışkanlıkların bazılarını daha iyi script yönetimi ile beraber taşıdık. İki simge kullanan bileşenler tüm simge kütüphanelerini içe aktarıyordu. Sadece belirli bir dalda ihtiyaç duyulan yardımcı fonksiyonlar dosyaların en üstünde içe aktarılıyordu. Hiçbir etkileşimi olmayan, sadece birisi emin olmadığında o şekilde yazılmış olan 'use client' işaretli istemci bileşenlerimiz vardı.

Bunların her biri küçük unsurlar. Birlikte, anlamlı bir şekilde daha büyük bir JavaScript paketi oluştururlar. Kod tabanını metodik olarak gözden geçirdik: her üçüncü taraf script, < head > içinde olması gerekip gerekmediği veya ertelenip ertelenemeyeceği değerlendirildi. Her büyük içe aktarma, gerçek kullanımına karşı kontrol edildi.

Tarayıcı API'larına ihtiyaç duymayan bileşenler sunucu bileşenlerine geri dönüştürüldü. Paket boyutu düştü ve bununla birlikte, sayfanın etkileşimli hale gelme süresi de azaldı.

Siteyi daha hızlı hale getirmek için belirlediğimiz script paketi kuralı şudur: ihtiyaç duyulana kadar hiçbir şey içe aktarılmaz, sunucuda çalışabilecek hiçbir şey tarayıcıda çalışmaz ve görünür bir render'ı engelleyebilecek hiçbir şey < head > içinde yüklenmez.

Hızlı web sitenize daha fazla potansiyel müşteri çekmek istiyorsanız, satış sürecini otomatikleştiren yapay zeka aracımızı inceleyin.

LeadOcean

Start generating leads free

Next.js Görüntü Optimizasyonu: WebP, CDN ve Öncelik Özelliği

Next.js görüntü optimizasyonu — format dönüştürme, CDN teslimi ve öncelik özelliği dahil, herhangi bir sayfadaki en pahalı kalemdi ve bunu birden fazla kez yanlış yaptık. Herkes görüntü optimizasyonuna başını sallar ve sonra Figma'dan doğrudan 3.7MB bir JPEG yüklemeye geri döner. Biz de tam olarak bunu yaptık. Birkaç kez.

Oluşturduğumuz özel görüntü yükleyici, tüm üretim trafiğini CDN üzerindeki imgproxy üzerinden yönlendirir. Her görüntü, gerçekten ihtiyaç duyulan boyutlara yeniden boyutlandırılır, talep eden tarayıcı için doğru formatta sunulur ve uçta önbelleğe alınır. 390px ekrana sahip bir mobil ziyaretçi artık aynı görüntünün 1600px versiyonunu indirmez. Yükleyici tüm bunları şeffaf bir şekilde halleder; geliştirici normal bir < Image > etiketi yazar ve CDN gerisini halleder.

Ancak format dönüştürme, teslimattan ayrı bir sorundur. Hızlı bir CDN'den sunulan bir JPEG hala bir JPEG'dir. Kahraman arka planlarını ve büyük pazarlama görsellerini WebP'ye dönüştürmek dosya boyutlarını %60 ila %80 oranında azaltır. Anasayfa kahramanımızda 1.3MB bir PNG vardı ve bunu ancak Lighthouse dördüncü ardışık denetiminde işaretleyene kadar fark etmedik. O görüntü WebP'de yaklaşık 200KB ağırlığında olmalıdır. CDN bunu düzeltemez; yalnızca kaynak dosyayı dönüştürmek bunu yapabilir.

Daha uzun süre yanlış yaptığımız diğer şey: Next.js görüntülerinde öncelik özelliği. Çerçeve, varsayılan olarak görüntüleri tembel yükler, bu alt kısımda bulunan görüntüler için doğru davranıştır. Ancak En Büyük İçerik Boyama öğesi (neredeyse her zaman kahraman görüntüsü) asla tembel yüklenmemelidir. öncelik eklemek, Next.js'e o görüntüyü önceden yüklemesini ve isteğe bağlı içerik gibi davranmayı bırakmasını söyler. Bu bir özelliktir. LCP iyileştirmesi hemen ve ölçülebilirdir.

image

Next.js İşleme Stratejisi: Statik Üretim, ISR ve Dinamik İşleme

Doğru Next.js işleme stratejisini (statik üretim, ISR veya dinamik işleme) seçmek, çerçevede en önemli mimari kararlardan biridir ve gerçek performans sonuçları vardır.

Her istekte sunucu tarafından işlenen, derleme zamanında statik olarak üretilen, periyodik yeniden doğrulama ile statik olarak üretilen: bunlar farklı sorunlar için farklı araçlardır ve yanlış olanı kullanmak gerçek performans sonuçlarına sahiptir.

Ürün sayfalarımız (sunucu özellikleri, fiyatlandırma katmanları, özellik belgeleri) dakikada değişmez. Artık generateStaticParams ile ISR ve bir saatlik yeniden doğrulama penceresi ile birlikte kullanılıyorlar. Derleme zamanında, her yerel kombinasyon statik HTML olarak önceden işlenir. Bir kullanıcı bir ürün sayfasına ulaştığında, CDN kenarından 100ms'nin altında bir sürede sunulan bir önbellek dosyası alır. Sunucu yok, veritabanı sorgusu yok, Node.js süreci uyanmıyor.

Taze veriye ihtiyaç duyan sayfalar (blog dizini, canlı fiyatlandırma, kullanıcıya özel herhangi bir şey) kısa yeniden doğrulama pencereleri veya bileşen düzeyinde önbellekleme ile dinamik işleme kullanır. Sonuç olarak, trafiğimizin büyük çoğunluğu statik HTML'den sunuluyor ve sunucu yalnızca içerik gerçekten değiştiğinde gerçek iş yapıyor.

Çoğu sayfada TTFB artık tutarlı bir şekilde 100ms'nin altında. Eski Laravel kurulumunda, nadiren 400ms'nin altındaydı. Bu, çerçevenin sihir yapması değil, her sayfa için hangi işleme stratejisinin mantıklı olduğuna dair kasıtlı bir kararın sonucudur.

SEO yapılandırılmış veriler, hreflang etiketleri ve OpenGraph meta verileri kullanıcılar için görünmezdir ancak diğer her şey için önemlidir ve geçiş yaptığımızda neredeyse hiçbiri yoktu. Google's generative AI özellikleri için optimize etmek, doğru şema işaretlemeleri ile iyi yapılandırılmış, taranabilir içerik gerektirir.

Ürün ve özellik sayfalarına FAQPage JSON-LD ekledik. Araçlarımız için SoftwareApplication şeması. Navigasyon hiyerarşisi için BreadcrumbList. Kök düzenine Organization şeması. Bunlar arama tarayıcıları ve giderek artan bir şekilde içeriğinizi oluşturulan özetlere ve yanıt kutularına dahil edip etmeyeceğine karar veren AI sistemleri tarafından okunur.

Hreflang durumu daha karmaşıktı. Dört yerel dili destekliyoruz ve alternatif bağlantılarımız en iyi ihtimalle tutarsız, en kötü ihtimalle eksikti. Tek bir yol argümanından doğru hreflang etiketleri üreten ve her sayfada çalışan bir buildAlternates() fonksiyonu oluşturduk. Yanlış veya eksik hreflang etiketlerinin uluslararası arama performansınıza aktif olarak zarar verdiğini fark edene kadar bu tür şeyler ev işi gibi gelir.

OpenGraph meta verileri benzerdi, bazı sayfalarda vardı, bazılarında yoktu, görüntü boyutları tutarsızdı. Next.js'nin generateMetadata API'si aracılığıyla merkezi hale getirmek ve kök düzenine metadataBase eklemek, sayfa başına düşünmeyi bırakmamız ve her yerde varsayılan olarak doğru yapmaya başlamamız anlamına geldi.

Sonuçlar: Lighthouse Skoru 90'ın Üzerinde, LCP 2.5s'nin Altında, TTFB 100ms'nin Altında

Geçişten sonra, mobildeki Lighthouse skorlarımız tutarlı bir şekilde 90'ın üzerinde. CLS 0.05'in altında. Çoğu sayfada LCP 2.5 saniyenin altında. Statik olarak sunulan içerik için TTFB 100ms'nin altında.

Henüz bitmedik. WebP olması gereken ama olmayan hala görüntüler var, statik olarak üretilebilecek ama dinamik işlemeye varsayılan sayfalar var ve daha spesifik olabilecek yapılandırılmış veriler var. Liste eskisinden daha kısa, ancak asla sıfıra ulaşmıyor.

Tüm bunlardan alınan dürüst ders, performansın bitirdiğiniz bir proje değil, oluşturduğunuz bir dizi varsayılan olduğudur. Her kahraman görüntüsünde PR birleştirilmeden önce öncelik. Yeni bir dış alan tanıtıldığında aynı gün preconnect eklenir. Sayfa içeriğiyle birlikte yazılmış yapılandırılmış veriler, geriye dönük olarak eklenmez. İçe aktarmalar, paket ağırlığı haline gelmeden önce denetlenir.

Bu şeyler alışkanlık haline geldiğinde, kontrol listeleri yerine, birikmiş kararlardan kurtulmak için sprintler harcamayı bırakır ve varsayılan olarak hızlı gönderim yapmaya başlarsınız.

Web siteniz için daha kişiselleştirilmiş tavsiyeler almak istiyorsanız topluluğumuza katılın.

Community

Further questions? Ask our team

Hızlı, akıllı altyapıyı tek bir panelden açığa çıkarmak için sunucularımıza göz atın. Otomatik yedekleme ve geri yükleme, planlanmış sağlık kontrolleri ve anında ölçeklendirme gibi ücretsiz özelliklerimiz, web sitenizin daha iyi çalışmasına yardımcı olur. Onları incelemekten çekinmeyin.

PlusClouds Cloud

Deploy your first server today

##fast website##faster site#migration from laravel to nextjs#laravel to nextjs#leaving laravel

Sıkça Sorulan Sorular

Why did you migrate from Laravel to Next.js?

Migrating to Next.js gave us server-side rendering, static generation, incremental revalidation, and a cohesive component model in one framework. The move addressed velocity, since frontend changes no longer required backend deployments and could be touched by designers and marketers with engineering support.

What did your first Lighthouse audit on the new Next.js site reveal?

The initial audit didn’t automatically improve performance and some categories scored worse. We found that external domains lacked preconnect hints, causing slowdowns, and adding preconnect lines helped the browser establish connections earlier.

How did you reduce JavaScript bundle size with better script management?

We audited third-party and internal scripts, removing what wasn’t needed and deferring what could wait. We also converted non-interactive client components back to server components and prevented unnecessary imports from loading in the head.

How did you optimize images with Next.js image optimization?

We built a custom image loader that routes traffic through our CDN’s imgproxy, resizing images to exact dimensions and delivering the proper format. Converting large images to WebP reduced file sizes by 60 to 80 percent, and using the priority prop to preload the hero image improved LCP.

How do you decide between static generation, ISR, and dynamic rendering in Next.js?

For pages that don’t change often, we prerender with generateStaticParams and ISR, serving static HTML from the CDN edge in under 100ms. Pages that need fresh data use short revalidation windows or dynamic rendering with component-level caching.

What SEO enhancements did you implement with structured data, hreflang, and OpenGraph?

We added FAQPage JSON-LD to product and feature pages, plus SoftwareApplication and BreadcrumbList schemas, and centralized Organization schema in the root layout. We also built a shared buildAlternates function for correct hreflang tags and centralized OpenGraph metadata using Next.js metadata APIs.

What measurable results did you achieve after the migration?

Post-migration, Lighthouse scores on mobile consistently exceed 90, CLS stays under 0.05, and LCP is under 2.5 seconds on most pages. TTFB for statically served content is under 100ms, with ongoing improvements and a mindset of maintaining fast defaults.