{"id":39130,"date":"2026-02-15T03:40:53","date_gmt":"2026-02-15T00:40:53","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=39130"},"modified":"2026-02-15T03:40:53","modified_gmt":"2026-02-15T00:40:53","slug":"nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/","title":{"rendered":"Nuxt.js Kullanarak Sunucu Tarafl\u0131 Olu\u015fturmaya (SSR) Ba\u015flang\u0131\u00e7"},"content":{"rendered":"<p><body><\/p>\n<h2>Nuxt.js Kullanarak Sunucu Tarafl\u0131 Olu\u015fturmaya (SSR) Ba\u015flang\u0131\u00e7<\/h2>\n<p>Web geli\u015ftirme d\u00fcnyas\u0131, kullan\u0131c\u0131 deneyimini, arama motoru optimizasyonunu (SEO) ve performans\u0131 art\u0131rmak i\u00e7in s\u00fcrekli yeni y\u00f6ntemler sunmaktad\u0131r. Bu y\u00f6ntemlerden biri de Sunucu Tarafl\u0131 Olu\u015fturma (Server-Side Rendering &#8211; SSR) olarak \u00f6ne \u00e7\u0131kmaktad\u0131r. \u00d6zellikle modern JavaScript \u00e7er\u00e7eveleri (frameworks) ile geli\u015ftirilen tek sayfa uygulamalar\u0131n\u0131n (Single Page Applications &#8211; SPAs) kar\u015f\u0131la\u015ft\u0131\u011f\u0131 baz\u0131 zorluklara \u00e7\u00f6z\u00fcm sunan SSR, web uygulamalar\u0131n\u0131n hem kullan\u0131c\u0131lar hem de arama motorlar\u0131 i\u00e7in daha eri\u015filebilir ve h\u0131zl\u0131 olmas\u0131n\u0131 sa\u011flar. Bu makalede, SSR kavram\u0131n\u0131 derinlemesine inceleyecek, Nuxt.js gibi g\u00fc\u00e7l\u00fc bir Vue.js \u00e7er\u00e7evesi kullanarak SSR uygulamalar\u0131 geli\u015ftirmeye nas\u0131l ba\u015flayaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m ele alacak ve bu s\u00fcrecin inceliklerini ke\u015ffedece\u011fiz.<\/p>\n<h3>Sunucu Tarafl\u0131 Olu\u015fturma (SSR) Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>Web sitelerinin i\u00e7eri\u011finin taray\u0131c\u0131da g\u00f6r\u00fcnt\u00fclenme \u015feklini belirleyen \u00e7e\u015fitli olu\u015fturma stratejileri bulunmaktad\u0131r. Geleneksel olarak, dinamik i\u00e7erik sunan web siteleri genellikle sunucu tarafl\u0131 olu\u015fturma kullan\u0131rd\u0131; sunucu, her istekte tam HTML sayfas\u0131n\u0131 olu\u015fturur ve taray\u0131c\u0131ya g\u00f6nderirdi. Modern web geli\u015ftirmeyle birlikte, \u0130stemci Tarafl\u0131 Olu\u015fturma (Client-Side Rendering &#8211; CSR) pop\u00fclerlik kazand\u0131. CSR&#8217;da, taray\u0131c\u0131 sunucudan bo\u015f bir HTML dosyas\u0131 ve JavaScript paketi al\u0131r, ard\u0131ndan JavaScript \u00e7al\u0131\u015farak i\u00e7eri\u011fi taray\u0131c\u0131da olu\u015fturur. Bu yakla\u015f\u0131m, zengin ve etkile\u015fimli kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmak i\u00e7in harikayd\u0131, ancak beraberinde baz\u0131 sorunlar\u0131 da getirdi.<\/p>\n<h4>SSR ve CSR Kar\u015f\u0131la\u015ft\u0131rmas\u0131<\/h4>\n<p><strong>\u0130stemci Tarafl\u0131 Olu\u015fturma (CSR):<\/strong><br \/>\n*   <strong>Nas\u0131l \u00c7al\u0131\u015f\u0131r:<\/strong> Taray\u0131c\u0131, sunucudan minimum d\u00fczeyde HTML (genellikle sadece bir <code>div<\/code> etiketi) ve uygulaman\u0131n JavaScript kodunu al\u0131r. JavaScript indirildikten ve y\u00fcr\u00fct\u00fcld\u00fckten sonra, sayfan\u0131n t\u00fcm i\u00e7eri\u011fi taray\u0131c\u0131da olu\u015fturulur.<br \/>\n*   <strong>Avantajlar\u0131:<\/strong> Uygulama bir kez y\u00fcklendikten sonra, sonraki sayfa ge\u00e7i\u015fleri h\u0131zl\u0131d\u0131r \u00e7\u00fcnk\u00fc yaln\u0131zca veri \u00e7ekilir ve DOM g\u00fcncellenir. Zengin ve dinamik kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmak kolayd\u0131r.<br \/>\n*   <strong>Dezavantajlar\u0131:<\/strong><br \/>\n    *   <strong>\u0130lk Y\u00fckleme S\u00fcresi:<\/strong> Kullan\u0131c\u0131lar, JavaScript indirilip y\u00fcr\u00fct\u00fclene kadar bo\u015f veya y\u00fckleniyor ekran\u0131 g\u00f6r\u00fcrler. Bu durum, yava\u015f internet ba\u011flant\u0131lar\u0131nda veya b\u00fcy\u00fck JavaScript paketlerinde k\u00f6t\u00fc bir deneyim yaratabilir.<br \/>\n    *   <strong>SEO Zorluklar\u0131:<\/strong> Arama motoru \u00f6r\u00fcmcekleri (crawlers), JavaScript&#8217;i y\u00fcr\u00fctme yetene\u011fine sahip olsalar da, sayfan\u0131n i\u00e7eri\u011finin hemen HTML&#8217;de bulunmamas\u0131 indeksleme s\u00fcrecini yava\u015flatabilir veya engelleyebilir. Bu da SEO performans\u0131n\u0131 olumsuz etkileyebilir.<br \/>\n    *   <strong>Performans:<\/strong> D\u00fc\u015f\u00fck performansl\u0131 cihazlarda veya zay\u0131f a\u011f ko\u015fullar\u0131nda, JavaScript&#8217;in y\u00fcr\u00fct\u00fclmesi ve sayfan\u0131n olu\u015fturulmas\u0131 daha uzun s\u00fcrebilir.<\/p>\n<p><strong>Sunucu Tarafl\u0131 Olu\u015fturma (SSR):<\/strong><br \/>\n*   <strong>Nas\u0131l \u00c7al\u0131\u015f\u0131r:<\/strong> Her istekte, sunucu uygulaman\u0131n Vue veya React bile\u015fenlerini HTML dizgelerine d\u00f6n\u00fc\u015ft\u00fcr\u00fcr ve taray\u0131c\u0131ya tam olarak olu\u015fturulmu\u015f bir HTML sayfas\u0131 g\u00f6nderir. Taray\u0131c\u0131 bu HTML&#8217;i hemen g\u00f6r\u00fcnt\u00fcleyebilir. Ard\u0131ndan, istemci tarafl\u0131 JavaScript y\u00fcklenir ve &#8220;hidrasyon&#8221; (hydration) ad\u0131 verilen bir s\u00fcre\u00e7le etkile\u015fimli hale gelir.<br \/>\n*   <strong>Avantajlar\u0131:<\/strong><br \/>\n    *   <strong>Daha H\u0131zl\u0131 \u0130lk Y\u00fckleme:<\/strong> Kullan\u0131c\u0131lar, sayfan\u0131n i\u00e7eri\u011fini hemen g\u00f6r\u00fcrler, bu da alg\u0131lanan performans\u0131 art\u0131r\u0131r. Bo\u015f ekran bekleme s\u00fcresi ortadan kalkar.<br \/>\n    *   <strong>Geli\u015fmi\u015f SEO:<\/strong> Arama motoru \u00f6r\u00fcmcekleri, tam olu\u015fturulmu\u015f HTML&#8217;i do\u011frudan al\u0131rlar, bu da i\u00e7eri\u011fin daha kolay ve do\u011fru bir \u015fekilde indekslenmesini sa\u011flar. Bu, arama motoru s\u0131ralamalar\u0131 i\u00e7in kritik \u00f6neme sahiptir.<br \/>\n    *   <strong>Daha \u0130yi Kullan\u0131c\u0131 Deneyimi:<\/strong> \u00d6zellikle yava\u015f internet ba\u011flant\u0131lar\u0131na sahip veya eski cihaz kullanan kullan\u0131c\u0131lar i\u00e7in daha h\u0131zl\u0131 ve tutarl\u0131 bir deneyim sunar.<br \/>\n    *   <strong>Daha \u0130yi Eri\u015filebilirlik:<\/strong> JavaScript devre d\u0131\u015f\u0131 b\u0131rak\u0131lm\u0131\u015f taray\u0131c\u0131larda bile temel i\u00e7eri\u011fin eri\u015filebilir olmas\u0131n\u0131 sa\u011flar (ancak etkile\u015fimli olmayabilir).<br \/>\n*   <strong>Dezavantajlar\u0131:<\/strong><br \/>\n    *   <strong>Daha Karma\u015f\u0131k Sunucu Y\u00fck\u00fc:<\/strong> Her istekte sayfan\u0131n sunucuda olu\u015fturulmas\u0131 gerekti\u011finden, sunucu kaynaklar\u0131 daha fazla kullan\u0131l\u0131r. Bu, y\u00fcksek trafikli uygulamalar i\u00e7in ek sunucu kapasitesi gerektirebilir.<br \/>\n    *   <strong>Daha Karma\u015f\u0131k Geli\u015ftirme S\u00fcreci:<\/strong> \u0130stemci ve sunucu ortamlar\u0131 aras\u0131nda uyumluluk sorunlar\u0131, durum y\u00f6netimi ve veri \u00e7ekme gibi konularda ek dikkat gerektirebilir.<br \/>\n    *   <strong>Artan \u0130lk Sunucu Yan\u0131t S\u00fcresi (TTFB):<\/strong> Sunucunun HTML&#8217;i olu\u015fturup g\u00f6ndermesi i\u00e7in ge\u00e7en s\u00fcre, bo\u015f bir HTML g\u00f6ndermekten daha uzun olabilir. Ancak bu s\u00fcre genellikle JavaScript&#8217;in indirilip \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131na k\u0131yasla daha h\u0131zl\u0131 alg\u0131lan\u0131r.<\/p>\n<p>\u00d6zetle, SSR, uygulaman\u0131n ilk y\u00fckleme performans\u0131n\u0131 ve SEO&#8217;sunu \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirme potansiyeline sahiptir. Nuxt.js gibi \u00e7er\u00e7eveler, bu karma\u015f\u0131kl\u0131\u011f\u0131 soyutlayarak geli\u015ftiricilerin SSR&#8217;nin avantajlar\u0131ndan kolayca yararlanmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Nuxt.js&#8217;e Giri\u015f: Vue.js ile SSR&#8217;yi Kolayla\u015ft\u0131rmak<\/h3>\n<p>Nuxt.js, Vue.js ekosisteminde, \u00f6zellikle SSR ve statik site olu\u015fturma (SSG) konular\u0131nda geli\u015ftiricilerin hayat\u0131n\u0131 kolayla\u015ft\u0131rmak i\u00e7in tasarlanm\u0131\u015f a\u00e7\u0131k kaynakl\u0131, sezgisel bir \u00e7er\u00e7evedir. Vue.js \u00fczerine in\u015fa edilmi\u015f olup, bir dizi g\u00fc\u00e7l\u00fc \u00f6zellik ve konvansiyon sunarak geli\u015ftiricilerin h\u0131zl\u0131 bir \u015fekilde karma\u015f\u0131k web uygulamalar\u0131 olu\u015fturmas\u0131na olanak tan\u0131r. Nuxt.js, &#8220;meta \u00e7er\u00e7eve&#8221; olarak adland\u0131r\u0131l\u0131r \u00e7\u00fcnk\u00fc Vue.js&#8217;in \u00fczerine bir soyutlama katman\u0131 ekleyerek, dosya tabanl\u0131 y\u00f6nlendirme, veri \u00e7ekme stratejileri, durum y\u00f6netimi entegrasyonu ve daha fazlas\u0131 gibi bir\u00e7ok yayg\u0131n g\u00f6revi \u00f6nceden yap\u0131land\u0131r\u0131lm\u0131\u015f bir \u015fekilde sunar.<\/p>\n<h4>Neden Nuxt.js Kullanmal\u0131y\u0131z?<\/h4>\n<p>1.  <strong>S\u0131f\u0131r Yap\u0131land\u0131rma ile SSR:<\/strong> Nuxt.js&#8217;in en b\u00fcy\u00fck avantaj\u0131, SSR&#8217;yi varsay\u0131lan olarak desteklemesidir. Geli\u015ftiricilerin Webpack veya Babel gibi ara\u00e7larla karma\u015f\u0131k yap\u0131land\u0131rmalarla u\u011fra\u015fmas\u0131na gerek kalmadan, tek bir komutla SSR \u00f6zellikli bir Vue uygulamas\u0131 ba\u015flatabilirler.<br \/>\n2.  <strong>Dosya Sistemi Tabanl\u0131 Y\u00f6nlendirme:<\/strong> Nuxt.js, <code>pages<\/code> dizininizdeki Vue dosyalar\u0131n\u0131n yap\u0131s\u0131na g\u00f6re otomatik olarak Vue Router rotalar\u0131n\u0131 olu\u015fturur. Bu, rotalar\u0131 manuel olarak tan\u0131mlama ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r ve geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r.<br \/>\n3.  <strong>Veri \u00c7ekme Kolayl\u0131\u011f\u0131:<\/strong> Nuxt.js, bile\u015fenlerinizde veya sayfalar\u0131n\u0131zda sunucu taraf\u0131nda veri \u00e7ekmek i\u00e7in \u00f6zel y\u00f6ntemler (<code>useAsyncData<\/code>, <code>useFetch<\/code>) sunar. Bu, verilerin sayfa olu\u015fturulmadan \u00f6nce haz\u0131r olmas\u0131n\u0131 sa\u011flar ve hidrasyon sorunlar\u0131n\u0131 minimize eder.<br \/>\n4.  <strong>Otomatik Kod B\u00f6lme (Code Splitting):<\/strong> Her sayfa i\u00e7in otomatik olarak kod b\u00f6lme yapar, bu da uygulaman\u0131n sadece o sayfa i\u00e7in gerekli JavaScript&#8217;i y\u00fcklemesini sa\u011flayarak performans\u0131 art\u0131r\u0131r.<br \/>\n5.  <strong>Katmanl\u0131 Yap\u0131 (Layers):<\/strong> Nuxt 3 ile gelen katmanlar \u00f6zelli\u011fi, birden fazla Nuxt projesini veya mod\u00fcl\u00fc bir araya getirerek daha mod\u00fcler ve yeniden kullan\u0131labilir uygulamalar olu\u015fturmay\u0131 sa\u011flar.<br \/>\n6.  <strong>Geli\u015ftirici Deneyimi (DX):<\/strong> Nuxt.js, iyi belgelenmi\u015f, aktif bir toplulu\u011fa sahip ve bir\u00e7ok kullan\u0131\u015fl\u0131 mod\u00fcl (mod\u00fcller) ile geni\u015fletilebilir. Bu, geli\u015ftiricilerin sorunlar\u0131 \u00e7\u00f6zmesini ve yeni \u00f6zellikler eklemesini kolayla\u015ft\u0131r\u0131r.<br \/>\n7.  <strong>\u00c7e\u015fitli Olu\u015fturma Modlar\u0131:<\/strong> SSR&#8217;nin yan\u0131 s\u0131ra, Nuxt.js statik site olu\u015fturma (SSG) ve istemci taraf\u0131 olu\u015fturma (SPA) modlar\u0131n\u0131 da destekler. Bu esneklik, projenizin gereksinimlerine en uygun olu\u015fturma stratejisini se\u00e7menize olanak tan\u0131r.<\/p>\n<p>Nuxt.js, Vue.js&#8217;in g\u00fcc\u00fcn\u00fc al\u0131p, modern web uygulamalar\u0131n\u0131n geli\u015ftirilmesi i\u00e7in gerekli olan bir\u00e7ok karma\u015f\u0131k altyap\u0131sal konuyu soyutlayarak geli\u015ftiricilere odaklanmalar\u0131 gereken as\u0131l i\u015fe, yani kullan\u0131c\u0131 aray\u00fcz\u00fc ve i\u015f mant\u0131\u011f\u0131na odaklanma f\u0131rsat\u0131 verir. \u00d6zellikle Nuxt 3, Vue 3, Vite ve Nitro gibi modern ara\u00e7larla birlikte gelerek daha h\u0131zl\u0131 geli\u015ftirme, daha k\u00fc\u00e7\u00fck paket boyutlar\u0131 ve daha iyi performans sunar.<\/p>\n<h3>Nuxt.js Projesi Kurulumu<\/h3>\n<p>Nuxt.js ile bir SSR uygulamas\u0131 geli\u015ftirmeye ba\u015flamak olduk\u00e7a basittir. \u0130lk olarak, sisteminizde Node.js ve npm veya Yarn&#8217;\u0131n kurulu oldu\u011fundan emin olmal\u0131s\u0131n\u0131z. Nuxt.js&#8217;in en son stabil s\u00fcr\u00fcm\u00fc olan Nuxt 3&#8217;\u00fc kullanarak kurulumu ger\u00e7ekle\u015ftirece\u011fiz.<\/p>\n<h4>\u00d6nko\u015fullar<\/h4>\n<p>*   <strong>Node.js:<\/strong> En az Node.js 16.x veya daha yenisi (LTS s\u00fcr\u00fcm\u00fc \u00f6nerilir). <code>node -v<\/code> komutu ile kontrol edebilirsiniz.<br \/>\n*   <strong>npm veya Yarn:<\/strong> Node.js ile birlikte gelir. <code>npm -v<\/code> veya <code>yarn -v<\/code> ile kontrol edebilirsiniz.<\/p>\n<h4>Proje Olu\u015fturma<\/h4>\n<p>Terminalinizde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rarak yeni bir Nuxt 3 projesi olu\u015fturabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">npx nuxi init nuxt3-ssr-app<\/code><\/pre>\n<p>*   <code>npx nuxi init<\/code>: Nuxt.js 3 projeleri olu\u015fturmak i\u00e7in kullan\u0131lan komuttur.<br \/>\n*   <code>nuxt3-ssr-app<\/code>: Projenizin ad\u0131. \u0130stedi\u011finiz ismi verebilirsiniz.<\/p>\n<p>Bu komut \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda, Nuxt.js gerekli dosyalar\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 indirip yap\u0131land\u0131racakt\u0131r. \u0130\u015flem tamamland\u0131\u011f\u0131nda, proje dizininize ge\u00e7in:<\/p>\n<pre><code class=\"language-bash\">cd nuxt3-ssr-app<\/code><\/pre>\n<p>Ard\u0131ndan, ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleyin:<\/p>\n<pre><code class=\"language-bash\">npm install # veya yarn install<\/code><\/pre>\n<p>Son olarak, geli\u015ftirme sunucusunu ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">npm run dev # veya yarn dev<\/code><\/pre>\n<p>Bu komut, uygulaman\u0131z\u0131 geli\u015ftirme modunda ba\u015flat\u0131r. Taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost:3000<\/code> adresine giderek Nuxt.js ba\u015flang\u0131\u00e7 sayfas\u0131n\u0131 g\u00f6rmelisiniz.<\/p>\n<h4>Proje Yap\u0131s\u0131<\/h4>\n<p>Yeni olu\u015fturulan Nuxt.js projesinin temel dizin yap\u0131s\u0131 a\u015fa\u011f\u0131daki gibidir:<\/p>\n<pre><code class=\"language-\">nuxt3-ssr-app\/\n\u251c\u2500\u2500 .nuxt\/             # Nuxt.js taraf\u0131ndan olu\u015fturulan ge\u00e7ici dosyalar\n\u251c\u2500\u2500 .output\/           # \u00dcretim i\u00e7in derlenmi\u015f \u00e7\u0131kt\u0131 (build)\n\u251c\u2500\u2500 assets\/            # CSS, resimler, fontlar gibi statik varl\u0131klar\n\u251c\u2500\u2500 components\/        # Yeniden kullan\u0131labilir Vue bile\u015fenleri\n\u251c\u2500\u2500 composables\/       # Vue 3 Composition API i\u00e7in \u00f6zel hook'lar\n\u251c\u2500\u2500 layouts\/           # Uygulaman\u0131z\u0131n d\u00fczenleri (\u00f6r. default.vue)\n\u251c\u2500\u2500 middleware\/        # Rota ba\u015f\u0131na \u00e7al\u0131\u015fan ara yaz\u0131l\u0131mlar\n\u251c\u2500\u2500 node_modules\/      # Proje ba\u011f\u0131ml\u0131l\u0131klar\u0131\n\u251c\u2500\u2500 pages\/             # Uygulaman\u0131z\u0131n sayfalar\u0131 (dosya tabanl\u0131 y\u00f6nlendirme)\n\u251c\u2500\u2500 plugins\/           # Vue uygulamas\u0131na global olarak eklenecek eklentiler\n\u251c\u2500\u2500 public\/            # Do\u011frudan sunulan statik dosyalar (root dizini gibi)\n\u251c\u2500\u2500 server\/            # API rotalar\u0131 ve sunucu ara yaz\u0131l\u0131mlar\u0131\n\u251c\u2500\u2500 app.vue            # Uygulaman\u0131z\u0131n ana bile\u015feni\n\u251c\u2500\u2500 nuxt.config.ts     # Nuxt.js yap\u0131land\u0131rma dosyas\u0131\n\u251c\u2500\u2500 package.json       # Proje meta verileri ve ba\u011f\u0131ml\u0131l\u0131klar\u0131\n\u251c\u2500\u2500 tsconfig.json      # TypeScript yap\u0131land\u0131rma dosyas\u0131\n\u2514\u2500\u2500 .env               # Ortam de\u011fi\u015fkenleri<\/code><\/pre>\n<p>*   <strong><code>pages\/<\/code><\/strong>: Bu dizin, Nuxt.js&#8217;in dosya sistemi tabanl\u0131 y\u00f6nlendirme sistemini kulland\u0131\u011f\u0131 yerdir. Her <code>.vue<\/code> dosyas\u0131 bir rota haline gelir. \u00d6rne\u011fin, <code>pages\/index.vue<\/code> ana sayfay\u0131, <code>pages\/about.vue<\/code> <code>\/about<\/code> rotas\u0131n\u0131 temsil eder. Dinamik rotalar i\u00e7in <code>pages\/users\/[id].vue<\/code> gibi yap\u0131lar kullanabilirsiniz.<br \/>\n*   <strong><code>components\/<\/code><\/strong>: Uygulaman\u0131zda yeniden kullan\u0131labilir Vue bile\u015fenlerini i\u00e7erir. Nuxt.js, bu bile\u015fenleri otomatik olarak i\u00e7e aktar\u0131r (auto-import), bu da <code>import<\/code> ifadelerini yazma ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r.<br \/>\n*   <strong><code>layouts\/<\/code><\/strong>: Uygulaman\u0131z\u0131n farkl\u0131 b\u00f6l\u00fcmleri i\u00e7in d\u00fczen \u015fablonlar\u0131 tan\u0131mlar. \u00d6rne\u011fin, bir <code>default.vue<\/code> d\u00fczeni, uygulaman\u0131zdaki t\u00fcm sayfalar i\u00e7in ortak bir ba\u015fl\u0131k ve alt bilgi i\u00e7erebilir.<br \/>\n*   <strong><code>public\/<\/code><\/strong>: Do\u011frudan web sunucusu taraf\u0131ndan sunulan statik dosyalar\u0131 (\u00f6rne\u011fin, <code>favicon.ico<\/code>, <code>robots.txt<\/code>) i\u00e7erir. Bu dizindeki dosyalar, uygulaman\u0131n k\u00f6k dizininden eri\u015filebilir.<br \/>\n*   <strong><code>app.vue<\/code><\/strong>: Nuxt.js uygulaman\u0131z\u0131n ana bile\u015fenidir. Genellikle <code><NuxtLayout><\/code> ve <code><NuxtPage><\/code> bile\u015fenlerini i\u00e7erir.<br \/>\n*   <strong><code>nuxt.config.ts<\/code><\/strong>: Nuxt.js uygulaman\u0131z\u0131n ana yap\u0131land\u0131rma dosyas\u0131d\u0131r. Mod\u00fcller, ba\u015fl\u0131k ayarlar\u0131, CSS, \u00e7al\u0131\u015fma zaman\u0131 yap\u0131land\u0131rmas\u0131 ve daha fazlas\u0131n\u0131 burada tan\u0131mlars\u0131n\u0131z.<\/p>\n<p>Bu yap\u0131, Nuxt.js&#8217;in &#8220;konvansiyonla yap\u0131land\u0131rma&#8221; (convention over configuration) felsefesini yans\u0131t\u0131r ve geli\u015ftiricilerin \u00e7o\u011fu durumda ek yap\u0131land\u0131rma yapmadan h\u0131zl\u0131ca \u00e7al\u0131\u015fmaya ba\u015flamas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Nuxt.js&#8217;te SSR&#8217;nin Temel Kavramlar\u0131<\/h3>\n<p>Nuxt.js, SSR&#8217;yi kolayla\u015ft\u0131rmak i\u00e7in bir dizi temel kavram ve ara\u00e7 sunar. Bu kavramlar\u0131 anlamak, Nuxt.js uygulamalar\u0131n\u0131zda veri \u00e7ekme, durum y\u00f6netimi ve performans optimizasyonu gibi konularda do\u011fru kararlar vermenizi sa\u011flar.<\/p>\n<h4>Universal Mod (Varsay\u0131lan)<\/h4>\n<p>Nuxt.js&#8217;in varsay\u0131lan \u00e7al\u0131\u015fma modu &#8220;Universal&#8221; modudur. Bu, uygulaman\u0131z\u0131n hem sunucu taraf\u0131nda (ilk istekte) hem de istemci taraf\u0131nda (sonraki navigasyonlarda ve etkile\u015fimlerde) \u00e7al\u0131\u015ft\u0131r\u0131labilece\u011fi anlam\u0131na gelir.<\/p>\n<p>*   <strong>Sunucu Taraf\u0131:<\/strong> Bir kullan\u0131c\u0131 ilk kez uygulaman\u0131za eri\u015fti\u011finde veya sayfay\u0131 yeniledi\u011finde, Nuxt.js sunucuda Vue bile\u015fenlerini HTML dizgelerine d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Bu HTML, taray\u0131c\u0131ya g\u00f6nderilir ve kullan\u0131c\u0131 hemen i\u00e7eri\u011fi g\u00f6r\u00fcr.<br \/>\n*   <strong>\u0130stemci Taraf\u0131:<\/strong> HTML taray\u0131c\u0131ya ula\u015ft\u0131ktan sonra, Nuxt.js istemci tarafl\u0131 JavaScript&#8217;i y\u00fckler. Bu JavaScript, sunucudan gelen HTML&#8217;i &#8220;hidrate&#8221; eder, yani HTML&#8217;i Vue bile\u015fenleriyle e\u015fle\u015ftirir ve etkile\u015fimli hale getirir. Sonraki navigasyonlar i\u00e7in, Nuxt.js bir SPA gibi davran\u0131r; sayfa ge\u00e7i\u015fleri taray\u0131c\u0131da ger\u00e7ekle\u015fir ve sunucuya tam sayfa iste\u011fi yap\u0131lmaz.<\/p>\n<p>Bu hibrit yakla\u015f\u0131m, hem SEO ve ilk y\u00fckleme performans\u0131 avantajlar\u0131n\u0131 (SSR) hem de h\u0131zl\u0131 sayfa ge\u00e7i\u015fleri ve zengin etkile\u015fim avantajlar\u0131n\u0131 (CSR) bir araya getirir.<\/p>\n<h4>Veri \u00c7ekme (Data Fetching)<\/h4>\n<p>SSR uygulamalar\u0131nda veri \u00e7ekme, kritik bir konudur. Verilerin sayfa olu\u015fturulmadan \u00f6nce sunucuda haz\u0131r olmas\u0131 gerekir ki, tam olu\u015fturulmu\u015f HTML taray\u0131c\u0131ya g\u00f6nderilebilsin. Nuxt.js 3, veri \u00e7ekme i\u00e7in modern ve g\u00fc\u00e7l\u00fc bir dizi Composition API i\u015flevi sunar:<\/p>\n<p>*   <strong><code>useAsyncData<\/code>:<\/strong><br \/>\n    Bu, Nuxt.js&#8217;in ana veri \u00e7ekme kompozisyonudur. Bir Vue bile\u015feni veya sayfa y\u00fcklenmeden \u00f6nce sunucuda (veya istemcide) asenkron veri \u00e7ekmek i\u00e7in kullan\u0131l\u0131r. <code>useAsyncData<\/code>, bir anahtar, bir veri \u00e7ekme fonksiyonu ve iste\u011fe ba\u011fl\u0131 se\u00e7enekler al\u0131r.<\/p>\n<pre><code class=\"language-vue\"><script setup>\n    const { data: products, pending, error, refresh } = await useAsyncData(\n      'products', \/\/ Benzersiz bir anahtar\n      () => $fetch('https:\/\/api.example.com\/products') \/\/ Veri \u00e7ekme fonksiyonu\n    );\n    <\/script>\n\n    <template>\n      <div>\n        <h2>\u00dcr\u00fcnler<\/h2>\n        <p v-if=\"pending\">Y\u00fckleniyor...<\/p>\n        <p v-else-if=\"error\">Bir hata olu\u015ftu: {{ error.message }}<\/p>\n        <ul v-else>\n          <li v-for=\"product in products\" :key=\"product.id\">\n            {{ product.name }} - {{ product.price }} TL\n          <\/li>\n        <\/ul>\n        <button @click=\"refresh\">Yenile<\/button>\n      <\/div>\n    <\/template><\/code><\/pre>\n<p>    *   <code>data<\/code>: \u00c7ekilen veriyi i\u00e7erir.<br \/>\n    *   <code>pending<\/code>: Veri \u00e7ekme i\u015flemi devam ederken <code>true<\/code>, tamamland\u0131\u011f\u0131nda <code>false<\/code> olur.<br \/>\n    *   <code>error<\/code>: Bir hata olu\u015fursa hata nesnesini i\u00e7erir.<br \/>\n    *   <code>refresh<\/code>: Veri \u00e7ekme i\u015flemini manuel olarak yeniden tetiklemek i\u00e7in bir fonksiyon.<\/p>\n<p>    <code>useAsyncData<\/code> varsay\u0131lan olarak sunucuda \u00e7al\u0131\u015f\u0131r ve sonu\u00e7lar\u0131 istemciye hidrasyon i\u00e7in ta\u015f\u0131r. \u0130stemci taraf\u0131nda bir sonraki sayfa ge\u00e7i\u015finde, veri tekrar \u00e7ekilir ancak istemci taraf\u0131nda.<\/p>\n<p>*   <strong><code>useFetch<\/code>:<\/strong><br \/>\n    <code>useFetch<\/code>, <code>useAsyncData<\/code>&#8216;n\u0131n \u00fczerine in\u015fa edilmi\u015f, API istekleri i\u00e7in daha basit bir sarmalay\u0131c\u0131d\u0131r. Genellikle do\u011frudan bir URL&#8217;den veri \u00e7ekmek i\u00e7in kullan\u0131l\u0131r. <code>useAsyncData<\/code> ile benzer \u015fekilde <code>data<\/code>, <code>pending<\/code>, <code>error<\/code> ve <code>refresh<\/code> gibi \u00f6zellikleri d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-vue\"><script setup>\n    const { data: posts, pending, error } = await useFetch('https:\/\/jsonplaceholder.typicode.com\/posts');\n    <\/script>\n\n    <template>\n      <div>\n        <h2>G\u00f6nderiler<\/h2>\n        <p v-if=\"pending\">G\u00f6nderiler y\u00fckleniyor...<\/p>\n        <p v-else-if=\"error\">Hata: {{ error.message }}<\/p>\n        <ul v-else>\n          <li v-for=\"post in posts\" :key=\"post.id\">\n            <h3>{{ post.title }}<\/h3>\n            <p>{{ post.body }}<\/p>\n          <\/li>\n        <\/ul>\n      <\/div>\n    <\/template><\/code><\/pre>\n<p>    <code>useFetch<\/code> dahili olarak Nuxt.js&#8217;in <code>$fetch<\/code> yard\u0131mc\u0131 fonksiyonunu kullan\u0131r. <code>$fetch<\/code>, <code>node-fetch<\/code> (sunucuda) ve taray\u0131c\u0131n\u0131n <code>fetch<\/code> API&#8217;si (istemcide) aras\u0131nda soyutlama sa\u011flar ve otomatik olarak istekleri i\u015fler.<\/p>\n<p>*   <strong><code>$fetch<\/code> Yard\u0131mc\u0131 Fonksiyonu:<\/strong><br \/>\n    Nuxt.js, API istekleri yapmak i\u00e7in global olarak kullan\u0131labilen <code>$fetch<\/code> yard\u0131mc\u0131 fonksiyonunu sa\u011flar. Bu, do\u011frudan bir API endpoint&#8217;ine istek g\u00f6ndermek istedi\u011finizde kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-javascript\">const response = await $fetch('\/api\/my-endpoint', {\n      method: 'POST',\n      body: { key: 'value' }\n    });<\/code><\/pre>\n<p>    <code>$fetch<\/code>, ayn\u0131 zamanda Nuxt.js&#8217;in yerle\u015fik sunucu API rotalar\u0131 ile de sorunsuz \u00e7al\u0131\u015f\u0131r.<\/p>\n<h4>Hidrasyon (Hydration)<\/h4>\n<p>Hidrasyon, SSR&#8217;nin kritik bir par\u00e7as\u0131d\u0131r. Sunucu taraf\u0131ndan olu\u015fturulan statik HTML&#8217;in istemci taraf\u0131nda etkile\u015fimli Vue uygulamas\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fclmesi s\u00fcrecidir. Taray\u0131c\u0131, sunucudan HTML&#8217;i ald\u0131ktan sonra, Vue.js istemci taraf\u0131ndaki JavaScript&#8217;i indirir ve bu JavaScript, mevcut HTML yap\u0131s\u0131n\u0131 Vue bile\u015fenleriyle e\u015fle\u015ftirerek olay dinleyicilerini ve reaktif \u00f6zellikleri ekler.<\/p>\n<p><strong>Hidrasyonun \u00d6nemi:<\/strong><br \/>\n*   <strong>Etkile\u015fim:<\/strong> Hidrasyon olmadan, sunucudan gelen HTML sadece statik bir g\u00f6r\u00fcnt\u00fc olurdu. Kullan\u0131c\u0131lar\u0131n d\u00fc\u011fmelere t\u0131klamas\u0131, form doldurmas\u0131 gibi etkile\u015fimler hidrasyon sayesinde m\u00fcmk\u00fcn olur.<br \/>\n*   <strong>Durum Senkronizasyonu:<\/strong> Sunucuda \u00e7ekilen veriler ve bile\u015fen durumu, hidrasyon s\u0131ras\u0131nda istemciye aktar\u0131l\u0131r. Bu, uygulaman\u0131n sunucu ve istemci aras\u0131nda tutarl\u0131 bir durumda kalmas\u0131n\u0131 sa\u011flar.<\/p>\n<p><strong>Hidrasyon Hatalar\u0131:<\/strong><br \/>\nHidrasyon hatalar\u0131 (hydration mismatch), sunucuda olu\u015fturulan HTML ile istemcide beklenen HTML aras\u0131nda bir tutars\u0131zl\u0131k oldu\u011funda ortaya \u00e7\u0131kar. Bu genellikle a\u015fa\u011f\u0131daki durumlarda meydana gelir:<br \/>\n*   <code>window<\/code> veya <code>document<\/code> gibi taray\u0131c\u0131ya \u00f6zg\u00fc API&#8217;lerin sunucuda \u00e7al\u0131\u015ft\u0131r\u0131lmaya \u00e7al\u0131\u015f\u0131lmas\u0131.<br \/>\n*   Sunucu ve istemci ortamlar\u0131nda farkl\u0131 ko\u015fullara ba\u011fl\u0131 olarak farkl\u0131 HTML \u00e7\u0131kt\u0131lar\u0131 \u00fcretilmesi (\u00f6rne\u011fin, rastgele ID&#8217;ler veya zaman damgalar\u0131).<br \/>\n*   \u00dc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerin veya eklentilerin SSR uyumlu olmamas\u0131.<\/p>\n<p>Nuxt.js, bu t\u00fcr hatalar\u0131 en aza indirmek i\u00e7in tasarlanm\u0131\u015ft\u0131r, ancak geli\u015ftiricilerin de sunucu ve istemci ortamlar\u0131 aras\u0131ndaki farklar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmas\u0131 \u00f6nemlidir. Taray\u0131c\u0131ya \u00f6zg\u00fc kodlar\u0131 <code>onMounted<\/code> gibi lifecycle hook&#8217;lar\u0131n\u0131n i\u00e7ine almak veya <code>process.client<\/code> \/ <code>process.server<\/code> global de\u011fi\u015fkenlerini kullanarak ko\u015fullu \u00e7al\u0131\u015ft\u0131rmak, hidrasyon hatalar\u0131n\u0131 \u00f6nlemenin yayg\u0131n yollar\u0131d\u0131r.<\/p>\n<h4>Y\u00f6nlendirme (Routing)<\/h4>\n<p>Nuxt.js, Vue Router&#8217;\u0131 temel alan dosya sistemi tabanl\u0131 bir y\u00f6nlendirme sistemi kullan\u0131r. <code>pages<\/code> dizininizdeki her <code>.vue<\/code> dosyas\u0131 otomatik olarak bir rota haline gelir.<\/p>\n<p>*   <code>pages\/index.vue<\/code> -> <code>\/<\/code><br \/>\n*   <code>pages\/about.vue<\/code> -> <code>\/about<\/code><br \/>\n*   <code>pages\/blog\/index.vue<\/code> -> <code>\/blog<\/code><br \/>\n*   <code>pages\/blog\/[slug].vue<\/code> -> <code>\/blog\/:slug<\/code> (Dinamik rota)<br \/>\n*   <code>pages\/users\/[[id]].vue<\/code> -> <code>\/users<\/code> veya <code>\/users\/:id<\/code> (\u0130ste\u011fe ba\u011fl\u0131 dinamik rota)<\/p>\n<p>Bu sistem, rota tan\u0131mlamalar\u0131yla u\u011fra\u015fmadan uygulaman\u0131z\u0131n navigasyonunu kolayca y\u00f6netmenizi sa\u011flar. Sayfalar aras\u0131nda gezinmek i\u00e7in <code><NuxtLink><\/code> bile\u015fenini kullan\u0131rs\u0131n\u0131z:<\/p>\n<pre><code class=\"language-vue\"><template>\n  <nav>\n    <NuxtLink to=\"\/\">Ana Sayfa<\/NuxtLink>\n    <NuxtLink to=\"\/about\">Hakk\u0131m\u0131zda<\/NuxtLink>\n    <NuxtLink to=\"\/blog\/ilk-yazi\">\u0130lk Yaz\u0131<\/NuxtLink>\n  <\/nav>\n<\/template><\/code><\/pre>\n<p><code><NuxtLink><\/code>, dahili olarak <code><a><\/code> etiketlerini i\u015fler ve istemci taraf\u0131nda sayfa ge\u00e7i\u015flerini Vue Router arac\u0131l\u0131\u011f\u0131yla optimize ederken, SSR s\u0131ras\u0131nda do\u011fru HTML ba\u011flant\u0131lar\u0131n\u0131 olu\u015fturur.<\/p>\n<h4>D\u00fczenler (Layouts)<\/h4>\n<p>D\u00fczenler, uygulaman\u0131z\u0131n farkl\u0131 b\u00f6l\u00fcmleri i\u00e7in ortak bir UI yap\u0131s\u0131 tan\u0131mlaman\u0131za olanak tan\u0131r. \u00d6rne\u011fin, bir <code>default.vue<\/code> d\u00fczeni, uygulaman\u0131zdaki t\u00fcm sayfalar i\u00e7in ortak bir ba\u015fl\u0131k, gezinti \u00e7ubu\u011fu ve alt bilgi i\u00e7erebilir.<\/p>\n<p><code>layouts\/default.vue<\/code> \u00f6rne\u011fi:<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <header>\n      \n      <nav>\n        <NuxtLink to=\"\/\">Ana Sayfa<\/NuxtLink>\n        <NuxtLink to=\"\/about\">Hakk\u0131m\u0131zda<\/NuxtLink>\n      <\/nav>\n    <\/header>\n    <main>\n      <slot \/> <!-- Sayfa i\u00e7eri\u011fi buraya render edilecek -->\n    <\/main>\n    <footer>\n      <p>&copy; 2023 Nuxt.js SSR Uygulamas\u0131<\/p>\n    <\/footer>\n  <\/div>\n<\/template><\/code><\/pre>\n<p>Bir sayfada bu d\u00fczeni kullanmak i\u00e7in, sayfa bile\u015feninizde herhangi bir \u015fey yapman\u0131za gerek yoktur, \u00e7\u00fcnk\u00fc <code>default.vue<\/code> varsay\u0131lan olarak kullan\u0131l\u0131r. Farkl\u0131 bir d\u00fczen kullanmak isterseniz, sayfa bile\u015feninizde <code>definePageMeta<\/code> ile belirtebilirsiniz:<\/p>\n<pre><code class=\"language-vue\"><!-- pages\/custom-layout-page.vue -->\n<script setup>\ndefinePageMeta({\n  layout: 'custom', \/\/ layouts\/custom.vue dosyas\u0131n\u0131 kullan\u0131r\n});\n<\/script>\n\n<template>\n  <div>\n    <h2>\u00d6zel D\u00fczen Sayfas\u0131<\/h2>\n    <p>Bu sayfa \u00f6zel bir d\u00fczene sahiptir.<\/p>\n  <\/div>\n<\/template><\/code><\/pre>\n<p>D\u00fczenler, uygulaman\u0131z\u0131n g\u00f6rsel tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamak ve kod tekrar\u0131n\u0131 azaltmak i\u00e7in g\u00fc\u00e7l\u00fc bir mekanizmad\u0131r.<\/p>\n<h3>Pratik \u00d6rnek: Basit Bir Veri \u00c7ekme Uygulamas\u0131<\/h3>\n<p>\u015eimdi \u00f6\u011frendiklerimizi peki\u015ftirmek i\u00e7in basit bir Nuxt.js uygulamas\u0131 olu\u015ftural\u0131m. Bu uygulama, JSONPlaceholder API&#8217;sinden g\u00f6nderileri \u00e7ekecek ve bunlar\u0131 bir sayfada listeleyecektir.<\/p>\n<h4>Ad\u0131m 1: Projeyi Ba\u015flatma (Daha \u00f6nce yap\u0131ld\u0131ysa atlay\u0131n)<\/h4>\n<p>Yukar\u0131daki &#8220;Proje Kurulumu&#8221; b\u00f6l\u00fcm\u00fcndeki ad\u0131mlar\u0131 izleyerek yeni bir Nuxt 3 projesi olu\u015fturun ve geli\u015ftirme sunucusunu ba\u015flat\u0131n.<\/p>\n<pre><code class=\"language-bash\">npx nuxi init nuxt-posts-app\ncd nuxt-posts-app\nnpm install\nnpm run dev<\/code><\/pre>\n<h4>Ad\u0131m 2: Ana Sayfay\u0131 D\u00fczenleme (<code>pages\/index.vue<\/code>)<\/h4>\n<p><code>pages\/index.vue<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve i\u00e7eri\u011fini a\u015fa\u011f\u0131daki gibi de\u011fi\u015ftirin:<\/p>\n<pre><code class=\"language-vue\"><script setup>\n\/\/ useFetch ile JSONPlaceholder'dan g\u00f6nderileri \u00e7ekiyoruz\nconst { data: posts, pending, error } = await useFetch('https:\/\/jsonplaceholder.typicode.com\/posts', {\n  lazy: true, \/\/ Verinin istemci taraf\u0131nda da \u00e7ekilmesini sa\u011flar, ilk y\u00fcklemede bo\u015f HTML g\u00f6nderilmez\n  server: true \/\/ Varsay\u0131lan olarak true'dur, ancak belirtmek faydal\u0131\n});\n\n\/\/ Sayfa ba\u015fl\u0131\u011f\u0131 ve meta etiketleri i\u00e7in useHead kullan\u0131yoruz\nuseHead({\n  title: 'Nuxt.js Blog G\u00f6nderileri',\n  meta: [\n    { name: 'description', content: 'Nuxt.js ile sunucu tarafl\u0131 olu\u015fturulmu\u015f blog g\u00f6nderileri listesi.' }\n  ],\n  bodyAttrs: {\n    class: 'blog-page'\n  }\n});\n<\/script>\n\n<template>\n  <div class=\"container\">\n    \n\n    <p v-if=\"pending\">G\u00f6nderiler y\u00fckleniyor...<\/p>\n    <p v-else-if=\"error\" class=\"error-message\">Hata olu\u015ftu: {{ error.message }}<\/p>\n    <div v-else class=\"posts-list\">\n      <div v-for=\"post in posts\" :key=\"post.id\" class=\"post-card\">\n        <h2>\n          <NuxtLink :to=\"<code>\/posts\/${post.id}<\/code>\">{{ post.title }}<\/NuxtLink>\n        <\/h2>\n        <p>{{ post.body.substring(0, 100) }}...<\/p>\n        <NuxtLink :to=\"<code>\/posts\/${post.id}<\/code>\" class=\"read-more\">Devam\u0131n\u0131 Oku<\/NuxtLink>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/template>\n\n<style scoped>\n.container {\n  max-width: 800px;\n  margin: 0 auto;\n  padding: 20px;\n  font-family: Arial, sans-serif;\n}\n\nh1 {\n  color: #333;\n  text-align: center;\n  margin-bottom: 30px;\n}\n\n.error-message {\n  color: red;\n  text-align: center;\n}\n\n.posts-list {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n  gap: 20px;\n}\n\n.post-card {\n  border: 1px solid #eee;\n  border-radius: 8px;\n  padding: 20px;\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n  transition: transform 0.2s;\n}\n\n.post-card:hover {\n  transform: translateY(-5px);\n}\n\n.post-card h2 {\n  margin-top: 0;\n  margin-bottom: 10px;\n  font-size: 1.5em;\n}\n\n.post-card h2 a {\n  text-decoration: none;\n  color: #007bff;\n}\n\n.post-card h2 a:hover {\n  text-decoration: underline;\n}\n\n.post-card p {\n  color: #555;\n  line-height: 1.6;\n}\n\n.read-more {\n  display: inline-block;\n  margin-top: 15px;\n  color: #007bff;\n  text-decoration: none;\n  font-weight: bold;\n}\n\n.read-more:hover {\n  text-decoration: underline;\n}\n<\/style><\/code><\/pre>\n<p>Bu kodda:<br \/>\n*   <code>useFetch<\/code> kullanarak API&#8217;den g\u00f6nderileri \u00e7ekiyoruz. <code>lazy: true<\/code> se\u00e7ene\u011fi, ilk sunucu iste\u011finde HTML&#8217;i an\u0131nda d\u00f6nd\u00fcrmeyi, veriyi ise e\u015fzamanl\u0131 olarak \u00e7ekmeye devam etmeyi sa\u011flar. Bu, daha h\u0131zl\u0131 bir ilk y\u00fckleme anlam\u0131na gelir, ancak veri y\u00fcklenene kadar <code>pending<\/code> durumu <code>true<\/code> kal\u0131r. <code>server: true<\/code> ise, bu iste\u011fin hem sunucuda hem de istemcide yap\u0131laca\u011f\u0131n\u0131 belirtir.<br \/>\n*   <code>pending<\/code> ve <code>error<\/code> durumlar\u0131n\u0131 kullanarak y\u00fckleme ve hata mesajlar\u0131n\u0131 g\u00f6steriyoruz.<br \/>\n*   <code>v-for<\/code> ile \u00e7ekilen g\u00f6nderileri listeliyoruz.<br \/>\n*   Her g\u00f6nderinin ba\u015fl\u0131\u011f\u0131na, dinamik bir rota olan <code>\/posts\/:id<\/code>&#8216;ye y\u00f6nlendiren bir <code><NuxtLink><\/code> ekledik.<br \/>\n*   <code>useHead<\/code> kompozisyonunu kullanarak sayfan\u0131n ba\u015fl\u0131\u011f\u0131n\u0131 ve meta a\u00e7\u0131klamas\u0131n\u0131 dinamik olarak ayarlad\u0131k. Bu, SEO i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h4>Ad\u0131m 3: Dinamik G\u00f6nderi Detay Sayfas\u0131 Olu\u015fturma (<code>pages\/posts\/[id].vue<\/code>)<\/h4>\n<p>\u015eimdi, her bir g\u00f6nderinin detaylar\u0131n\u0131 g\u00f6sterecek dinamik bir sayfa olu\u015ftural\u0131m. <code>pages<\/code> dizininin i\u00e7ine <code>posts<\/code> ad\u0131nda bir dizin olu\u015fturun ve i\u00e7ine <code>[id].vue<\/code> ad\u0131nda bir dosya ekleyin: <code>pages\/posts\/[id].vue<\/code>.<\/p>\n<pre><code class=\"language-vue\"><script setup>\n\/\/ Rota parametrelerine eri\u015fmek i\u00e7in useRoute kullan\u0131yoruz\nconst route = useRoute();\nconst postId = route.params.id;\n\n\/\/ useAsyncData ile belirli bir g\u00f6nderiyi \u00e7ekiyoruz\nconst { data: post, pending, error } = await useAsyncData(\n  <code>post-${postId}<\/code>, \/\/ Benzersiz anahtar\n  () => $fetch(<code>https:\/\/jsonplaceholder.typicode.com\/posts\/${postId}<\/code>)\n);\n\n\/\/ Sayfa ba\u015fl\u0131\u011f\u0131n\u0131 dinamik olarak ayarl\u0131yoruz\nuseHead({\n  title: post.value ? post.value.title : 'G\u00f6nderi Detay\u0131',\n  meta: [\n    { name: 'description', content: post.value ? post.value.body.substring(0, 150) : 'G\u00f6nderi detaylar\u0131n\u0131 g\u00f6r\u00fcnt\u00fcle.' }\n  ]\n});\n<\/script>\n\n<template>\n  <div class=\"container\">\n    <NuxtLink to=\"\/\" class=\"back-link\">\u2190 T\u00fcm G\u00f6nderilere Geri D\u00f6n<\/NuxtLink>\n\n    <p v-if=\"pending\">G\u00f6nderi y\u00fckleniyor...<\/p>\n    <p v-else-if=\"error\" class=\"error-message\">Hata olu\u015ftu: {{ error.message }}<\/p>\n    <div v-else-if=\"post\" class=\"post-detail\">\n      \n      <p>{{ post.body }}<\/p>\n    <\/div>\n    <p v-else class=\"not-found\">G\u00f6nderi bulunamad\u0131.<\/p>\n  <\/div>\n<\/template>\n\n<style scoped>\n.container {\n  max-width: 800px;\n  margin: 0 auto;\n  padding: 20px;\n  font-family: Arial, sans-serif;\n}\n\n.back-link {\n  display: inline-block;\n  margin-bottom: 20px;\n  color: #007bff;\n  text-decoration: none;\n  font-weight: bold;\n}\n\n.back-link:hover {\n  text-decoration: underline;\n}\n\n.post-detail {\n  border: 1px solid #eee;\n  border-radius: 8px;\n  padding: 30px;\n  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n  background-color: #fff;\n}\n\n.post-detail h1 {\n  color: #333;\n  font-size: 2.2em;\n  margin-top: 0;\n  margin-bottom: 20px;\n}\n\n.post-detail p {\n  color: #555;\n  line-height: 1.8;\n  font-size: 1.1em;\n}\n\n.error-message, .not-found {\n  color: red;\n  text-align: center;\n  font-size: 1.2em;\n}\n<\/style><\/code><\/pre>\n<p>Bu kodda:<br \/>\n*   <code>useRoute()<\/code> ile mevcut rota parametrelerine (bu durumda <code>id<\/code>) eri\u015fiyoruz.<br \/>\n*   <code>useAsyncData<\/code> kullanarak bu <code>id<\/code> ile ilgili g\u00f6nderiyi API&#8217;den \u00e7ekiyoruz. \u00c7ekilen verinin benzersiz bir anahtar\u0131 olmas\u0131 \u00f6nemlidir (<code>post-${postId}<\/code>).<br \/>\n*   Yine <code>pending<\/code> ve <code>error<\/code> durumlar\u0131n\u0131 ele al\u0131yoruz.<br \/>\n*   <code>useHead<\/code> ile sayfan\u0131n ba\u015fl\u0131\u011f\u0131n\u0131 ve a\u00e7\u0131klamas\u0131n\u0131 \u00e7ekilen g\u00f6nderinin verilerine g\u00f6re dinamik olarak ayarl\u0131yoruz.<br \/>\n*   Ana sayfaya geri d\u00f6nmek i\u00e7in bir <code><NuxtLink><\/code> ekledik.<\/p>\n<p>Uygulaman\u0131z\u0131 <code>npm run dev<\/code> ile \u00e7al\u0131\u015ft\u0131r\u0131n ve taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost:3000<\/code> adresine gidin. G\u00f6nderi listesini g\u00f6rmelisiniz. Herhangi bir g\u00f6nderiye t\u0131klayarak detay sayfas\u0131na gidebilirsiniz. Taray\u0131c\u0131n\u0131z\u0131n geli\u015ftirici ara\u00e7lar\u0131n\u0131 (DevTools) a\u00e7\u0131p &#8220;Network&#8221; sekmesine bakarsan\u0131z, ilk sayfa y\u00fcklemesinde sunucudan tam HTML i\u00e7eri\u011finin geldi\u011fini g\u00f6receksiniz. Bu, SSR&#8217;nin \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131n bir g\u00f6stergesidir.<\/p>\n<h3>SEO Optimizasyonu ile Nuxt.js SSR<\/h3>\n<p>SSR&#8217;nin en b\u00fcy\u00fck avantajlar\u0131ndan biri, arama motoru optimizasyonu (SEO) \u00fczerindeki olumlu etkisidir. Nuxt.js, uygulaman\u0131z\u0131n SEO&#8217;sunu geli\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc ara\u00e7lar sunar.<\/p>\n<h4><code>useHead<\/code> Kompozisyonu<\/h4>\n<p><code>useHead<\/code> kompozisyonu, Nuxt 3&#8217;te sayfa ba\u015fl\u0131\u011f\u0131n\u0131, meta etiketleri, ba\u011flant\u0131lar\u0131 ve di\u011fer <code><head><\/code> etiketlerini dinamik olarak y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. Bu, her sayfan\u0131n arama motorlar\u0131 i\u00e7in optimize edilmi\u015f benzersiz meta verilere sahip olmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-vue\"><script setup>\nimport { useHead } from '#app';\n\nuseHead({\n  title: 'Benim Harika Sayfam',\n  meta: [\n    { name: 'description', content: 'Bu sayfa hakk\u0131nda harika bir a\u00e7\u0131klama.' },\n    { property: 'og:title', content: 'Sosyal Medya Ba\u015fl\u0131\u011f\u0131' },\n    { property: 'og:description', content: 'Sosyal medya i\u00e7in a\u00e7\u0131klama.' },\n    { property: 'og:image', content: 'https:\/\/example.com\/image.jpg' }\n  ],\n  link: [\n    { rel: 'canonical', href: 'https:\/\/example.com\/my-page' }\n  ]\n});\n<\/script><\/code><\/pre>\n<p>Bu, hem arama motorlar\u0131n\u0131n hem de sosyal medya platformlar\u0131n\u0131n (Open Graph etiketleri arac\u0131l\u0131\u011f\u0131yla) sayfan\u0131z\u0131n i\u00e7eri\u011fini do\u011fru bir \u015fekilde anlamas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h4>Yap\u0131land\u0131r\u0131lm\u0131\u015f Veri (Structured Data)<\/h4>\n<p>Yap\u0131land\u0131r\u0131lm\u0131\u015f veri (\u00f6rne\u011fin JSON-LD), arama motorlar\u0131n\u0131n i\u00e7eri\u011finizi daha iyi anlamas\u0131na ve zengin snippet&#8217;ler (rich snippets) g\u00f6stermesine yard\u0131mc\u0131 olur. <code>useHead<\/code> kullanarak <code><script type=\"application\/ld+json\"><\/code> etiketlerini kolayca ekleyebilirsiniz:<\/p>\n<pre><code class=\"language-vue\"><script setup>\nuseHead({\n  script: [\n    {\n      type: 'application\/ld+json',\n      children: JSON.stringify({\n        \"@context\": \"https:\/\/schema.org\",\n        \"@type\": \"Article\",\n        \"headline\": \"Nuxt.js ile SSR Ba\u015flang\u0131\u00e7\",\n        \"image\": [\n          \"https:\/\/example.com\/image1.jpg\",\n          \"https:\/\/example.com\/image2.jpg\"\n        ],\n        \"datePublished\": \"2023-10-27T09:00:00+08:00\",\n        \"author\": {\n          \"@type\": \"Person\",\n          \"name\": \"Yazar Ad\u0131\"\n        }\n      })\n    }\n  ]\n});\n<\/script><\/code><\/pre>\n<h4>Sitemap ve Robots.txt<\/h4>\n<p>Nuxt.js, sitemap ve robots.txt dosyalar\u0131n\u0131 y\u00f6netmek i\u00e7in topluluk taraf\u0131ndan geli\u015ftirilmi\u015f mod\u00fcllere sahiptir. \u00d6rne\u011fin, <code>@nuxtjs\/sitemap<\/code> mod\u00fcl\u00fc, sitenizin t\u00fcm rotalar\u0131n\u0131 otomatik olarak alg\u0131layarak bir sitemap olu\u015fturabilir. Bu dosyalar, arama motoru \u00f6r\u00fcmceklerinin sitenizi daha verimli bir \u015fekilde taramas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h3>Performans Optimizasyonu<\/h3>\n<p>SSR, alg\u0131lanan performans\u0131 art\u0131rsa da, Nuxt.js uygulamalar\u0131n\u0131z\u0131n genel performans\u0131n\u0131 daha da optimize etmek i\u00e7in baz\u0131 stratejiler uygulayabilirsiniz.<\/p>\n<p>*   <strong>Kod B\u00f6lme (Code Splitting):<\/strong> Nuxt.js, varsay\u0131lan olarak her sayfa i\u00e7in otomatik kod b\u00f6lme yapar. Bu, bir kullan\u0131c\u0131n\u0131n yaln\u0131zca ziyaret etti\u011fi sayfa i\u00e7in gerekli JavaScript'i indirmesini sa\u011flar.<br \/>\n*   <strong>Lazy Loading Bile\u015fenleri:<\/strong> B\u00fcy\u00fck veya nadiren kullan\u0131lan bile\u015fenleri yaln\u0131zca ihtiya\u00e7 duyuldu\u011funda y\u00fcklemek i\u00e7in <code>defineAsyncComponent<\/code> veya dinamik <code>import()<\/code> kullanabilirsiniz. Nuxt.js, <code>components<\/code> dizinindeki bile\u015fenleri otomatik olarak lazy-load eder.<br \/>\n*   <strong>G\u00f6rsel Optimizasyonu:<\/strong><br \/>\n    *   <strong>Resim Optimizasyonu:<\/strong> <code>nuxt-image<\/code> mod\u00fcl\u00fc gibi ara\u00e7lar, resimleri otomatik olarak optimize edebilir (boyutland\u0131rma, format d\u00f6n\u00fc\u015ft\u00fcrme, lazy loading).<br \/>\n    *   <strong>WebP\/AVIF Formatlar\u0131:<\/strong> Taray\u0131c\u0131 deste\u011fine g\u00f6re daha modern ve s\u0131k\u0131\u015ft\u0131r\u0131lm\u0131\u015f resim formatlar\u0131n\u0131 kullan\u0131n.<br \/>\n*   <strong>\u00d6nbellekleme (Caching):<\/strong><br \/>\n    *   <strong>Sunucu Taraf\u0131 \u00d6nbellekleme:<\/strong> Sunucunuzda (\u00f6rne\u011fin, Nginx, Varnish) tam olu\u015fturulmu\u015f HTML sayfalar\u0131n\u0131 \u00f6nbelle\u011fe almak, sunucunun her istekte sayfay\u0131 yeniden olu\u015fturma y\u00fck\u00fcn\u00fc azalt\u0131r.<br \/>\n    *   <strong>CDN (Content Delivery Network):<\/strong> CDN kullanarak statik varl\u0131klar\u0131 ve \u00f6nbelle\u011fe al\u0131nm\u0131\u015f HTML'i kullan\u0131c\u0131lara co\u011frafi olarak daha yak\u0131n sunarak y\u00fckleme s\u00fcrelerini k\u0131salt\u0131n.<br \/>\n*   <strong>Minifikasyon ve S\u0131k\u0131\u015ft\u0131rma:<\/strong> Nuxt.js, \u00fcretim derlemesi s\u0131ras\u0131nda JavaScript, CSS ve HTML dosyalar\u0131n\u0131 otomatik olarak k\u00fc\u00e7\u00fclt\u00fcr (minify) ve s\u0131k\u0131\u015ft\u0131r\u0131r (gzip\/brotli).<br \/>\n*   <strong>Kritik CSS:<\/strong> \u0130lk boyama i\u00e7in gerekli olan CSS'i HTML i\u00e7ine inline olarak eklemek, taray\u0131c\u0131n\u0131n stil y\u00fcklenmesini beklemeden i\u00e7eri\u011fi g\u00f6stermesini sa\u011flar. Nuxt.js, bunu otomatik olarak yapabilir veya <code>purgecss<\/code> gibi ara\u00e7larla entegre edilebilir.<\/p>\n<h3>Da\u011f\u0131t\u0131m (Deployment)<\/h3>\n<p>Nuxt.js uygulamalar\u0131n\u0131 da\u011f\u0131tmak i\u00e7in birka\u00e7 se\u00e7ene\u011finiz vard\u0131r:<\/p>\n<p>1.  <strong>Node.js Sunucusu (SSR):<\/strong><br \/>\n    *   Uygulaman\u0131z\u0131 derleyin: <code>npm run build<\/code><br \/>\n    *   Uygulaman\u0131z\u0131 ba\u015flat\u0131n: <code>npm run start<\/code><br \/>\n    *   Bu, <code>.output\/server\/index.mjs<\/code> dosyas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131ran bir Node.js sunucusu ba\u015flat\u0131r. Kendi sunucunuzda (\u00f6rne\u011fin, PM2 ile) \u00e7al\u0131\u015ft\u0131rabilirsiniz.<br \/>\n2.  <strong>Statik Hosting (SSG - Statik Site Olu\u015fturma):<\/strong><br \/>\n    *   <code>nuxt.config.ts<\/code> dosyas\u0131nda <code>ssr: false<\/code> olarak ayarlayarak veya <code>generate<\/code> komutunu kullanarak statik dosyalar olu\u015fturabilirsiniz.<br \/>\n    *   Uygulaman\u0131z\u0131 derleyin ve statik olarak d\u0131\u015fa aktar\u0131n: <code>npm run generate<\/code><br \/>\n    *   Bu, <code>output\/public<\/code> dizininde tamamen statik HTML, CSS ve JavaScript dosyalar\u0131 olu\u015fturur. Bu dosyalar\u0131 herhangi bir statik hosting hizmetine (Netlify, Vercel, GitHub Pages, Nginx) da\u011f\u0131tabilirsiniz.<br \/>\n3.  <strong>Vercel\/Netlify:<\/strong><br \/>\n    Nuxt.js, Vercel ve Netlify gibi platformlarla sorunsuz entegrasyon sa\u011flar. Bu platformlar, Nuxt.js projelerinizi otomatik olarak alg\u0131lar ve hem SSR hem de SSG modlar\u0131n\u0131 destekler. Genellikle sadece projenizi bu platformlara ba\u011flaman\u0131z yeterlidir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Nuxt.js, Vue.js geli\u015ftiricileri i\u00e7in sunucu tarafl\u0131 olu\u015fturma (SSR) ve statik site olu\u015fturma (SSG) gibi modern web geli\u015ftirme paradigmalar\u0131n\u0131 benimsemeyi son derece kolayla\u015ft\u0131ran g\u00fc\u00e7l\u00fc ve esnek bir \u00e7er\u00e7evedir. Bu makalede, SSR'nin temel avantajlar\u0131n\u0131 (SEO, performans, kullan\u0131c\u0131 deneyimi), Nuxt.js'in bu alandaki rol\u00fcn\u00fc, bir Nuxt.js projesini nas\u0131l kuraca\u011f\u0131n\u0131z\u0131 ve temel kavramlar\u0131 (veri \u00e7ekme, hidrasyon, y\u00f6nlendirme, d\u00fczenler) nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 detayl\u0131 bir \u015fekilde inceledik. Ayr\u0131ca, pratik bir \u00f6rnek \u00fczerinden veri \u00e7ekme i\u015flemini g\u00f6sterdik ve SEO ile performans optimizasyonu i\u00e7in \u00f6nemli ipu\u00e7lar\u0131 verdik.<\/p>\n<p>Nuxt.js ile SSR uygulamalar\u0131 geli\u015ftirmek, ilk y\u00fckleme h\u0131z\u0131n\u0131 art\u0131rarak ve arama motorlar\u0131 i\u00e7in daha iyi indekslenebilirlik sa\u011flayarak kullan\u0131c\u0131lar\u0131n\u0131z ve i\u015fletmeniz i\u00e7in \u00f6nemli faydalar sunar. Vue 3'\u00fcn Composition API'si ve Nuxt 3'\u00fcn modern ara\u00e7 zinciri (Vite, Nitro) sayesinde geli\u015ftirme s\u00fcreci her zamankinden daha verimli ve keyifli hale gelmi\u015ftir. Web geli\u015ftirme yolculu\u011funuzda Nuxt.js'i ke\u015ffetmek, modern ve performansl\u0131 web uygulamalar\u0131 olu\u015fturma yetene\u011finizi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Nuxt.js Kullanarak Sunucu Tarafl\u0131 Olu\u015fturmaya (SSR) Ba\u015flang\u0131\u00e7\nWeb geli\u015ftirme d\u00fcnyas\u0131, kullan\u0131c\u0131 deneyimini, arama motoru optimizasyonunu (S","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-39130","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Nuxt.js Kullanarak Sunucu Tarafl\u0131 Olu\u015fturmaya (SSR) Ba\u015flang\u0131\u00e7 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Nuxt.js Kullanarak Sunucu Tarafl\u0131 Olu\u015fturmaya (SSR) Ba\u015flang\u0131\u00e7\" \/>\n<meta property=\"og:description\" content=\"Nuxt.js Kullanarak Sunucu Tarafl\u0131 Olu\u015fturmaya (SSR) Ba\u015flang\u0131\u00e7 Web geli\u015ftirme d\u00fcnyas\u0131, kullan\u0131c\u0131 deneyimini, arama motoru optimizasyonunu (S\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-15T00:40:53+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Nuxt.js Kullanarak Sunucu Tarafl\u0131 Olu\u015fturmaya (SSR) Ba\u015flang\u0131\u00e7\",\"datePublished\":\"2026-02-15T00:40:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/\"},\"wordCount\":3976,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/\",\"name\":\"Nuxt.js Kullanarak Sunucu Tarafl\u0131 Olu\u015fturmaya (SSR) Ba\u015flang\u0131\u00e7 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-15T00:40:53+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Nuxt.js Kullanarak Sunucu Tarafl\u0131 Olu\u015fturmaya (SSR) Ba\u015flang\u0131\u00e7\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Nuxt.js Kullanarak Sunucu Tarafl\u0131 Olu\u015fturmaya (SSR) Ba\u015flang\u0131\u00e7 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/","og_locale":"tr_TR","og_type":"article","og_title":"Nuxt.js Kullanarak Sunucu Tarafl\u0131 Olu\u015fturmaya (SSR) Ba\u015flang\u0131\u00e7","og_description":"Nuxt.js Kullanarak Sunucu Tarafl\u0131 Olu\u015fturmaya (SSR) Ba\u015flang\u0131\u00e7 Web geli\u015ftirme d\u00fcnyas\u0131, kullan\u0131c\u0131 deneyimini, arama motoru optimizasyonunu (S","og_url":"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-15T00:40:53+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"22 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Nuxt.js Kullanarak Sunucu Tarafl\u0131 Olu\u015fturmaya (SSR) Ba\u015flang\u0131\u00e7","datePublished":"2026-02-15T00:40:53+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/"},"wordCount":3976,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/","url":"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/","name":"Nuxt.js Kullanarak Sunucu Tarafl\u0131 Olu\u015fturmaya (SSR) Ba\u015flang\u0131\u00e7 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-15T00:40:53+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/nuxt-js-kullanarak-sunucu-tarafli-olusturmaya-ssr-baslangic\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Nuxt.js Kullanarak Sunucu Tarafl\u0131 Olu\u015fturmaya (SSR) Ba\u015flang\u0131\u00e7"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39130","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=39130"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39130\/revisions"}],"predecessor-version":[{"id":39131,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39130\/revisions\/39131"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=39130"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=39130"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=39130"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}