Takip et

Nuxt.js Kullanarak Sunucu Taraflı Oluşturmaya (SSR) Başlangıç

Nuxt.js Kullanarak Sunucu Taraflı Oluşturmaya (SSR) Başlangıç Web geliştirme dünyası, kullanıcı deneyimini, arama motoru optimizasyonunu (S

Nuxt.js Kullanarak Sunucu Taraflı Oluşturmaya (SSR) Başlangıç

Web geliştirme dünyası, kullanıcı deneyimini, arama motoru optimizasyonunu (SEO) ve performansı artırmak için sürekli yeni yöntemler sunmaktadır. Bu yöntemlerden biri de Sunucu Taraflı Oluşturma (Server-Side Rendering – SSR) olarak öne çıkmaktadır. Özellikle modern JavaScript çerçeveleri (frameworks) ile geliştirilen tek sayfa uygulamalarının (Single Page Applications – SPAs) karşılaştığı bazı zorluklara çözüm sunan SSR, web uygulamalarının hem kullanıcılar hem de arama motorları için daha erişilebilir ve hızlı olmasını sağlar. Bu makalede, SSR kavramını derinlemesine inceleyecek, Nuxt.js gibi güçlü bir Vue.js çerçevesi kullanarak SSR uygulamaları geliştirmeye nasıl başlayacağımızı adım adım ele alacak ve bu sürecin inceliklerini keşfedeceğiz.

Sunucu Taraflı Oluşturma (SSR) Nedir ve Neden Önemlidir?

Web sitelerinin içeriğinin tarayıcıda görüntülenme şeklini belirleyen çeşitli oluşturma stratejileri bulunmaktadır. Geleneksel olarak, dinamik içerik sunan web siteleri genellikle sunucu taraflı oluşturma kullanırdı; sunucu, her istekte tam HTML sayfasını oluşturur ve tarayıcıya gönderirdi. Modern web geliştirmeyle birlikte, İstemci Taraflı Oluşturma (Client-Side Rendering – CSR) popülerlik kazandı. CSR’da, tarayıcı sunucudan boş bir HTML dosyası ve JavaScript paketi alır, ardından JavaScript çalışarak içeriği tarayıcıda oluşturur. Bu yaklaşım, zengin ve etkileşimli kullanıcı arayüzleri oluşturmak için harikaydı, ancak beraberinde bazı sorunları da getirdi.

SSR ve CSR Karşılaştırması

İstemci Taraflı Oluşturma (CSR):
* Nasıl Çalışır: Tarayıcı, sunucudan minimum düzeyde HTML (genellikle sadece bir div etiketi) ve uygulamanın JavaScript kodunu alır. JavaScript indirildikten ve yürütüldükten sonra, sayfanın tüm içeriği tarayıcıda oluşturulur.
* Avantajları: Uygulama bir kez yüklendikten sonra, sonraki sayfa geçişleri hızlıdır çünkü yalnızca veri çekilir ve DOM güncellenir. Zengin ve dinamik kullanıcı arayüzleri oluşturmak kolaydır.
* Dezavantajları:
* İlk Yükleme Süresi: Kullanıcılar, JavaScript indirilip yürütülene kadar boş veya yükleniyor ekranı görürler. Bu durum, yavaş internet bağlantılarında veya büyük JavaScript paketlerinde kötü bir deneyim yaratabilir.
* SEO Zorlukları: Arama motoru örümcekleri (crawlers), JavaScript’i yürütme yeteneğine sahip olsalar da, sayfanın içeriğinin hemen HTML’de bulunmaması indeksleme sürecini yavaşlatabilir veya engelleyebilir. Bu da SEO performansını olumsuz etkileyebilir.
* Performans: Düşük performanslı cihazlarda veya zayıf ağ koşullarında, JavaScript’in yürütülmesi ve sayfanın oluşturulması daha uzun sürebilir.

Sunucu Taraflı Oluşturma (SSR):
* Nasıl Çalışır: Her istekte, sunucu uygulamanın Vue veya React bileşenlerini HTML dizgelerine dönüştürür ve tarayıcıya tam olarak oluşturulmuş bir HTML sayfası gönderir. Tarayıcı bu HTML’i hemen görüntüleyebilir. Ardından, istemci taraflı JavaScript yüklenir ve “hidrasyon” (hydration) adı verilen bir süreçle etkileşimli hale gelir.
* Avantajları:
* Daha Hızlı İlk Yükleme: Kullanıcılar, sayfanın içeriğini hemen görürler, bu da algılanan performansı artırır. Boş ekran bekleme süresi ortadan kalkar.
* Gelişmiş SEO: Arama motoru örümcekleri, tam oluşturulmuş HTML’i doğrudan alırlar, bu da içeriğin daha kolay ve doğru bir şekilde indekslenmesini sağlar. Bu, arama motoru sıralamaları için kritik öneme sahiptir.
* Daha İyi Kullanıcı Deneyimi: Özellikle yavaş internet bağlantılarına sahip veya eski cihaz kullanan kullanıcılar için daha hızlı ve tutarlı bir deneyim sunar.
* Daha İyi Erişilebilirlik: JavaScript devre dışı bırakılmış tarayıcılarda bile temel içeriğin erişilebilir olmasını sağlar (ancak etkileşimli olmayabilir).
* Dezavantajları:
* Daha Karmaşık Sunucu Yükü: Her istekte sayfanın sunucuda oluşturulması gerektiğinden, sunucu kaynakları daha fazla kullanılır. Bu, yüksek trafikli uygulamalar için ek sunucu kapasitesi gerektirebilir.
* Daha Karmaşık Geliştirme Süreci: İstemci ve sunucu ortamları arasında uyumluluk sorunları, durum yönetimi ve veri çekme gibi konularda ek dikkat gerektirebilir.
* Artan İlk Sunucu Yanıt Süresi (TTFB): Sunucunun HTML’i oluşturup göndermesi için geçen süre, boş bir HTML göndermekten daha uzun olabilir. Ancak bu süre genellikle JavaScript’in indirilip çalıştırılmasına kıyasla daha hızlı algılanır.

Özetle, SSR, uygulamanın ilk yükleme performansını ve SEO’sunu önemli ölçüde iyileştirme potansiyeline sahiptir. Nuxt.js gibi çerçeveler, bu karmaşıklığı soyutlayarak geliştiricilerin SSR’nin avantajlarından kolayca yararlanmasını sağlar.

Nuxt.js’e Giriş: Vue.js ile SSR’yi Kolaylaştırmak

Nuxt.js, Vue.js ekosisteminde, özellikle SSR ve statik site oluşturma (SSG) konularında geliştiricilerin hayatını kolaylaştırmak için tasarlanmış açık kaynaklı, sezgisel bir çerçevedir. Vue.js üzerine inşa edilmiş olup, bir dizi güçlü özellik ve konvansiyon sunarak geliştiricilerin hızlı bir şekilde karmaşık web uygulamaları oluşturmasına olanak tanır. Nuxt.js, “meta çerçeve” olarak adlandırılır çünkü Vue.js’in üzerine bir soyutlama katmanı ekleyerek, dosya tabanlı yönlendirme, veri çekme stratejileri, durum yönetimi entegrasyonu ve daha fazlası gibi birçok yaygın görevi önceden yapılandırılmış bir şekilde sunar.

Neden Nuxt.js Kullanmalıyız?

1. Sıfır Yapılandırma ile SSR: Nuxt.js’in en büyük avantajı, SSR’yi varsayılan olarak desteklemesidir. Geliştiricilerin Webpack veya Babel gibi araçlarla karmaşık yapılandırmalarla uğraşmasına gerek kalmadan, tek bir komutla SSR özellikli bir Vue uygulaması başlatabilirler.
2. Dosya Sistemi Tabanlı Yönlendirme: Nuxt.js, pages dizininizdeki Vue dosyalarının yapısına göre otomatik olarak Vue Router rotalarını oluşturur. Bu, rotaları manuel olarak tanımlama ihtiyacını ortadan kaldırır ve geliştirme sürecini hızlandırır.
3. Veri Çekme Kolaylığı: Nuxt.js, bileşenlerinizde veya sayfalarınızda sunucu tarafında veri çekmek için özel yöntemler (useAsyncData, useFetch) sunar. Bu, verilerin sayfa oluşturulmadan önce hazır olmasını sağlar ve hidrasyon sorunlarını minimize eder.
4. Otomatik Kod Bölme (Code Splitting): Her sayfa için otomatik olarak kod bölme yapar, bu da uygulamanın sadece o sayfa için gerekli JavaScript’i yüklemesini sağlayarak performansı artırır.
5. Katmanlı Yapı (Layers): Nuxt 3 ile gelen katmanlar özelliği, birden fazla Nuxt projesini veya modülü bir araya getirerek daha modüler ve yeniden kullanılabilir uygulamalar oluşturmayı sağlar.
6. Geliştirici Deneyimi (DX): Nuxt.js, iyi belgelenmiş, aktif bir topluluğa sahip ve birçok kullanışlı modül (modüller) ile genişletilebilir. Bu, geliştiricilerin sorunları çözmesini ve yeni özellikler eklemesini kolaylaştırır.
7. Çeşitli Oluşturma Modları: SSR’nin yanı sıra, Nuxt.js statik site oluşturma (SSG) ve istemci tarafı oluşturma (SPA) modlarını da destekler. Bu esneklik, projenizin gereksinimlerine en uygun oluşturma stratejisini seçmenize olanak tanır.

Nuxt.js, Vue.js’in gücünü alıp, modern web uygulamalarının geliştirilmesi için gerekli olan birçok karmaşık altyapısal konuyu soyutlayarak geliştiricilere odaklanmaları gereken asıl işe, yani kullanıcı arayüzü ve iş mantığına odaklanma fırsatı verir. Özellikle Nuxt 3, Vue 3, Vite ve Nitro gibi modern araçlarla birlikte gelerek daha hızlı geliştirme, daha küçük paket boyutları ve daha iyi performans sunar.

Nuxt.js Projesi Kurulumu

Nuxt.js ile bir SSR uygulaması geliştirmeye başlamak oldukça basittir. İlk olarak, sisteminizde Node.js ve npm veya Yarn’ın kurulu olduğundan emin olmalısınız. Nuxt.js’in en son stabil sürümü olan Nuxt 3’ü kullanarak kurulumu gerçekleştireceğiz.

Önkoşullar

* Node.js: En az Node.js 16.x veya daha yenisi (LTS sürümü önerilir). node -v komutu ile kontrol edebilirsiniz.
* npm veya Yarn: Node.js ile birlikte gelir. npm -v veya yarn -v ile kontrol edebilirsiniz.

Proje Oluşturma

Terminalinizde aşağıdaki komutu çalıştırarak yeni bir Nuxt 3 projesi oluşturabilirsiniz:

npx nuxi init nuxt3-ssr-app

* npx nuxi init: Nuxt.js 3 projeleri oluşturmak için kullanılan komuttur.
* nuxt3-ssr-app: Projenizin adı. İstediğiniz ismi verebilirsiniz.

Bu komut çalıştırıldığında, Nuxt.js gerekli dosyaları ve bağımlılıkları indirip yapılandıracaktır. İşlem tamamlandığında, proje dizininize geçin:

cd nuxt3-ssr-app

Ardından, bağımlılıkları yükleyin:

npm install # veya yarn install

Son olarak, geliştirme sunucusunu başlatın:

npm run dev # veya yarn dev

Bu komut, uygulamanızı geliştirme modunda başlatır. Tarayıcınızda http://localhost:3000 adresine giderek Nuxt.js başlangıç sayfasını görmelisiniz.

Proje Yapısı

Yeni oluşturulan Nuxt.js projesinin temel dizin yapısı aşağıdaki gibidir:

nuxt3-ssr-app/
├── .nuxt/             # Nuxt.js tarafından oluşturulan geçici dosyalar
├── .output/           # Üretim için derlenmiş çıktı (build)
├── assets/            # CSS, resimler, fontlar gibi statik varlıklar
├── components/        # Yeniden kullanılabilir Vue bileşenleri
├── composables/       # Vue 3 Composition API için özel hook'lar
├── layouts/           # Uygulamanızın düzenleri (ör. default.vue)
├── middleware/        # Rota başına çalışan ara yazılımlar
├── node_modules/      # Proje bağımlılıkları
├── pages/             # Uygulamanızın sayfaları (dosya tabanlı yönlendirme)
├── plugins/           # Vue uygulamasına global olarak eklenecek eklentiler
├── public/            # Doğrudan sunulan statik dosyalar (root dizini gibi)
├── server/            # API rotaları ve sunucu ara yazılımları
├── app.vue            # Uygulamanızın ana bileşeni
├── nuxt.config.ts     # Nuxt.js yapılandırma dosyası
├── package.json       # Proje meta verileri ve bağımlılıkları
├── tsconfig.json      # TypeScript yapılandırma dosyası
└── .env               # Ortam değişkenleri

* pages/: Bu dizin, Nuxt.js’in dosya sistemi tabanlı yönlendirme sistemini kullandığı yerdir. Her .vue dosyası bir rota haline gelir. Örneğin, pages/index.vue ana sayfayı, pages/about.vue /about rotasını temsil eder. Dinamik rotalar için pages/users/[id].vue gibi yapılar kullanabilirsiniz.
* components/: Uygulamanızda yeniden kullanılabilir Vue bileşenlerini içerir. Nuxt.js, bu bileşenleri otomatik olarak içe aktarır (auto-import), bu da import ifadelerini yazma ihtiyacını ortadan kaldırır.
* layouts/: Uygulamanızın farklı bölümleri için düzen şablonları tanımlar. Örneğin, bir default.vue düzeni, uygulamanızdaki tüm sayfalar için ortak bir başlık ve alt bilgi içerebilir.
* public/: Doğrudan web sunucusu tarafından sunulan statik dosyaları (örneğin, favicon.ico, robots.txt) içerir. Bu dizindeki dosyalar, uygulamanın kök dizininden erişilebilir.
* app.vue: Nuxt.js uygulamanızın ana bileşenidir. Genellikle ve bileşenlerini içerir.
* nuxt.config.ts: Nuxt.js uygulamanızın ana yapılandırma dosyasıdır. Modüller, başlık ayarları, CSS, çalışma zamanı yapılandırması ve daha fazlasını burada tanımlarsınız.

Bu yapı, Nuxt.js’in “konvansiyonla yapılandırma” (convention over configuration) felsefesini yansıtır ve geliştiricilerin çoğu durumda ek yapılandırma yapmadan hızlıca çalışmaya başlamasını sağlar.

Nuxt.js’te SSR’nin Temel Kavramları

Nuxt.js, SSR’yi kolaylaştırmak için bir dizi temel kavram ve araç sunar. Bu kavramları anlamak, Nuxt.js uygulamalarınızda veri çekme, durum yönetimi ve performans optimizasyonu gibi konularda doğru kararlar vermenizi sağlar.

Universal Mod (Varsayılan)

Nuxt.js’in varsayılan çalışma modu “Universal” modudur. Bu, uygulamanızın hem sunucu tarafında (ilk istekte) hem de istemci tarafında (sonraki navigasyonlarda ve etkileşimlerde) çalıştırılabileceği anlamına gelir.

* Sunucu Tarafı: Bir kullanıcı ilk kez uygulamanıza eriştiğinde veya sayfayı yenilediğinde, Nuxt.js sunucuda Vue bileşenlerini HTML dizgelerine dönüştürür. Bu HTML, tarayıcıya gönderilir ve kullanıcı hemen içeriği görür.
* İstemci Tarafı: HTML tarayıcıya ulaştıktan sonra, Nuxt.js istemci taraflı JavaScript’i yükler. Bu JavaScript, sunucudan gelen HTML’i “hidrate” eder, yani HTML’i Vue bileşenleriyle eşleştirir ve etkileşimli hale getirir. Sonraki navigasyonlar için, Nuxt.js bir SPA gibi davranır; sayfa geçişleri tarayıcıda gerçekleşir ve sunucuya tam sayfa isteği yapılmaz.

Bu hibrit yaklaşım, hem SEO ve ilk yükleme performansı avantajlarını (SSR) hem de hızlı sayfa geçişleri ve zengin etkileşim avantajlarını (CSR) bir araya getirir.

Veri Çekme (Data Fetching)

SSR uygulamalarında veri çekme, kritik bir konudur. Verilerin sayfa oluşturulmadan önce sunucuda hazır olması gerekir ki, tam oluşturulmuş HTML tarayıcıya gönderilebilsin. Nuxt.js 3, veri çekme için modern ve güçlü bir dizi Composition API işlevi sunar:

* useAsyncData:
Bu, Nuxt.js’in ana veri çekme kompozisyonudur. Bir Vue bileşeni veya sayfa yüklenmeden önce sunucuda (veya istemcide) asenkron veri çekmek için kullanılır. useAsyncData, bir anahtar, bir veri çekme fonksiyonu ve isteğe bağlı seçenekler alır.



    

* data: Çekilen veriyi içerir.
* pending: Veri çekme işlemi devam ederken true, tamamlandığında false olur.
* error: Bir hata oluşursa hata nesnesini içerir.
* refresh: Veri çekme işlemini manuel olarak yeniden tetiklemek için bir fonksiyon.

useAsyncData varsayılan olarak sunucuda çalışır ve sonuçları istemciye hidrasyon için taşır. İstemci tarafında bir sonraki sayfa geçişinde, veri tekrar çekilir ancak istemci tarafında.

* useFetch:
useFetch, useAsyncData‘nın üzerine inşa edilmiş, API istekleri için daha basit bir sarmalayıcıdır. Genellikle doğrudan bir URL’den veri çekmek için kullanılır. useAsyncData ile benzer şekilde data, pending, error ve refresh gibi özellikleri döndürür.



    

useFetch dahili olarak Nuxt.js’in $fetch yardımcı fonksiyonunu kullanır. $fetch, node-fetch (sunucuda) ve tarayıcının fetch API’si (istemcide) arasında soyutlama sağlar ve otomatik olarak istekleri işler.

* $fetch Yardımcı Fonksiyonu:
Nuxt.js, API istekleri yapmak için global olarak kullanılabilen $fetch yardımcı fonksiyonunu sağlar. Bu, doğrudan bir API endpoint’ine istek göndermek istediğinizde kullanışlıdır.

const response = await $fetch('/api/my-endpoint', {
      method: 'POST',
      body: { key: 'value' }
    });

$fetch, aynı zamanda Nuxt.js’in yerleşik sunucu API rotaları ile de sorunsuz çalışır.

Hidrasyon (Hydration)

Hidrasyon, SSR’nin kritik bir parçasıdır. Sunucu tarafından oluşturulan statik HTML’in istemci tarafında etkileşimli Vue uygulamasına dönüştürülmesi sürecidir. Tarayıcı, sunucudan HTML’i aldıktan sonra, Vue.js istemci tarafındaki JavaScript’i indirir ve bu JavaScript, mevcut HTML yapısını Vue bileşenleriyle eşleştirerek olay dinleyicilerini ve reaktif özellikleri ekler.

Hidrasyonun Önemi:
* Etkileşim: Hidrasyon olmadan, sunucudan gelen HTML sadece statik bir görüntü olurdu. Kullanıcıların düğmelere tıklaması, form doldurması gibi etkileşimler hidrasyon sayesinde mümkün olur.
* Durum Senkronizasyonu: Sunucuda çekilen veriler ve bileşen durumu, hidrasyon sırasında istemciye aktarılır. Bu, uygulamanın sunucu ve istemci arasında tutarlı bir durumda kalmasını sağlar.

Hidrasyon Hataları:
Hidrasyon hataları (hydration mismatch), sunucuda oluşturulan HTML ile istemcide beklenen HTML arasında bir tutarsızlık olduğunda ortaya çıkar. Bu genellikle aşağıdaki durumlarda meydana gelir:
* window veya document gibi tarayıcıya özgü API’lerin sunucuda çalıştırılmaya çalışılması.
* Sunucu ve istemci ortamlarında farklı koşullara bağlı olarak farklı HTML çıktıları üretilmesi (örneğin, rastgele ID’ler veya zaman damgaları).
* Üçüncü taraf kütüphanelerin veya eklentilerin SSR uyumlu olmaması.

Nuxt.js, bu tür hataları en aza indirmek için tasarlanmıştır, ancak geliştiricilerin de sunucu ve istemci ortamları arasındaki farkları göz önünde bulundurması önemlidir. Tarayıcıya özgü kodları onMounted gibi lifecycle hook’larının içine almak veya process.client / process.server global değişkenlerini kullanarak koşullu çalıştırmak, hidrasyon hatalarını önlemenin yaygın yollarıdır.

Yönlendirme (Routing)

Nuxt.js, Vue Router’ı temel alan dosya sistemi tabanlı bir yönlendirme sistemi kullanır. pages dizininizdeki her .vue dosyası otomatik olarak bir rota haline gelir.

* pages/index.vue -> /
* pages/about.vue -> /about
* pages/blog/index.vue -> /blog
* pages/blog/[slug].vue -> /blog/:slug (Dinamik rota)
* pages/users/[[id]].vue -> /users veya /users/:id (İsteğe bağlı dinamik rota)

Bu sistem, rota tanımlamalarıyla uğraşmadan uygulamanızın navigasyonunu kolayca yönetmenizi sağlar. Sayfalar arasında gezinmek için bileşenini kullanırsınız:

, dahili olarak etiketlerini işler ve istemci tarafında sayfa geçişlerini Vue Router aracılığıyla optimize ederken, SSR sırasında doğru HTML bağlantılarını oluşturur.

Düzenler (Layouts)

Düzenler, uygulamanızın farklı bölümleri için ortak bir UI yapısı tanımlamanıza olanak tanır. Örneğin, bir default.vue düzeni, uygulamanızdaki tüm sayfalar için ortak bir başlık, gezinti çubuğu ve alt bilgi içerebilir.

layouts/default.vue örneği:

Bir sayfada bu düzeni kullanmak için, sayfa bileşeninizde herhangi bir şey yapmanıza gerek yoktur, çünkü default.vue varsayılan olarak kullanılır. Farklı bir düzen kullanmak isterseniz, sayfa bileşeninizde definePageMeta ile belirtebilirsiniz:




Düzenler, uygulamanızın görsel tutarlılığını sağlamak ve kod tekrarını azaltmak için güçlü bir mekanizmadır.

Pratik Örnek: Basit Bir Veri Çekme Uygulaması

Şimdi öğrendiklerimizi pekiştirmek için basit bir Nuxt.js uygulaması oluşturalım. Bu uygulama, JSONPlaceholder API’sinden gönderileri çekecek ve bunları bir sayfada listeleyecektir.

Adım 1: Projeyi Başlatma (Daha önce yapıldıysa atlayın)

Yukarıdaki “Proje Kurulumu” bölümündeki adımları izleyerek yeni bir Nuxt 3 projesi oluşturun ve geliştirme sunucusunu başlatın.

npx nuxi init nuxt-posts-app
cd nuxt-posts-app
npm install
npm run dev

Adım 2: Ana Sayfayı Düzenleme (pages/index.vue)

pages/index.vue dosyasını açın ve içeriğini aşağıdaki gibi değiştirin:





Bu kodda:
* useFetch kullanarak API’den gönderileri çekiyoruz. lazy: true seçeneği, ilk sunucu isteğinde HTML’i anında döndürmeyi, veriyi ise eşzamanlı olarak çekmeye devam etmeyi sağlar. Bu, daha hızlı bir ilk yükleme anlamına gelir, ancak veri yüklenene kadar pending durumu true kalır. server: true ise, bu isteğin hem sunucuda hem de istemcide yapılacağını belirtir.
* pending ve error durumlarını kullanarak yükleme ve hata mesajlarını gösteriyoruz.
* v-for ile çekilen gönderileri listeliyoruz.
* Her gönderinin başlığına, dinamik bir rota olan /posts/:id‘ye yönlendiren bir ekledik.
* useHead kompozisyonunu kullanarak sayfanın başlığını ve meta açıklamasını dinamik olarak ayarladık. Bu, SEO için kritik öneme sahiptir.

Adım 3: Dinamik Gönderi Detay Sayfası Oluşturma (pages/posts/[id].vue)

Şimdi, her bir gönderinin detaylarını gösterecek dinamik bir sayfa oluşturalım. pages dizininin içine posts adında bir dizin oluşturun ve içine [id].vue adında bir dosya ekleyin: pages/posts/[id].vue.





Bu kodda:
* useRoute() ile mevcut rota parametrelerine (bu durumda id) erişiyoruz.
* useAsyncData kullanarak bu id ile ilgili gönderiyi API’den çekiyoruz. Çekilen verinin benzersiz bir anahtarı olması önemlidir (post-${postId}).
* Yine pending ve error durumlarını ele alıyoruz.
* useHead ile sayfanın başlığını ve açıklamasını çekilen gönderinin verilerine göre dinamik olarak ayarlıyoruz.
* Ana sayfaya geri dönmek için bir ekledik.

Uygulamanızı npm run dev ile çalıştırın ve tarayıcınızda http://localhost:3000 adresine gidin. Gönderi listesini görmelisiniz. Herhangi bir gönderiye tıklayarak detay sayfasına gidebilirsiniz. Tarayıcınızın geliştirici araçlarını (DevTools) açıp “Network” sekmesine bakarsanız, ilk sayfa yüklemesinde sunucudan tam HTML içeriğinin geldiğini göreceksiniz. Bu, SSR’nin çalıştığının bir göstergesidir.

SEO Optimizasyonu ile Nuxt.js SSR

SSR’nin en büyük avantajlarından biri, arama motoru optimizasyonu (SEO) üzerindeki olumlu etkisidir. Nuxt.js, uygulamanızın SEO’sunu geliştirmek için güçlü araçlar sunar.

useHead Kompozisyonu

useHead kompozisyonu, Nuxt 3’te sayfa başlığını, meta etiketleri, bağlantıları ve diğer etiketlerini dinamik olarak yönetmek için kullanılır. Bu, her sayfanın arama motorları için optimize edilmiş benzersiz meta verilere sahip olmasını sağlar.

Bu, hem arama motorlarının hem de sosyal medya platformlarının (Open Graph etiketleri aracılığıyla) sayfanızın içeriğini doğru bir şekilde anlamasına yardımcı olur.

Yapılandırılmış Veri (Structured Data)

Yapılandırılmış veri (örneğin JSON-LD), arama motorlarının içeriğinizi daha iyi anlamasına ve zengin snippet’ler (rich snippets) göstermesine yardımcı olur. useHead kullanarak etiketlerini kolayca ekleyebilirsiniz:

Sitemap ve Robots.txt

Nuxt.js, sitemap ve robots.txt dosyalarını yönetmek için topluluk tarafından geliştirilmiş modüllere sahiptir. Örneğin, @nuxtjs/sitemap modülü, sitenizin tüm rotalarını otomatik olarak algılayarak bir sitemap oluşturabilir. Bu dosyalar, arama motoru örümceklerinin sitenizi daha verimli bir şekilde taramasına yardımcı olur.

Performans Optimizasyonu

SSR, algılanan performansı artırsa da, Nuxt.js uygulamalarınızın genel performansını daha da optimize etmek için bazı stratejiler uygulayabilirsiniz.

* Kod Bölme (Code Splitting): Nuxt.js, varsayılan olarak her sayfa için otomatik kod bölme yapar. Bu, bir kullanıcının yalnızca ziyaret ettiği sayfa için gerekli JavaScript'i indirmesini sağlar.
* Lazy Loading Bileşenleri: Büyük veya nadiren kullanılan bileşenleri yalnızca ihtiyaç duyulduğunda yüklemek için defineAsyncComponent veya dinamik import() kullanabilirsiniz. Nuxt.js, components dizinindeki bileşenleri otomatik olarak lazy-load eder.
* Görsel Optimizasyonu:
* Resim Optimizasyonu: nuxt-image modülü gibi araçlar, resimleri otomatik olarak optimize edebilir (boyutlandırma, format dönüştürme, lazy loading).
* WebP/AVIF Formatları: Tarayıcı desteğine göre daha modern ve sıkıştırılmış resim formatlarını kullanın.
* Önbellekleme (Caching):
* Sunucu Tarafı Önbellekleme: Sunucunuzda (örneğin, Nginx, Varnish) tam oluşturulmuş HTML sayfalarını önbelleğe almak, sunucunun her istekte sayfayı yeniden oluşturma yükünü azaltır.
* CDN (Content Delivery Network): CDN kullanarak statik varlıkları ve önbelleğe alınmış HTML'i kullanıcılara coğrafi olarak daha yakın sunarak yükleme sürelerini kısaltın.
* Minifikasyon ve Sıkıştırma: Nuxt.js, üretim derlemesi sırasında JavaScript, CSS ve HTML dosyalarını otomatik olarak küçültür (minify) ve sıkıştırır (gzip/brotli).
* Kritik CSS: İlk boyama için gerekli olan CSS'i HTML içine inline olarak eklemek, tarayıcının stil yüklenmesini beklemeden içeriği göstermesini sağlar. Nuxt.js, bunu otomatik olarak yapabilir veya purgecss gibi araçlarla entegre edilebilir.

Dağıtım (Deployment)

Nuxt.js uygulamalarını dağıtmak için birkaç seçeneğiniz vardır:

1. Node.js Sunucusu (SSR):
* Uygulamanızı derleyin: npm run build
* Uygulamanızı başlatın: npm run start
* Bu, .output/server/index.mjs dosyasını çalıştıran bir Node.js sunucusu başlatır. Kendi sunucunuzda (örneğin, PM2 ile) çalıştırabilirsiniz.
2. Statik Hosting (SSG - Statik Site Oluşturma):
* nuxt.config.ts dosyasında ssr: false olarak ayarlayarak veya generate komutunu kullanarak statik dosyalar oluşturabilirsiniz.
* Uygulamanızı derleyin ve statik olarak dışa aktarın: npm run generate
* Bu, output/public dizininde tamamen statik HTML, CSS ve JavaScript dosyaları oluşturur. Bu dosyaları herhangi bir statik hosting hizmetine (Netlify, Vercel, GitHub Pages, Nginx) dağıtabilirsiniz.
3. Vercel/Netlify:
Nuxt.js, Vercel ve Netlify gibi platformlarla sorunsuz entegrasyon sağlar. Bu platformlar, Nuxt.js projelerinizi otomatik olarak algılar ve hem SSR hem de SSG modlarını destekler. Genellikle sadece projenizi bu platformlara bağlamanız yeterlidir.

Sonuç

Nuxt.js, Vue.js geliştiricileri için sunucu taraflı oluşturma (SSR) ve statik site oluşturma (SSG) gibi modern web geliştirme paradigmalarını benimsemeyi son derece kolaylaştıran güçlü ve esnek bir çerçevedir. Bu makalede, SSR'nin temel avantajlarını (SEO, performans, kullanıcı deneyimi), Nuxt.js'in bu alandaki rolünü, bir Nuxt.js projesini nasıl kuracağınızı ve temel kavramları (veri çekme, hidrasyon, yönlendirme, düzenler) nasıl kullanacağınızı detaylı bir şekilde inceledik. Ayrıca, pratik bir örnek üzerinden veri çekme işlemini gösterdik ve SEO ile performans optimizasyonu için önemli ipuçları verdik.

Nuxt.js ile SSR uygulamaları geliştirmek, ilk yükleme hızını artırarak ve arama motorları için daha iyi indekslenebilirlik sağlayarak kullanıcılarınız ve işletmeniz için önemli faydalar sunar. Vue 3'ün Composition API'si ve Nuxt 3'ün modern araç zinciri (Vite, Nitro) sayesinde geliştirme süreci her zamankinden daha verimli ve keyifli hale gelmiştir. Web geliştirme yolculuğunuzda Nuxt.js'i keşfetmek, modern ve performanslı web uygulamaları oluşturma yeteneğinizi önemli ölçüde artıracaktır.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Mobil sürümden çık