﻿
{"id":12174,"date":"2019-10-20T22:56:58","date_gmt":"2019-10-20T22:56:58","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=12174"},"modified":"2019-10-20T22:59:22","modified_gmt":"2019-10-20T22:59:22","slug":"angular-8de-angular-universal-ile-server-side-rendering-ssr","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/angular-8de-angular-universal-ile-server-side-rendering-ssr\/","title":{"rendered":"Angular 8&#8217;de Angular Universal \u0130le Server-Side Rendering (SSR)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Angular, mimarisel olarak kullan\u0131c\u0131dan al\u0131nan istek neticesinde \u00fcretilen componenti taray\u0131c\u0131ya g\u00f6ndermekte ve yap\u0131sal olarak client tabanl\u0131 bir de\u011fi\u015fiklikle sayfan\u0131n tekrar render\u0131na ihtiya\u00e7 duymaks\u0131z\u0131n ekrana basmaktad\u0131r. B\u00f6ylece taray\u0131c\u0131 \u00fczerinde elde edilen \u00e7\u0131kt\u0131n\u0131n SEO(Search Engine Optimization &#8211; Arama Motoru Optimizasyonu) a\u00e7\u0131s\u0131ndan \u00f6nem te\u015fkil eden kaynak kodlar\u0131n\u0131n ilk render edildi\u011fi gibi kalmas\u0131 neticesinde sayfa ge\u00e7i\u015flerindeki bu staticlik bizleri olumsuz etkilemektedir. \u0130\u015fte Angular mimarisindeki bu handikap\u0131 Angular uygulamas\u0131n\u0131 sunucu taraf\u0131nda i\u015flememizi sa\u011flayan Angular Universal ile ger\u00e7ekle\u015ftirdi\u011fimiz Server-Side Rendering(SSR) ile a\u015fabilmekteyiz.<\/p>\n<h3>Angular Universal Nedir?<\/h3>\n<p>Angular uygulamalar\u0131n\u0131n sunucu taraf\u0131nda handle edilmesidir. Dolay\u0131s\u0131yla sunucuda ele al\u0131nan component i\u00e7erisinde varsa API taleplerini beklemekte, gelen verileri uygun yerlere yerle\u015ftirmekte ve nihayetinde t\u00fcm sayfay\u0131 tam teferruatl\u0131 olu\u015fturduktan sonra taray\u0131c\u0131ya g\u00f6ndermektedir. <\/p>\n<h3>\u00d6n Haz\u0131rl\u0131k<\/h3>\n<p>Makalede \u00f6rneklendirmede kullanabilmek i\u00e7in &#8220;home&#8221;, &#8220;about&#8221; ve &#8220;contact&#8221; olmak \u00fczere \u00fc\u00e7 adet component olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nng g c components\/home --spec false\r\nng g c components\/about --spec false\r\nng g c components\/contact --spec false\r\n<\/pre>\n<p>Olu\u015fturdu\u011fumuz bu componentlerin html dosyalar\u0131n\u0131n i\u00e7ini a\u015fa\u011f\u0131daki gibi doldural\u0131m.<br \/>\nhome.component.html;<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;h1&gt;Anasayfa&lt;\/h1&gt;\r\n&lt;p&gt;Ho\u015fgeldiniz...&lt;\/p&gt;\r\n<\/pre>\n<p>about.component.html;<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;h1&gt;Biz Kimiz?&lt;\/h1&gt;\r\n&lt;p&gt;\r\n   Beynimiz yorulmadan geceleri uyuyamayanlardan\u0131z...\r\n&lt;\/p&gt;\r\n<\/pre>\n<p>contact.component.html;<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;h1&gt;\u0130leti\u015fim&lt;\/h1&gt;\r\n&lt;p&gt;Bize ula\u015fmak i\u00e7in T\u00fcrk\u00e7e kullan\u0131n\u0131z...&lt;\/p&gt;\r\n&lt;form&gt;\r\n   &lt;table&gt;\r\n      &lt;tbody&gt;\r\n         &lt;tr&gt;\r\n            &lt;td&gt;Ad\u0131n\u0131z&lt;\/td&gt;\r\n            &lt;td&gt;:&lt;\/td&gt;\r\n            &lt;td&gt;&lt;input type=&quot;text&quot;&gt;&lt;\/td&gt;\r\n         &lt;\/tr&gt;\r\n         &lt;tr&gt;\r\n            &lt;td&gt;Soyad\u0131n\u0131z&lt;\/td&gt;\r\n            &lt;td&gt;:&lt;\/td&gt;\r\n            &lt;td&gt;&lt;input type=&quot;text&quot;&gt;&lt;\/td&gt;\r\n         &lt;\/tr&gt;\r\n         &lt;tr&gt;\r\n            &lt;td&gt;Mesaj\u0131n\u0131z&lt;\/td&gt;\r\n            &lt;td&gt;:&lt;\/td&gt;\r\n            &lt;td&gt;&lt;textarea&gt;&lt;\/textarea&gt;&lt;\/td&gt;\r\n         &lt;\/tr&gt;\r\n         &lt;tr&gt;\r\n            &lt;td colspan=&quot;3&quot;&gt;&lt;button&gt;G\u00f6nder&lt;\/button&gt;&lt;\/td&gt;\r\n         &lt;\/tr&gt;\r\n      &lt;\/tbody&gt;\r\n   &lt;\/table&gt;\r\n&lt;\/form&gt;\r\n<\/pre>\n<p>Ard\u0131ndan bu componentlerin route haritalar\u0131n\u0131 olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { NgModule } from '@angular\/core';\r\nimport { Routes, RouterModule } from '@angular\/router';\r\nimport { HomeComponent } from '.\/components\/home\/home.component';\r\nimport { AboutComponent } from '.\/components\/about\/about.component';\r\nimport { ContactComponent } from '.\/components\/contact\/contact.component';\r\n\r\nconst routes: Routes = &#x5B;\r\n  { path: &quot;&quot;, redirectTo: &quot;\/home&quot;, pathMatch: &quot;full&quot; },\r\n  { path: &quot;home&quot;, component: HomeComponent },\r\n  { path: &quot;about&quot;, component: AboutComponent },\r\n  { path: &quot;contact&quot;, component: ContactComponent }\r\n];\r\n\r\n@NgModule({\r\n  imports: &#x5B;RouterModule.forRoot(routes)],\r\n  exports: &#x5B;RouterModule]\r\n})\r\nexport class AppRoutingModule { }\r\n<\/pre>\n<p>Ve son olarak ana componentte bu componentlerin y\u00f6nlendirme linklerini olu\u015ftural\u0131m.<br \/>\napp.component.html;<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;a routerLink=&quot;home&quot;&gt;Home&lt;\/a&gt; | &lt;a routerLink=&quot;about&quot;&gt;About&lt;\/a&gt; | &lt;a routerLink=&quot;contact&quot;&gt;Contact&lt;\/a&gt; &lt;br&gt;\r\n&lt;router-outlet&gt;&lt;\/router-outlet&gt;\r\n<\/pre>\n<p>\u015eimdi uygulamay\u0131 derleyip yay\u0131na alal\u0131m ve componentlere yap\u0131lan istekler neticesinde kaynak kodunu inceleyelim.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/Angular-8de-Angular-Universal-\u0130le-Server-Side-Rendering-SSR.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/Angular-8de-Angular-Universal-\u0130le-Server-Side-Rendering-SSR.gif\" alt=\"Angular 8&#039;de Angular Universal \u0130le Server-Side Rendering (SSR)\" width=\"768\" height=\"396\" class=\"aligncenter size-full wp-image-12192\" \/><\/a><\/p>\n<p>Evet&#8230; G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere Angular uygulamam\u0131zda componentlere yap\u0131lan istekler neticesinde \u00fcretilen component taray\u0131c\u0131ya g\u00f6nderilmekte lakin kaynak kodu de\u011fi\u015ftirmemektedir. Haliyle bu durum makalemizin ba\u015f\u0131nda da ifade etti\u011fimiz gibi SEO a\u00e7\u0131s\u0131ndan ciddi manada kayba sebebiyet verecektir. Hal b\u00f6yleyken gelin Angular Universal \u0130le Server-Side Rendering&#8217;in (SSR) uygulamaya nas\u0131l kurulaca\u011f\u0131n\u0131 ve gerekli konf\u00fcg\u00fcrasyonlar\u0131n ne \u015fekilde yap\u0131laca\u011f\u0131n\u0131 inceleyelim.<\/p>\n<h3>Uygulamaya Angular Universal&#8217;in Kurulmas\u0131<\/h3>\n<p>Angular Universal&#8217;i kurabilmek i\u00e7in uygulama dizininde a\u015fa\u011f\u0131daki konsept prototipini \u00e7al\u0131\u015ft\u0131r\u0131yoruz.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nng add @nguniversal\/express-engine --clientProject projectName\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funda bulunan konsepte g\u00f6z atarsan\u0131z e\u011fer &#8220;projectName&#8221; k\u0131sm\u0131na uygulaman\u0131n birebir ayn\u0131 ismi verilmesi gerekmektedir. E\u011fer proje ad\u0131n\u0131z\u0131 bilmiyorsan\u0131z, bunun i\u00e7in &#8220;package.json&#8221; dosyas\u0131nda tan\u0131mlanm\u0131\u015f &#8220;name&#8221; de\u011ferini baz alabilirsiniz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/Angular-8de-Angular-Universal-\u0130le-Server-Side-Rendering-SSR.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/Angular-8de-Angular-Universal-\u0130le-Server-Side-Rendering-SSR.jpg\" alt=\"Angular 8&#039;de Angular Universal \u0130le Server-Side Rendering (SSR)\" width=\"987\" height=\"702\" class=\"aligncenter size-full wp-image-12197\" \/><\/a><br \/>\n\u0130lgili kod konseptini \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra yukar\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde de vurguland\u0131\u011f\u0131 gibi uygulamada &#8220;src\/main.server.ts&#8221;, &#8220;src\/app\/app.server.module.ts&#8221;, &#8220;tsconfig.server.json&#8221;, &#8220;webpack.server.config.js&#8221; ve &#8220;server.ts&#8221; dosyalar\u0131 olu\u015fturulmu\u015ftur. \u015eimdi &#8220;app.module.ts&#8221; dosyas\u0131na g\u00f6z atal\u0131m;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/Angular-8de-Angular-Universal-\u0130le-Server-Side-Rendering-SSR-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/Angular-8de-Angular-Universal-\u0130le-Server-Side-Rendering-SSR-1.jpg\" alt=\"Angular 8&#039;de Angular Universal \u0130le Server-Side Rendering (SSR)\" width=\"582\" height=\"429\" class=\"aligncenter size-full wp-image-12207\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/Angular-8de-Angular-Universal-\u0130le-Server-Side-Rendering-SSR-1.jpg 582w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/Angular-8de-Angular-Universal-\u0130le-Server-Side-Rendering-SSR-1-300x221.jpg 300w\" sizes=\"auto, (max-width: 582px) 100vw, 582px\" \/><\/a><br \/>\n\u0130lgili dosya i\u00e7erisinde import edilmi\u015f olan &#8220;BrowserModule&#8221; isimli mod\u00fcl uygulaman\u0131n server \u00fczerinden render edilmesini sa\u011flamaktad\u0131r. Burada dikkat edilmesi gereken husus &#8220;BrowserModule.withServerTransition({ appId: &#8216;Example&#8217; })&#8221; komutundaki &#8220;appId&#8221; de\u011ferinin projenizin ismiyle(<span style=\"font-size:10px;\">package.json : name<\/span>) ayn\u0131 olmas\u0131 gerekmektedir.<\/p>\n<p>Bu i\u015flemden sonra a\u015fa\u011f\u0131daki kod konseptiyle uygulamay\u0131 derleyip, aya\u011fa kald\u0131ral\u0131m.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nnpm run build:ssr &amp;&amp; npm run serve:ssr\r\n<\/pre>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/Angular-8de-Angular-Universal-\u0130le-Server-Side-Rendering-SSR-2.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/Angular-8de-Angular-Universal-\u0130le-Server-Side-Rendering-SSR-2.jpg\" alt=\"Angular 8&#039;de Angular Universal \u0130le Server-Side Rendering (SSR)\" width=\"546\" height=\"836\" class=\"aligncenter size-full wp-image-12212\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/Angular-8de-Angular-Universal-\u0130le-Server-Side-Rendering-SSR-2.jpg 546w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/Angular-8de-Angular-Universal-\u0130le-Server-Side-Rendering-SSR-2-196x300.jpg 196w\" sizes=\"auto, (max-width: 546px) 100vw, 546px\" \/><\/a><br \/>\nDerleme neticesinde bizlere verilmi\u015f olan adresi(<span style=\"font-size:10px;\">&#8220;http:\/\/localhost:4000&#8221;<\/span>) taray\u0131c\u0131 \u00fczerinden a\u00e7arak componentlere yap\u0131lan istek neticelerinin kaynak kodlar\u0131n\u0131 inceleyelim;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/Angular-8de-Angular-Universal-\u0130le-Server-Side-Rendering-SSR-1.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/Angular-8de-Angular-Universal-\u0130le-Server-Side-Rendering-SSR-1.gif\" alt=\"Angular 8&#039;de Angular Universal \u0130le Server-Side Rendering (SSR)\" width=\"800\" height=\"447\" class=\"aligncenter size-full wp-image-12216\" \/><\/a><br \/>\nG\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere componentlere yap\u0131lan istekler Angular Universal arac\u0131l\u0131\u011f\u0131yla Server Side Rendering (SS) edilmekte ve taray\u0131c\u0131ya g\u00f6nderilmektedir.<\/p>\n<h3>Sunucu Taraf\u0131nda \u00c7al\u0131\u015fmas\u0131n\u0131 \u0130stemedi\u011fimiz Komutlar\u0131 Taray\u0131c\u0131da \u00c7al\u0131\u015ft\u0131rmak<\/h3>\n<p>Server Side Rendering (SSR) yap\u0131lm\u0131\u015f bir uygulama yap\u0131sal olarak sunucu taraf\u0131nda i\u015flenmekte ve neticede olu\u015fturulan \u00e7\u0131kt\u0131 taray\u0131c\u0131ya g\u00f6nderilmektedir. Lakin; &#8220;setTimeout&#8221; ve &#8220;setInterval&#8221; gibi baz\u0131 yap\u0131lar yahut &#8220;localStorage&#8221; veya &#8220;sessionStorage&#8221; gibi depolara eri\u015fim sa\u011flayan \u00f6zellikler taray\u0131c\u0131ya ba\u011fl\u0131 olarak \u00e7al\u0131\u015fmakta ve taray\u0131c\u0131lar \u00fczerinde i\u015flenmektedirler.<\/p>\n<p>Dolay\u0131s\u0131yla bu yap\u0131lardan herhangi biri uygulamada kullan\u0131l\u0131yorsa SSR sunucu taraf\u0131ndan eri\u015femeyecek ve hata f\u0131rlatacakt\u0131r.<\/p>\n<p>\u00d6rne\u011fin Angular Universal ile aya\u011fa kald\u0131r\u0131lan bir uygulaman\u0131n herhangi bir noktas\u0131nda &#8220;localStorage&#8221; ile i\u015flem yapt\u0131\u011f\u0131m\u0131z\u0131 d\u00fc\u015f\u00fcn\u00fcrsek ilgili alana istek geldi\u011fi taktirde yukar\u0131daki bahsetti\u011fimiz duruma istinaden sunucu taraf\u0131ndan ilgili \u00f6zelli\u011fe eri\u015filemeyecek ve &#8220;<em>localStorage is not defined<\/em>&#8221; hatas\u0131 verilecektir. Tabi bu hata Angular Universal&#8217;i kullanmad\u0131\u011f\u0131m\u0131z durumlar i\u00e7in ge\u00e7erli olmayacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { Component, OnInit } from '@angular\/core';\r\n\r\n@Component({\r\n  selector: 'app-home',\r\n  templateUrl: '.\/home.component.html',\r\n  styleUrls: &#x5B;'.\/home.component.css']\r\n})\r\nexport class HomeComponent implements OnInit {\r\n  constructor() { }\r\n  ngOnInit() {\r\n    if (localStorage.getItem(&quot;a&quot;)) {\r\n      alert(localStorage.getItem(&quot;a&quot;))\r\n    }\r\n  }\r\n}\r\n<\/pre>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/Angular-8de-Angular-Universal-\u0130le-Server-Side-Rendering-SSR-3.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/Angular-8de-Angular-Universal-\u0130le-Server-Side-Rendering-SSR-3.jpg\" alt=\"Angular 8&#039;de Angular Universal \u0130le Server-Side Rendering (SSR)\" width=\"646\" height=\"173\" class=\"aligncenter size-full wp-image-12222\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/Angular-8de-Angular-Universal-\u0130le-Server-Side-Rendering-SSR-3.jpg 646w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/10\/Angular-8de-Angular-Universal-\u0130le-Server-Side-Rendering-SSR-3-300x80.jpg 300w\" sizes=\"auto, (max-width: 646px) 100vw, 646px\" \/><\/a><\/p>\n<p>Dolay\u0131s\u0131yla b\u00f6yle bir durumda, sunucuda \u00e7al\u0131\u015fmayacak olan kodlar\u0131 sade ve sadece taray\u0131c\u0131da \u00e7al\u0131\u015ft\u0131rmas\u0131 gerekti\u011fine dair mimariye bildirecek bir kontrol olu\u015fturmam\u0131z yeterli olacakt\u0131r. Bunun i\u00e7in &#8220;PLATFORM_ID&#8221; de\u011ferini ilgili componentin constructer\u0131nda inject etmemiz ve a\u015fa\u011f\u0131daki gibi kullanmam\u0131z gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { Component, OnInit, Inject, PLATFORM_ID } from '@angular\/core';\r\nimport { isPlatformBrowser } from '@angular\/common';\r\n\r\n@Component({\r\n  selector: 'app-home',\r\n  templateUrl: '.\/home.component.html',\r\n  styleUrls: &#x5B;'.\/home.component.css']\r\n})\r\nexport class HomeComponent implements OnInit {\r\n  constructor(@Inject(PLATFORM_ID) private platformId: Object) { }\r\n  ngOnInit() {\r\n    if (isPlatformBrowser(this.platformId)) {\r\n      if (localStorage.getItem(&quot;a&quot;)) {\r\n        alert(localStorage.getItem(&quot;a&quot;))\r\n      }\r\n    }\r\n  }\r\n}\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer &#8220;@angular\/common&#8221; dizininde bulunan &#8220;isPlatformBrowser&#8221; mod\u00fcl\u00fc ile sadece taray\u0131c\u0131da \u00e7al\u0131\u015fmas\u0131n\u0131 istedi\u011fimiz kodlar\u0131 belirleyebilmekteyiz ve bunu ger\u00e7ekle\u015ftirirken inject neticesinde elde etti\u011fimiz PLATFORM_ID de\u011ferini kullanmaktay\u0131z. Velhas\u0131l b\u00f6ylece ilgili hatay\u0131 d\u00fczeltmi\u015f bulunmaktay\u0131z.<\/p>\n<p>Ayriyetten &#8220;isPlatformBrowser&#8221; mod\u00fcl\u00fcndeki i\u015fleve benzer olarak sadece sunucuda \u00e7al\u0131\u015fmas\u0131n\u0131 istedi\u011fimiz kodlar\u0131da kontroll\u00fc bir \u015fekilde irademizle belirtebilmek i\u00e7in &#8220;isPlatformServer&#8221; mod\u00fcl\u00fcn\u00fc kullanabiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport { Component, OnInit, Inject, PLATFORM_ID } from '@angular\/core';\r\nimport { isPlatformBrowser, isPlatformServer } from &quot;@angular\/common&quot;;\r\n@Component({\r\n  selector: 'app-contact',\r\n  templateUrl: '.\/contact.component.html',\r\n  styleUrls: &#x5B;'.\/contact.component.css']\r\n})\r\nexport class ContactComponent implements OnInit {\r\n\r\n  constructor(@Inject(PLATFORM_ID) private platformId: Object) { }\r\n  ngOnInit() {\r\n    if (isPlatformBrowser(this.platformId)) {\r\n      \/\/Taray\u0131c\u0131da \u00e7al\u0131\u015facak kodlar...\r\n    }\r\n    if (isPlatformServer(this.platformId)) {\r\n      \/\/Sunucuda \u00e7al\u0131\u015facak kodlar...\r\n    }\r\n  }\r\n}\r\n<\/pre>\n<p>B\u00f6ylece sunucuda ve taray\u0131c\u0131da \u00e7al\u0131\u015facak kodlar\u0131n net ayr\u0131m\u0131n\u0131 hem yaz\u0131l\u0131msal hemde g\u00f6rsel olarak ger\u00e7ekle\u015ftirmi\u015f olmaktay\u0131z.<\/p>\n<p>Ve b\u00f6ylece geli\u015ftirilen t\u00fcm Angular uygulamalar\u0131n\u0131n i\u00e7erikleri arama motorlar\u0131 taraf\u0131ndan rahat\u00e7a okunabilecek ve hedef kullan\u0131c\u0131 kitlesine daha rahat eri\u015febilmesini sa\u011flam\u0131\u015f olacakt\u0131r.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Angular, mimarisel olarak kullan\u0131c\u0131dan al\u0131nan istek neticesinde \u00fcretilen componenti taray\u0131c\u0131ya g\u00f6ndermekte ve yap\u0131sal olarak client tabanl\u0131 bir de\u011fi\u015fiklikle sayfan\u0131n tekrar render\u0131na ihtiya\u00e7 duymaks\u0131z\u0131n ekrana basmaktad\u0131r. B\u00f6ylece taray\u0131c\u0131 \u00fczerinde elde edilen \u00e7\u0131kt\u0131n\u0131n SEO(Search Engine&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":12154,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3018],"tags":[2156,3025,3022,3026,3027,3028,3023,3024],"class_list":["post-12174","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-angular-8","tag-angular","tag-angular-html","tag-angular-universal","tag-angular-universal-nedir","tag-isplatformbrowser","tag-isplatformserver","tag-server-side-rendering","tag-ssr"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/12174","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=12174"}],"version-history":[{"count":52,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/12174\/revisions"}],"predecessor-version":[{"id":12234,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/12174\/revisions\/12234"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/12154"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=12174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=12174"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=12174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}