{"id":32898,"date":"2025-10-27T05:41:00","date_gmt":"2025-10-27T02:41:00","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=32898"},"modified":"2025-10-27T05:41:00","modified_gmt":"2025-10-27T02:41:00","slug":"gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/","title":{"rendered":"Gridsome ile Blog Olu\u015fturma: T\u00fcm Yaz\u0131lar\u0131 Listeleme ve Sayfalama"},"content":{"rendered":"<p><body><\/p>\n<h2>Gridsome ile Blog Olu\u015fturma: T\u00fcm Yaz\u0131lar\u0131 Listeleme ve Sayfalama<\/h2>\n<p>Gridsome, modern web geli\u015ftirmenin en pop\u00fcler yakla\u015f\u0131mlar\u0131ndan biri olan statik site olu\u015fturucular (Static Site Generators &#8211; SSG) kategorisinde yer alan, Vue.js tabanl\u0131 g\u00fc\u00e7l\u00fc bir frameworkt\u00fcr. Geleneksel i\u00e7erik y\u00f6netim sistemlerinin (CMS) aksine, Gridsome gibi SSG&#8217;ler, web sitelerini \u00f6nceden olu\u015fturulmu\u015f HTML, CSS ve JavaScript dosyalar\u0131 olarak sunar. Bu yakla\u015f\u0131m, sitelerin inan\u0131lmaz derecede h\u0131zl\u0131 y\u00fcklenmesini sa\u011flar, g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 minimize eder ve sunucu maliyetlerini d\u00fc\u015f\u00fcr\u00fcr. \u00d6zellikle bloglar, dok\u00fcmantasyon siteleri ve pazarlama sayfalar\u0131 gibi i\u00e7erik odakl\u0131 projeler i\u00e7in Gridsome, geli\u015ftiricilere m\u00fckemmel bir deneyim sunar. Bu makalede, Gridsome kullanarak bir blog nas\u0131l olu\u015fturulur, t\u00fcm yaz\u0131lar nas\u0131l listelenir ve en \u00f6nemlisi, sayfalama (pagination) \u00f6zelli\u011fi nas\u0131l entegre edilir, ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<h3>Gridsome ve Statik Site Olu\u015fturucular\u0131n Y\u00fckseli\u015fi<\/h3>\n<p>Son y\u0131llarda web geli\u015ftirme d\u00fcnyas\u0131nda statik site olu\u015fturucular\u0131n pop\u00fclaritesi \u00f6nemli \u00f6l\u00e7\u00fcde artt\u0131. Geleneksel CMS&#8217;ler (WordPress, Drupal vb.) dinamik olarak i\u00e7erik \u00fcretirken, her istekte veritaban\u0131 sorgular\u0131 ve sunucu tarafl\u0131 i\u015flemler gerektirir. Bu durum, \u00f6zellikle y\u00fcksek trafikli sitelerde performans sorunlar\u0131na yol a\u00e7abilir ve sunucu kaynaklar\u0131n\u0131 t\u00fcketebilir. SSG&#8217;ler ise, geli\u015ftirme a\u015famas\u0131nda t\u00fcm i\u00e7eri\u011fi statik dosyalara d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Ortaya \u00e7\u0131kan bu statik dosyalar, bir CDN (Content Delivery Network) \u00fczerinden h\u0131zla da\u011f\u0131t\u0131labilir, bu da kullan\u0131c\u0131lara neredeyse an\u0131nda y\u00fcklenen sayfalar sunar.<\/p>\n<p>Gridsome, bu avantajlar\u0131 Vue.js ekosistemiyle birle\u015ftirerek geli\u015ftiricilere tan\u0131d\u0131k ve verimli bir ortam sunar. GraphQL katman\u0131 sayesinde farkl\u0131 veri kaynaklar\u0131ndan (Markdown dosyalar\u0131, CMS API&#8217;leri, veritabanlar\u0131 vb.) veri \u00e7ekmek son derece kolayla\u015f\u0131r. Bu makalede, blog yaz\u0131lar\u0131n\u0131 Markdown dosyalar\u0131 olarak saklayacak ve Gridsome&#8217;un GraphQL API&#8217;si ile bu verilere eri\u015fece\u011fiz.<\/p>\n<h3>Gridsome Projesini Kurulumu<\/h3>\n<p>Bir Gridsome projesi ba\u015flatmak i\u00e7in \u00f6ncelikle sisteminizde Node.js ve npm (veya yarn) kurulu olmas\u0131 gerekmektedir. E\u011fer kurulu de\u011fillerse, resmi Node.js web sitesinden indirebilirsiniz.<\/p>\n<h4>\u00d6nko\u015fullar ve Proje Olu\u015fturma<\/h4>\n<p>Terminalinizi a\u00e7\u0131n ve Gridsome CLI&#8217;yi global olarak kurun:<\/p>\n<pre><code class=\"language-bash\">npm install --global @gridsome\/cli\n<h2>veya<\/h2>\nyarn global add @gridsome\/cli<\/code><\/pre>\n<p>CLI kurulduktan sonra, yeni bir Gridsome projesi olu\u015fturabiliriz:<\/p>\n<pre><code class=\"language-bash\">gridsome create my-blog\ncd my-blog<\/code><\/pre>\n<p>Bu komut, <code>my-blog<\/code> ad\u0131nda yeni bir dizin olu\u015fturacak ve Gridsome&#8217;un varsay\u0131lan ba\u015flang\u0131\u00e7 \u015fablonunu kuracakt\u0131r. Proje dizinine girdikten sonra, geli\u015ftirme sunucusunu ba\u015flatabiliriz:<\/p>\n<pre><code class=\"language-bash\">gridsome develop<\/code><\/pre>\n<p>Bu komut, <code>http:\/\/localhost:8080<\/code> adresinde \u00e7al\u0131\u015fan bir geli\u015ftirme sunucusu ba\u015flatacakt\u0131r. Ayr\u0131ca, Gridsome&#8217;un GraphQL veri katman\u0131n\u0131 ke\u015ffetmenizi sa\u011flayan bir GraphQL Playground&#8217;a <code>http:\/\/localhost:8080\/___explore<\/code> adresinden eri\u015febilirsiniz. Bu ara\u00e7, veri sorgulama i\u015flemlerini test etmek i\u00e7in son derece kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h4>Proje Yap\u0131s\u0131<\/h4>\n<p>Yeni olu\u015fturulan Gridsome projesinin temel dizin yap\u0131s\u0131 \u015f\u00f6yledir:<\/p>\n<p>*   <code>src\/<\/code>: T\u00fcm Vue bile\u015fenleri, sayfalar\u0131 ve \u015fablonlar\u0131 burada bulunur.<br \/>\n    *   <code>src\/pages\/<\/code>: Gridsome, bu dizindeki her <code>.vue<\/code> dosyas\u0131n\u0131 otomatik olarak bir sayfaya d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. \u00d6rne\u011fin, <code>src\/pages\/Index.vue<\/code> ana sayfa, <code>src\/pages\/About.vue<\/code> ise <code>\/about<\/code> yolunda eri\u015filebilir bir sayfa olu\u015fturur.<br \/>\n    *   <code>src\/components\/<\/code>: Yeniden kullan\u0131labilir Vue bile\u015fenleri burada saklan\u0131r.<br \/>\n    *   <code>src\/layouts\/<\/code>: Sayfalar i\u00e7in ortak d\u00fczenler (header, footer vb.) burada tan\u0131mlan\u0131r.<br \/>\n    *   <code>src\/templates\/<\/code>: Dinamik olarak olu\u015fturulan sayfalar (\u00f6rne\u011fin, her blog yaz\u0131s\u0131 i\u00e7in ayr\u0131 bir sayfa) i\u00e7in \u015fablonlar burada bulunur.<br \/>\n*   <code>static\/<\/code>: Do\u011frudan web sunucusuna kopyalanacak statik dosyalar (resimler, fontlar vb.) burada saklan\u0131r.<br \/>\n*   <code>gridsome.config.js<\/code>: Gridsome projesinin ana yap\u0131land\u0131rma dosyas\u0131d\u0131r. Eklentiler, veri kaynaklar\u0131 ve genel site ayarlar\u0131 burada tan\u0131mlan\u0131r.<br \/>\n*   <code>gridsome.server.js<\/code>: Gridsome&#8217;un Node.js API&#8217;sini kullanarak daha geli\u015fmi\u015f sunucu taraf\u0131 i\u015flemler (dinamik sayfa olu\u015fturma gibi) i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h3>Veri Kayna\u011f\u0131: Markdown Yaz\u0131lar<\/h3>\n<p>Blog yaz\u0131lar\u0131n\u0131 y\u00f6netmenin en basit yollar\u0131ndan biri, her yaz\u0131y\u0131 ayr\u0131 bir Markdown dosyas\u0131 olarak saklamakt\u0131r. Gridsome, bu Markdown dosyalar\u0131n\u0131 kolayca ayr\u0131\u015ft\u0131rabilir ve GraphQL katman\u0131na entegre edebilir.<\/p>\n<h4>Markdown Dosyalar\u0131n\u0131 Olu\u015fturma<\/h4>\n<p>\u00d6ncelikle, blog yaz\u0131lar\u0131n\u0131 saklamak i\u00e7in bir dizin olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">mkdir -p src\/content\/blog<\/code><\/pre>\n<p>\u015eimdi bu dizine birka\u00e7 \u00f6rnek Markdown dosyas\u0131 ekleyelim. Her dosya, yaz\u0131n\u0131n ba\u015fl\u0131\u011f\u0131n\u0131, tarihini, yazar\u0131n\u0131 ve di\u011fer meta verilerini i\u00e7eren bir &#8220;front-matter&#8221; b\u00f6l\u00fcm\u00fc ile ba\u015flamal\u0131d\u0131r. Front-matter, YAML format\u0131nda yaz\u0131l\u0131r.<\/p>\n<p><strong><code>src\/content\/blog\/ilk-yazi.md<\/code>:<\/strong><\/p>\n<pre><code class=\"language-markdown\">---\ntitle: \u0130lk Blog Yaz\u0131m\ndate: 2023-01-15\nauthor: Ahmet Y\u0131lmaz\nexcerpt: Bu, Gridsome ile olu\u015fturdu\u011fum ilk blog yaz\u0131m\u0131n k\u0131sa bir \u00f6zeti.\ncover_image: \/uploads\/ilk-yazi-kapak.jpg\n---\n\nMerhaba d\u00fcnya! Bu benim Gridsome ile olu\u015fturdu\u011fum ilk blog yaz\u0131m. Gridsome'un statik site olu\u015fturma yetenekleri sayesinde performans ve geli\u015ftirme h\u0131z\u0131 konusunda harika bir deneyim ya\u015f\u0131yorum.\n\nBu yaz\u0131da, Gridsome'un temel kurulumunu ve Markdown ile i\u00e7erik y\u00f6netimini ele ald\u0131k. Yakla\u015fan yaz\u0131larda daha derin konulara dalaca\u011f\u0131z.\n\n<strong>Kod \u00d6rne\u011fi:<\/strong><\/code><\/pre>\n<p>javascript<br \/>\n\/\/ \u00d6rnek JavaScript kodu<br \/>\nconsole.log(&#8216;Gridsome harika!&#8217;);<\/p>\n<p>function greet(name) {<br \/>\n  return <code>Merhaba, ${name}!<\/code>;<br \/>\n}<\/p>\n<p>console.log(greet(&#8216;Gridsome Kullan\u0131c\u0131s\u0131&#8217;));<\/p>\n<pre><code class=\"language-\">Umar\u0131m bu ba\u015flang\u0131\u00e7 size ilham verir!<\/code><\/pre>\n<p><strong><code>src\/content\/blog\/ikinci-yazi.md<\/code>:<\/strong><\/p>\n<pre><code class=\"language-markdown\">---\ntitle: Gridsome ile GraphQL Kullan\u0131m\u0131\ndate: 2023-02-20\nauthor: Ay\u015fe Demir\nexcerpt: Gridsome'un GraphQL veri katman\u0131n\u0131n nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ke\u015ffedin ve verilerinizi nas\u0131l sorgulayaca\u011f\u0131n\u0131z\u0131 \u00f6\u011frenin.\ncover_image: \/uploads\/ikinci-yazi-kapak.jpg\n---\n\nGridsome, Vue.js geli\u015ftiricileri i\u00e7in GraphQL ile sorunsuz bir entegrasyon sunar. Bu sayede, uygulaman\u0131z\u0131n ihtiya\u00e7 duydu\u011fu verileri kolayca \u00e7ekebilirsiniz.\n\nGraphQL Playground'u kullanarak sorgular\u0131n\u0131z\u0131 test edebilir, veri yap\u0131n\u0131z\u0131 anlayabilir ve istedi\u011finiz alanlar\u0131 se\u00e7erek yaln\u0131zca ihtiyac\u0131n\u0131z olan veriyi alabilirsiniz.\n\n<strong>\u00d6rnek GraphQL Sorgusu:<\/strong><\/code><\/pre>\n<p>graphql<br \/>\nquery {<br \/>\n  allBlogPost {<br \/>\n    edges {<br \/>\n      node {<br \/>\n        title<br \/>\n        date<br \/>\n        path<br \/>\n      }<br \/>\n    }<br \/>\n  }<br \/>\n}<\/p>\n<pre><code class=\"language-\">Bu sorgu, t\u00fcm blog yaz\u0131lar\u0131n\u0131n ba\u015fl\u0131klar\u0131n\u0131, tarihlerini ve yollar\u0131n\u0131 d\u00f6nd\u00fcrecektir.<\/code><\/pre>\n<h4>Gridsome&#8217;u Markdown Kaynaklar\u0131n\u0131 Kullanmaya Ayarlama<\/h4>\n<p>Gridsome&#8217;un Markdown dosyalar\u0131m\u0131z\u0131 tan\u0131mas\u0131 ve GraphQL katman\u0131na eklemesi i\u00e7in <code>gridsome.config.js<\/code> dosyas\u0131n\u0131 yap\u0131land\u0131rmam\u0131z gerekiyor. Bunun i\u00e7in <code>gridsome-source-filesystem<\/code> ve <code>gridsome-transformer-remark<\/code> eklentilerini kullanaca\u011f\u0131z.<\/p>\n<p>\u00d6ncelikle bu eklentileri kural\u0131m:<\/p>\n<pre><code class=\"language-bash\">npm install --save gridsome-source-filesystem gridsome-transformer-remark\n<h2>veya<\/h2>\nyarn add gridsome-source-filesystem gridsome-transformer-remark<\/code><\/pre>\n<p>\u015eimdi <code>gridsome.config.js<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki gibi g\u00fcncelleyin:<\/p>\n<pre><code class=\"language-javascript\">module.exports = {\n  siteName: 'Gridsome Blog',\n  siteDescription: 'Gridsome ile olu\u015fturulmu\u015f basit bir blog.',\n  plugins: [\n    {\n      use: '@gridsome\/source-filesystem',\n      options: {\n        path: 'src\/content\/blog\/<em><\/em>\/*.md', \/\/ Markdown dosyalar\u0131n\u0131n yolu\n        typeName: 'BlogPost', \/\/ GraphQL'de kullan\u0131lacak tip ad\u0131\n        remark: {\n          \/\/ Remark transformer i\u00e7in ayarlar\n          \/\/ Bu k\u0131sma ek eklentiler eklenebilir (\u00f6rne\u011fin kod vurgulama)\n          plugins: [\n            \/\/ \u00d6rne\u011fin, kod vurgulama i\u00e7in prismjs eklentisi\n            \/\/ require('@gridsome\/remark-prismjs')\n          ]\n        }\n      }\n    }\n  ],\n  templates: {\n    BlogPost: '\/blog\/:slug' \/\/ Her BlogPost i\u00e7in dinamik sayfa olu\u015fturma\n  }\n}<\/code><\/pre>\n<p>Bu yap\u0131land\u0131rma ile:<br \/>\n*   <code>@gridsome\/source-filesystem<\/code> eklentisi, <code>src\/content\/blog<\/code> dizinindeki t\u00fcm <code>.md<\/code> dosyalar\u0131n\u0131 tarayacak.<br \/>\n*   Bu Markdown dosyalar\u0131, GraphQL katman\u0131nda <code>BlogPost<\/code> ad\u0131nda bir veri tipi olarak eri\u015filebilir olacak.<br \/>\n*   <code>remark<\/code> \u00f6zelli\u011fi sayesinde, Markdown i\u00e7eri\u011fi HTML&#8217;e d\u00f6n\u00fc\u015ft\u00fcr\u00fclecek ve front-matter alanlar\u0131 da GraphQL&#8217;de sorgulanabilir hale gelecek.<br \/>\n*   <code>templates<\/code> b\u00f6l\u00fcm\u00fc, her <code>BlogPost<\/code> i\u00e7in otomatik olarak <code>\/blog\/:slug<\/code> format\u0131nda bir sayfa olu\u015fturulaca\u011f\u0131n\u0131 belirtir. <code>:slug<\/code> de\u011feri, Markdown dosyas\u0131n\u0131n ad\u0131ndan veya front-matter&#8217;daki <code>slug<\/code> alan\u0131ndan t\u00fcretilir.<\/p>\n<p><code>gridsome.config.js<\/code> dosyas\u0131n\u0131 g\u00fcncelledikten sonra, geli\u015ftirme sunucusunu yeniden ba\u015flatman\u0131z gerekebilir (<code>gridsome develop<\/code>).<\/p>\n<h3>GraphQL ile Veri Sorgulama<\/h3>\n<p>Gridsome&#8217;un en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biri, GraphQL veri katman\u0131d\u0131r. T\u00fcm veri kaynaklar\u0131 (bu durumda Markdown dosyalar\u0131m\u0131z) tek bir GraphQL API \u00fczerinden eri\u015filebilir hale gelir.<\/p>\n<h4>GraphQL Playground&#8217;u Kullanma<\/h4>\n<p><code>gridsome develop<\/code> komutunu \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra, taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost:8080\/___explore<\/code> adresine gidin. Buras\u0131 GraphQL Playground&#8217;dur. Sol taraftaki &#8220;DOCS&#8221; sekmesini a\u00e7arak mevcut veri tiplerini ve alanlar\u0131n\u0131 g\u00f6rebilirsiniz. <code>allBlogPost<\/code> gibi bir tipi g\u00f6rmelisiniz.<\/p>\n<p>\u015eimdi t\u00fcm blog yaz\u0131lar\u0131n\u0131 sorgulayal\u0131m:<\/p>\n<pre><code class=\"language-graphql\">query {\n  allBlogPost {\n    edges {\n      node {\n        id\n        title\n        date\n        path\n        excerpt\n        author\n        content \/\/ Markdown i\u00e7eri\u011finin HTML'e d\u00f6n\u00fc\u015ft\u00fcr\u00fclm\u00fc\u015f hali\n        cover_image\n      }\n    }\n  }\n}<\/code><\/pre>\n<p>Bu sorguyu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, Markdown dosyalar\u0131n\u0131zdan gelen t\u00fcm verileri JSON format\u0131nda g\u00f6receksiniz. <code>content<\/code> alan\u0131, Markdown&#8217;dan HTML&#8217;e d\u00f6n\u00fc\u015ft\u00fcr\u00fclm\u00fc\u015f yaz\u0131n\u0131n kendisini i\u00e7erir.<\/p>\n<h3>T\u00fcm Yaz\u0131lar\u0131 Listeleme<\/h3>\n<p>Art\u0131k verilerimize GraphQL \u00fczerinden eri\u015febildi\u011fimize g\u00f6re, bu yaz\u0131lar\u0131 ana sayfam\u0131zda veya bir blog listeleme sayfas\u0131nda g\u00f6sterebiliriz. <code>src\/pages\/Index.vue<\/code> dosyas\u0131n\u0131 ana sayfa olarak kullanabiliriz.<\/p>\n<pre><code class=\"language-vue\"><template>\n  <Layout>\n    <div class=\"container\">\n      \n      <div class=\"posts\">\n        <div v-for=\"edge in $page.posts.edges\" :key=\"edge.node.id\" class=\"post-card\">\n          <g-link :to=\"edge.node.path\">\n            <img v-if=\"edge.node.cover_image\" :src=\"edge.node.cover_image\" :alt=\"edge.node.title\" class=\"post-cover-image\">\n            <h2>{{ edge.node.title }}<\/h2>\n          <\/g-link>\n          <p class=\"post-meta\">\n            <span>{{ edge.node.date }}<\/span>\n            <span>-<\/span>\n            <span>{{ edge.node.author }}<\/span>\n          <\/p>\n          <p>{{ edge.node.excerpt }}<\/p>\n          <g-link :to=\"edge.node.path\" class=\"read-more\">Devam\u0131n\u0131 Oku &rarr;<\/g-link>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/Layout>\n<\/template>\n\n<page-query>\nquery BlogPosts {\n  posts: allBlogPost(sortBy: \"date\", order: DESC) {\n    edges {\n      node {\n        id\n        title\n        date (format: \"DD MMMM, YYYY\")\n        author\n        excerpt\n        path\n        cover_image\n      }\n    }\n  }\n}\n<\/page-query>\n\n<script>\nexport default {\n  metaInfo: {\n    title: 'Ana Sayfa'\n  }\n}\n<\/script>\n\n<style>\n.container {\n  max-width: 960px;\n  margin: 0 auto;\n  padding: 2rem 1rem;\n}\n\nh1 {\n  text-align: center;\n  margin-bottom: 2rem;\n}\n\n.posts {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n  gap: 2rem;\n}\n\n.post-card {\n  background-color: #fff;\n  border-radius: 8px;\n  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);\n  padding: 1.5rem;\n  display: flex;\n  flex-direction: column;\n}\n\n.post-card h2 {\n  margin-top: 0.5rem;\n  margin-bottom: 0.5rem;\n  font-size: 1.5rem;\n  line-height: 1.3;\n  color: #333;\n}\n\n.post-card h2:hover {\n  color: #007bff;\n}\n\n.post-card .post-meta {\n  font-size: 0.9rem;\n  color: #666;\n  margin-bottom: 1rem;\n}\n\n.post-card .post-meta span:not(:last-child) {\n  margin-right: 0.5rem;\n}\n\n.post-card p {\n  color: #555;\n  line-height: 1.6;\n  flex-grow: 1; \/<em> \u0130\u00e7eri\u011fin kart\u0131 doldurmas\u0131n\u0131 sa\u011flar <\/em>\/\n}\n\n.post-card .read-more {\n  display: inline-block;\n  margin-top: 1rem;\n  color: #007bff;\n  text-decoration: none;\n  font-weight: bold;\n}\n\n.post-card .read-more:hover {\n  text-decoration: underline;\n}\n\n.post-cover-image {\n  max-width: 100%;\n  height: 200px; \/<em> Sabit y\u00fckseklik <\/em>\/\n  object-fit: cover; \/<em> Resmin oran\u0131n\u0131 korurken alan\u0131 doldurmas\u0131n\u0131 sa\u011flar <\/em>\/\n  border-radius: 4px;\n  margin-bottom: 1rem;\n}\n<\/style><\/code><\/pre>\n<p>Yukar\u0131daki kodda:<br \/>\n*   <code><page-query><\/code> blo\u011fu, GraphQL sorgumuzu tan\u0131mlar. <code>allBlogPost<\/code> tipinden t\u00fcm yaz\u0131lar\u0131 <code>date<\/code> alan\u0131na g\u00f6re azalan s\u0131rada (en yeni yaz\u0131lar en \u00fcstte) \u00e7eker.<br \/>\n*   <code>posts: allBlogPost(...)<\/code> ile sorgunun sonucunu <code>posts<\/code> ad\u0131nda bir de\u011fi\u015fkene atar\u0131z. Bu de\u011fi\u015fkene daha sonra <code>$page.posts<\/code> ile eri\u015filir.<br \/>\n*   <code>date (format: \"DD MMMM, YYYY\")<\/code> ile tarihi okunabilir bir formata d\u00f6n\u00fc\u015ft\u00fcr\u00fcyoruz.<br \/>\n*   <code><\/p>\n<div v-for=\"edge in $page.posts.edges\" ...><\/code> ile \u00e7ekilen her yaz\u0131 i\u00e7in bir kart olu\u015fturulur.<br \/>\n*   <code><g-link :to=\"edge.node.path\"><\/code> bile\u015feni, Gridsome&#8217;un optimize edilmi\u015f ba\u011flant\u0131 bile\u015fenidir ve tekil yaz\u0131 sayfas\u0131na y\u00f6nlendirme yapar.<\/p>\n<p>Bu yap\u0131, t\u00fcm blog yaz\u0131lar\u0131n\u0131z\u0131 ana sayfan\u0131zda veya belirledi\u011finiz bir blog listeleme sayfas\u0131nda \u015f\u0131k bir \u015fekilde listelemenizi sa\u011flar.<\/p>\n<h3>Sayfalama (Pagination) Uygulamas\u0131<\/h3>\n<p>\u00c7ok say\u0131da blog yaz\u0131n\u0131z oldu\u011funda, t\u00fcm\u00fcn\u00fc tek bir sayfada listelemek hem performans sorunlar\u0131na yol a\u00e7abilir hem de kullan\u0131c\u0131 deneyimini olumsuz etkileyebilir. Bu nedenle, sayfalama (pagination) \u00f6zelli\u011fi kritik \u00f6neme sahiptir. Gridsome, <code><page-query><\/code> i\u00e7inde basit bir yap\u0131land\u0131rma ile sayfalama \u00f6zelli\u011fini yerle\u015fik olarak sunar.<\/p>\n<h4>Sayfalama Ayarlar\u0131n\u0131 Ekleme<\/h4>\n<p>Sayfalama \u00f6zelli\u011fini etkinle\u015ftirmek i\u00e7in, <code>src\/pages\/Index.vue<\/code> (veya blog listeleme sayfan\u0131z) i\u00e7indeki <code><page-query><\/code> blo\u011funa <code>paginate<\/code> se\u00e7ene\u011fini eklememiz yeterlidir:<\/p>\n<pre><code class=\"language-vue\"><page-query>\nquery BlogPosts ($page: Int) {\n  posts: allBlogPost(sortBy: \"date\", order: DESC, perPage: 5, page: $page) @paginate {\n    pageInfo {\n      totalPages\n      currentPage\n      hasPreviousPage\n      hasNextPage\n    }\n    edges {\n      node {\n        id\n        title\n        date (format: \"DD MMMM, YYYY\")\n        author\n        excerpt\n        path\n        cover_image\n      }\n    }\n  }\n}\n<\/page-query><\/code><\/pre>\n<p>Buradaki \u00f6nemli de\u011fi\u015fiklikler \u015funlard\u0131r:<br \/>\n*   <code>$page: Int<\/code>: Sorguya bir <code>$page<\/code> de\u011fi\u015fkeni ekledik. Bu de\u011fi\u015fken, o anki sayfa numaras\u0131n\u0131 tutacak. Gridsome, sayfalama i\u00e7in bu de\u011fi\u015fkeni otomatik olarak sa\u011flar.<br \/>\n*   <code>perPage: 5<\/code>: Her sayfada ka\u00e7 yaz\u0131 g\u00f6sterilece\u011fini belirtiriz. Bu \u00f6rnekte her sayfada 5 yaz\u0131 listelenecek.<br \/>\n*   <code>page: $page<\/code>: Sorgunun hangi sayfay\u0131 \u00e7ekece\u011fini belirtiriz.<br \/>\n*   <code>@paginate<\/code>: Bu direktif, Gridsome&#8217;a bu sorgu i\u00e7in sayfalama yapmas\u0131n\u0131 s\u00f6yler. Bu direktif sayesinde, <code>pageInfo<\/code> alan\u0131 otomatik olarak sorgu sonucuna eklenir.<\/p>\n<p><code>pageInfo<\/code> objesi, sayfalama i\u00e7in gerekli t\u00fcm bilgileri i\u00e7erir:<br \/>\n*   <code>totalPages<\/code>: Toplam sayfa say\u0131s\u0131.<br \/>\n*   <code>currentPage<\/code>: \u015eu anki sayfa numaras\u0131.<br \/>\n*   <code>hasPreviousPage<\/code>: \u00d6nceki sayfa olup olmad\u0131\u011f\u0131n\u0131 g\u00f6steren boolean de\u011fer.<br \/>\n*   <code>hasNextPage<\/code>: Sonraki sayfa olup olmad\u0131\u011f\u0131n\u0131 g\u00f6steren boolean de\u011fer.<\/p>\n<h4>Sayfalama Kontrollerini Olu\u015fturma<\/h4>\n<p>\u015eimdi <code>Index.vue<\/code> \u015fablonumuza sayfalama kontrollerini ekleyelim. Bu kontroller, kullan\u0131c\u0131lar\u0131n sayfalar aras\u0131nda gezinmesini sa\u011flayacak.<\/p>\n<pre><code class=\"language-vue\"><template>\n  <Layout>\n    <div class=\"container\">\n      \n      <div class=\"posts\">\n        <div v-for=\"edge in $page.posts.edges\" :key=\"edge.node.id\" class=\"post-card\">\n          <g-link :to=\"edge.node.path\">\n            <img v-if=\"edge.node.cover_image\" :src=\"edge.node.cover_image\" :alt=\"edge.node.title\" class=\"post-cover-image\">\n            <h2>{{ edge.node.title }}<\/h2>\n          <\/g-link>\n          <p class=\"post-meta\">\n            <span>{{ edge.node.date }}<\/span>\n            <span>-<\/span>\n            <span>{{ edge.node.author }}<\/span>\n          <\/p>\n          <p>{{ edge.node.excerpt }}<\/p>\n          <g-link :to=\"edge.node.path\" class=\"read-more\">Devam\u0131n\u0131 Oku &rarr;<\/g-link>\n        <\/div>\n      <\/div>\n\n      <!-- Sayfalama Kontrolleri -->\n      <div class=\"pagination\">\n        <g-link\n          v-if=\"$page.posts.pageInfo.hasPreviousPage\"\n          :to=\"$page.posts.pageInfo.currentPage == 2 ? '\/blog' : <code>\/blog\/${$page.posts.pageInfo.currentPage - 1}<\/code>\"\n          class=\"pagination-link prev\"\n        >\n          &larr; \u00d6nceki Sayfa\n        <\/g-link>\n\n        <g-link\n          v-for=\"n in $page.posts.pageInfo.totalPages\"\n          :key=\"n\"\n          :to=\"n === 1 ? '\/blog' : <code>\/blog\/${n}<\/code>\"\n          :class=\"{ 'pagination-link': true, 'active': n === $page.posts.pageInfo.currentPage }\"\n          class=\"page-number\"\n        >\n          {{ n }}\n        <\/g-link>\n\n        <g-link\n          v-if=\"$page.posts.pageInfo.hasNextPage\"\n          :to=\"<code>\/blog\/${$page.posts.pageInfo.currentPage + 1}<\/code>\"\n          class=\"pagination-link next\"\n        >\n          Sonraki Sayfa &rarr;\n        <\/g-link>\n      <\/div>\n    <\/div>\n  <\/Layout>\n<\/template>\n\n<!-- page-query blo\u011fu yukar\u0131daki ile ayn\u0131 kalacak -->\n<page-query>\nquery BlogPosts ($page: Int) {\n  posts: allBlogPost(sortBy: \"date\", order: DESC, perPage: 5, page: $page) @paginate {\n    pageInfo {\n      totalPages\n      currentPage\n      hasPreviousPage\n      hasNextPage\n    }\n    edges {\n      node {\n        id\n        title\n        date (format: \"DD MMMM, YYYY\")\n        author\n        excerpt\n        path\n        cover_image\n      }\n    }\n  }\n}\n<\/page-query>\n\n<script>\nexport default {\n  metaInfo: {\n    title: 'Ana Sayfa'\n  }\n}\n<\/script>\n\n<style>\n\/<em> \u00d6nceki stiller burada kalacak <\/em>\/\n\n.pagination {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  margin-top: 3rem;\n  gap: 0.5rem;\n}\n\n.pagination-link {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  padding: 0.5rem 1rem;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  text-decoration: none;\n  color: #007bff;\n  transition: all 0.2s ease-in-out;\n}\n\n.pagination-link:hover {\n  background-color: #f0f0f0;\n  color: #0056b3;\n}\n\n.pagination-link.active {\n  background-color: #007bff;\n  color: #fff;\n  border-color: #007bff;\n}\n\n.pagination-link.prev,\n.pagination-link.next {\n  min-width: 120px;\n}\n\n.page-number {\n  min-width: 40px;\n  text-align: center;\n}\n<\/style><\/code><\/pre>\n<p><strong>Sayfalama Kontrollerinin A\u00e7\u0131klamas\u0131:<\/strong><\/p>\n<p>1.  <strong>\u00d6nceki Sayfa (<code>hasPreviousPage<\/code>)<\/strong>:<br \/>\n    *   <code>v-if=\"$page.posts.pageInfo.hasPreviousPage\"<\/code>: Yaln\u0131zca \u00f6nceki sayfa varsa bu ba\u011flant\u0131 g\u00f6r\u00fcn\u00fcr.<br \/>\n    *   <code>:to=\"$page.posts.pageInfo.currentPage == 2 ? '\/blog' : <\/code>\/blog\/${$page.posts.pageInfo.currentPage &#8211; 1}`<code>:<br \/>\n        *   E\u011fer \u015fu anki sayfa 2 ise, \u00f6nceki sayfa 1'dir ve yolu <\/code>\/blog<code> olmal\u0131d\u0131r (varsay\u0131lan olarak ilk sayfa i\u00e7in <\/code>\/blog<code> kullan\u0131l\u0131r, <\/code>\/blog\/1<code> de\u011fil).<br \/>\n        *   Aksi takdirde, \u00f6nceki sayfan\u0131n yolu <\/code>\/blog\/${currentPage &#8211; 1}<code> \u015feklinde olur. (Not: Bu \u00f6rnekte, ana sayfa olarak <\/code>src\/pages\/Index.vue<code> kullan\u0131ld\u0131\u011f\u0131ndan, <\/code>\/blog<code> yerine <\/code>\/<code> kullan\u0131lmas\u0131 daha do\u011fru olabilir. Ancak blog listeleme sayfas\u0131 <\/code>\/blog<code> alt\u0131nda olsayd\u0131 bu yap\u0131 ge\u00e7erli olurdu. <\/code>Index.vue<code> i\u00e7in <\/code>\/<code> kullan\u0131lmal\u0131 veya <\/code>src\/pages\/Blog.vue<code> olu\u015fturulup <\/code>\/blog<code> rotas\u0131 i\u00e7in kullan\u0131lmal\u0131.)<\/p>\n<p>2.  <strong>Sayfa Numaralar\u0131 (<\/code>totalPages<code>)<\/strong>:<br \/>\n    *   <\/code>v-for=&#8221;n in $page.posts.pageInfo.totalPages&#8221;<code>: Toplam sayfa say\u0131s\u0131 kadar d\u00f6ng\u00fc olu\u015fturur.<br \/>\n    *   <\/code>:to=&#8221;n === 1 ? &#8216;\/blog&#8217; : <code>\/blog\/${n}<\/code><code>:<br \/>\n        *   \u0130lk sayfa i\u00e7in yol <\/code>\/blog<code> (veya <\/code>\/<code> e\u011fer ana sayfa ise).<br \/>\n        *   Di\u011fer sayfalar i\u00e7in yol <\/code>\/blog\/${n}<code> \u015feklinde olur.<br \/>\n    *   <\/code>:class=&#8221;{ &#8216;active&#8217;: n === $page.posts.pageInfo.currentPage }&#8221;<code>: \u015eu anki sayfay\u0131 vurgulamak i\u00e7in <\/code>active<code> s\u0131n\u0131f\u0131 ekler.<\/p>\n<p>3.  <strong>Sonraki Sayfa (<\/code>hasNextPage<code>)<\/strong>:<br \/>\n    *   <\/code>v-if=&#8221;$page.posts.pageInfo.hasNextPage&#8221;<code>: Yaln\u0131zca sonraki sayfa varsa bu ba\u011flant\u0131 g\u00f6r\u00fcn\u00fcr.<br \/>\n    *   <\/code>:to=&#8221;<code>\/blog\/${$page.posts.pageInfo.currentPage + 1}<\/code><code>: Sonraki sayfan\u0131n yolu <\/code>\/blog\/${currentPage + 1}<code> \u015feklinde olur.<\/p>\n<p><strong>\u00d6nemli Not:<\/strong> Yukar\u0131daki sayfalama linkleri <\/code>\/blog<code> yolunu kullan\u0131yor. E\u011fer ana sayfan\u0131z <\/code>src\/pages\/Index.vue<code> ise ve blog yaz\u0131lar\u0131n\u0131 do\u011frudan ana sayfada listeliyorsan\u0131z, ilk sayfan\u0131n yolu <\/code>\/<code> olmal\u0131d\u0131r. Di\u011fer sayfalar i\u00e7in <\/code>\/${n}<code> veya <\/code>\/${$page.posts.pageInfo.currentPage &#8211; 1}<code> gibi yollar kullanman\u0131z gerekir.<\/p>\n<p>\u00d6rne\u011fin, <\/code>src\/pages\/Index.vue<code> i\u00e7in sayfalama linkleri \u015f\u00f6yle d\u00fczenlenebilir:<\/p>\n<pre><code class=\"language-vue\"><div class=\"pagination\">\n  <g-link\n    v-if=\"$page.posts.pageInfo.hasPreviousPage\"\n    :to=\"$page.posts.pageInfo.currentPage == 2 ? '\/' : <\/code>\/${$page.posts.pageInfo.currentPage - 1}<code>\"\n    class=\"pagination-link prev\"\n  >\n    &larr; \u00d6nceki Sayfa\n  <\/g-link>\n\n  <g-link\n    v-for=\"n in $page.posts.pageInfo.totalPages\"\n    :key=\"n\"\n    :to=\"n === 1 ? '\/' : <\/code>\/${n}<code>\"\n    :class=\"{ 'pagination-link': true, 'active': n === $page.posts.pageInfo.currentPage }\"\n    class=\"page-number\"\n  >\n    {{ n }}\n  <\/g-link>\n\n  <g-link\n    v-if=\"$page.posts.pageInfo.hasNextPage\"\n    :to=\"<\/code>\/${$page.posts.pageInfo.currentPage + 1}<code>\"\n    class=\"pagination-link next\"\n  >\n    Sonraki Sayfa &rarr;\n  <\/g-link>\n<\/div><\/code><\/pre>\n<p>Bu \u015fekilde, Gridsome otomatik olarak her sayfalama i\u00e7in ayr\u0131 statik sayfalar olu\u015fturacakt\u0131r (\u00f6rne\u011fin <\/code>\/<code>, <\/code>\/2<code>, <\/code>\/3<code> vb.).<\/p>\n<h3>Tekil Yaz\u0131 Sayfas\u0131 Olu\u015fturma (K\u0131saca)<\/h3>\n<p>Blog yaz\u0131lar\u0131n\u0131 listeledik ve sayfalama ekledik. \u015eimdi her bir yaz\u0131n\u0131n detay sayfas\u0131n\u0131 olu\u015ftural\u0131m. <\/code>gridsome.config.js<code> dosyas\u0131nda <\/code>templates<code> ayar\u0131n\u0131 zaten yapm\u0131\u015ft\u0131k:<\/p>\n<pre><code class=\"language-javascript\">\/\/ gridsome.config.js\nmodule.exports = {\n  \/\/ ...\n  templates: {\n    BlogPost: '\/blog\/:slug' \/\/ Her BlogPost i\u00e7in dinamik sayfa olu\u015fturma\n  }\n}<\/code><\/pre>\n<p>Bu ayar, Gridsome'a her <\/code>BlogPost<code> i\u00e7in <\/code>\/blog\/:slug<code> format\u0131nda bir rota olu\u015fturmas\u0131n\u0131 s\u00f6yler. <\/code>:slug<code> de\u011feri, Markdown dosyas\u0131n\u0131n ad\u0131ndan veya front-matter'daki <\/code>slug<code> alan\u0131ndan al\u0131n\u0131r. \u015eimdi bu rotalar\u0131n kullanaca\u011f\u0131 \u015fablonu <\/code>src\/templates\/BlogPost.vue<code> olarak olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-vue\"><template>\n  <Layout>\n    <div class=\"container blog-post\">\n      <g-image v-if=\"$page.post.cover_image\" :src=\"$page.post.cover_image\" :alt=\"$page.post.title\" class=\"post-cover-image-detail\" \/>\n      \n      <p class=\"post-meta\">\n        <span>{{ $page.post.date }}<\/span>\n        <span>-<\/span>\n        <span>{{ $page.post.author }}<\/span>\n      <\/p>\n      <div v-html=\"$page.post.content\" class=\"post-content\"><\/div>\n      <g-link to=\"\/\" class=\"back-link\">&larr; T\u00fcm Yaz\u0131lara Geri D\u00f6n<\/g-link>\n    <\/div>\n  <\/Layout>\n<\/template>\n\n<page-query>\nquery BlogPost ($path: String!) {\n  post: blogPost (path: $path) {\n    title\n    date (format: \"DD MMMM, YYYY\")\n    author\n    content\n    cover_image\n  }\n}\n<\/page-query>\n\n<script>\nexport default {\n  metaInfo() {\n    return {\n      title: this.$page.post.title\n    }\n  }\n}\n<\/script>\n\n<style>\n.blog-post {\n  max-width: 800px;\n  margin: 0 auto;\n  padding: 2rem 1rem;\n}\n\n.blog-post h1 {\n  text-align: left;\n  margin-bottom: 1rem;\n  font-size: 2.5rem;\n}\n\n.blog-post .post-meta {\n  font-size: 1rem;\n  color: #666;\n  margin-bottom: 2rem;\n}\n\n.blog-post .post-content {\n  line-height: 1.8;\n  font-size: 1.1rem;\n  color: #333;\n}\n\n.blog-post .post-content p {\n  margin-bottom: 1rem;\n}\n\n.blog-post .post-content h2,\n.blog-post .post-content h3 {\n  margin-top: 2rem;\n  margin-bottom: 1rem;\n  color: #222;\n}\n\n.blog-post .post-content pre {\n  background-color: #f4f4f4;\n  padding: 1rem;\n  border-radius: 4px;\n  overflow-x: auto;\n  margin-bottom: 1.5rem;\n}\n\n.blog-post .post-content code {\n  font-family: 'Fira Code', 'Cascadia Code', 'Consolas', monospace;\n  font-size: 0.9rem;\n}\n\n.post-cover-image-detail {\n  width: 100%;\n  max-height: 400px;\n  object-fit: cover;\n  border-radius: 8px;\n  margin-bottom: 2rem;\n}\n\n.back-link {\n  display: inline-block;\n  margin-top: 3rem;\n  color: #007bff;\n  text-decoration: none;\n  font-weight: bold;\n}\n\n.back-link:hover {\n  text-decoration: underline;\n}\n<\/style><\/code><\/pre>\n<p>Bu \u015fablonda:<br \/>\n*   <\/code><page-query><code> blo\u011fu, <\/code>$path<code> de\u011fi\u015fkenini kullanarak ilgili blog yaz\u0131s\u0131n\u0131 \u00e7eker. Gridsome, dinamik olarak olu\u015fturulan sayfalar i\u00e7in <\/code>$path<code> de\u011fi\u015fkenini otomatik olarak sa\u011flar.<br \/>\n*   <\/code>v-html=\"$page.post.content\"<code> ile Markdown'dan HTML'e d\u00f6n\u00fc\u015ft\u00fcr\u00fclm\u00fc\u015f i\u00e7erik do\u011frudan sayfaya bas\u0131l\u0131r. <strong>G\u00fcvenlik Notu:<\/strong> <\/code>v-html<code> kullan\u0131rken dikkatli olunmal\u0131d\u0131r, \u00e7\u00fcnk\u00fc kullan\u0131c\u0131 taraf\u0131ndan girilen i\u00e7eri\u011fi direkt render etmek XSS sald\u0131r\u0131lar\u0131na yol a\u00e7abilir. Bu \u00f6rnekte i\u00e7erik kendi Markdown dosyalar\u0131m\u0131zdan geldi\u011fi i\u00e7in g\u00fcvenlidir.<br \/>\n*   <\/code>metaInfo<code> \u00f6zelli\u011fi, her yaz\u0131 i\u00e7in dinamik olarak sayfa ba\u015fl\u0131\u011f\u0131n\u0131 ayarlamam\u0131z\u0131 sa\u011flar.<\/p>\n<p>Kod vurgulama (syntax highlighting) i\u00e7in <\/code>gridsome-transformer-remark<code> eklentisine <\/code>remark-prismjs<code> gibi bir eklenti ekleyebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">npm install --save @gridsome\/remark-prismjs\n<h2>veya<\/h2>\nyarn add @gridsome\/remark-prismjs<\/code><\/pre>\n<p>Ve <\/code>gridsome.config.js<code> dosyas\u0131n\u0131 g\u00fcncelleyin:<\/p>\n<pre><code class=\"language-javascript\">\/\/ gridsome.config.js\nmodule.exports = {\n  \/\/ ...\n  plugins: [\n    {\n      use: '@gridsome\/source-filesystem',\n      options: {\n        path: 'src\/content\/blog\/<em><\/em>\/*.md',\n        typeName: 'BlogPost',\n        remark: {\n          plugins: [\n            require('@gridsome\/remark-prismjs') \/\/ Kod vurgulama eklentisi\n          ]\n        }\n      }\n    }\n  ],\n  \/\/ ...\n}<\/code><\/pre>\n<p>Bu eklenti, Markdown dosyalar\u0131n\u0131zdaki kod bloklar\u0131n\u0131 otomatik olarak vurgulayacakt\u0131r. Stil i\u00e7in ise Prism.js'in CSS dosyas\u0131n\u0131 <\/code>main.js<code>'e veya global bir CSS dosyas\u0131na dahil etmeniz gerekebilir:<\/p>\n<pre><code class=\"language-javascript\">\/\/ main.js\nimport DefaultLayout from '~\/layouts\/Default.vue'\nimport 'prismjs\/themes\/prism.css' \/\/ Bir Prism.js temas\u0131\n\nexport default function (Vue, { head }) {\n  Vue.component('Layout', DefaultLayout)\n}<\/code><\/pre>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, Gridsome kullanarak s\u0131f\u0131rdan bir blog olu\u015fturmay\u0131, Markdown dosyalar\u0131n\u0131 veri kayna\u011f\u0131 olarak kullanmay\u0131, GraphQL ile veri sorgulamay\u0131, t\u00fcm blog yaz\u0131lar\u0131n\u0131 listelemeyi ve en \u00f6nemlisi, yerle\u015fik sayfalama \u00f6zelli\u011fini entegre etmeyi \u00f6\u011frendik. Gridsome'un Vue.js tabanl\u0131 yap\u0131s\u0131, GraphQL veri katman\u0131 ve statik site olu\u015fturma yetenekleri sayesinde, y\u00fcksek performansl\u0131, g\u00fcvenli ve bak\u0131m\u0131 kolay bir blog projesi geli\u015ftirmek art\u0131k \u00e7ok daha eri\u015filebilir.<\/p>\n<p>Gridsome ile olu\u015fturdu\u011funuz blog, statik yap\u0131s\u0131 sayesinde hosting maliyetlerini d\u00fc\u015f\u00fcr\u00fcr ve CDN \u00fczerinden da\u011f\u0131t\u0131ld\u0131\u011f\u0131nda d\u00fcnya \u00e7ap\u0131nda h\u0131zl\u0131 eri\u015fim sa\u011flar. Bu modern yakla\u015f\u0131m, geleneksel CMS'lerin sundu\u011fu esnekli\u011fi korurken, performans ve g\u00fcvenlikten \u00f6d\u00fcn vermez.<\/p>\n<p>Gelecekte blogunuzu daha da geli\u015ftirmek i\u00e7in \u015fu \u00f6zellikleri d\u00fc\u015f\u00fcnebilirsiniz:<br \/>\n*   <strong>Etiketler ve Kategoriler:<\/strong> Blog yaz\u0131lar\u0131n\u0131 etiketlere ve kategorilere g\u00f6re filtreleme ve listeleme.<br \/>\n*   <strong>Arama Fonksiyonu:<\/strong> Algolia veya Lunr.js gibi ara\u00e7larla statik siteler i\u00e7in arama \u00f6zelli\u011fi ekleme.<br \/>\n*   <strong>Yorumlar:<\/strong> Disqus veya Commento gibi \u00fc\u00e7\u00fcnc\u00fc taraf yorum sistemlerini entegre etme.<br \/>\n*   <strong>G\u00f6rsel Optimizasyon:<\/strong> <\/code>gridsome-image<code> eklentisi ile resimleri otomatik olarak optimize etme.<br \/>\n*   <strong>SEO Optimizasyonu:<\/strong> <\/code>gridsome-plugin-sitemap<code> ve <\/code>gridsome-plugin-robots` gibi eklentilerle SEO dostu bir yap\u0131 olu\u015fturma.<\/p>\n<p>Gridsome, modern web geli\u015ftiricileri i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7 seti sunar ve bu makale, bu g\u00fcc\u00fcn temelini anlaman\u0131za yard\u0131mc\u0131 olmu\u015ftur. Kendi blogunuzu kurarken bu bilgileri kullanarak harika i\u015fler \u00e7\u0131karaca\u011f\u0131n\u0131zdan eminiz!<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Gridsome ile Blog Olu\u015fturma: T\u00fcm Yaz\u0131lar\u0131 Listeleme ve Sayfalama\nGridsome, modern web geli\u015ftirmenin en pop\u00fcler yakla\u015f\u0131mlar\u0131ndan biri olan st","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-32898","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>Gridsome ile Blog Olu\u015fturma: T\u00fcm Yaz\u0131lar\u0131 Listeleme ve Sayfalama - 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\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gridsome ile Blog Olu\u015fturma: T\u00fcm Yaz\u0131lar\u0131 Listeleme ve Sayfalama\" \/>\n<meta property=\"og:description\" content=\"Gridsome ile Blog Olu\u015fturma: T\u00fcm Yaz\u0131lar\u0131 Listeleme ve Sayfalama Gridsome, modern web geli\u015ftirmenin en pop\u00fcler yakla\u015f\u0131mlar\u0131ndan biri olan st\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-27T02:41:00+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=\"14 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Gridsome ile Blog Olu\u015fturma: T\u00fcm Yaz\u0131lar\u0131 Listeleme ve Sayfalama\",\"datePublished\":\"2025-10-27T02:41:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/\"},\"wordCount\":1783,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/\",\"name\":\"Gridsome ile Blog Olu\u015fturma: T\u00fcm Yaz\u0131lar\u0131 Listeleme ve Sayfalama - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-27T02:41:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Gridsome ile Blog Olu\u015fturma: T\u00fcm Yaz\u0131lar\u0131 Listeleme ve Sayfalama\"}]},{\"@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":"Gridsome ile Blog Olu\u015fturma: T\u00fcm Yaz\u0131lar\u0131 Listeleme ve Sayfalama - 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\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/","og_locale":"tr_TR","og_type":"article","og_title":"Gridsome ile Blog Olu\u015fturma: T\u00fcm Yaz\u0131lar\u0131 Listeleme ve Sayfalama","og_description":"Gridsome ile Blog Olu\u015fturma: T\u00fcm Yaz\u0131lar\u0131 Listeleme ve Sayfalama Gridsome, modern web geli\u015ftirmenin en pop\u00fcler yakla\u015f\u0131mlar\u0131ndan biri olan st","og_url":"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-27T02:41:00+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"14 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Gridsome ile Blog Olu\u015fturma: T\u00fcm Yaz\u0131lar\u0131 Listeleme ve Sayfalama","datePublished":"2025-10-27T02:41:00+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/"},"wordCount":1783,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/","url":"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/","name":"Gridsome ile Blog Olu\u015fturma: T\u00fcm Yaz\u0131lar\u0131 Listeleme ve Sayfalama - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-27T02:41:00+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/gridsome-ile-blog-olusturma-tum-yazilari-listeleme-ve-sayfalama\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Gridsome ile Blog Olu\u015fturma: T\u00fcm Yaz\u0131lar\u0131 Listeleme ve Sayfalama"}]},{"@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\/32898","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=32898"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32898\/revisions"}],"predecessor-version":[{"id":32899,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32898\/revisions\/32899"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32898"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32898"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32898"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}