{"id":30307,"date":"2025-09-26T15:42:30","date_gmt":"2025-09-26T12:42:30","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=30307"},"modified":"2025-09-26T15:59:34","modified_gmt":"2025-09-26T12:59:34","slug":"ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/","title":{"rendered":"Ubuntu 14.04&#8217;te Node JS, Sails JS ve Dust JS Kullanarak SPA&#8217;lar (Tek Sayfal\u0131k Uygulamalar) Nas\u0131l Olu\u015fturulur"},"content":{"rendered":"<p><body><\/p>\n<h2>Node.js, Sails.js ve Dust.js ile Tek Sayfa Uygulamalar\u0131 (SPA) Geli\u015ftirme Rehberi (Ubuntu 14.04)<\/h2>\n<p>Tek Sayfa Uygulamalar\u0131 (Single Page Applications &#8211; SPA), modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir. Geleneksel \u00e7ok sayfal\u0131 uygulamalar\u0131n aksine, SPA&#8217;lar t\u00fcm gerekli kaynaklar\u0131 ilk y\u00fcklemede getirerek veya dinamik olarak y\u00fckleyerek kullan\u0131c\u0131ya kesintisiz ve h\u0131zl\u0131 bir deneyim sunar. Bu rehberde, NodeJS ekosisteminin g\u00fc\u00e7l\u00fc bir par\u00e7as\u0131 olan Sails.js framework&#8217;\u00fcn\u00fc ve istemci taraf\u0131 \u015fablonlama i\u00e7in Dust.js&#8217;i kullanarak Ubuntu 14.04 \u00fczerinde nas\u0131l SPA geli\u015ftirece\u011finizi ad\u0131m ad\u0131m \u00f6\u011freneceksiniz. Ubuntu 14.04 her ne kadar eski bir s\u00fcr\u00fcm olsa da, temel prensipler ve kurulum ad\u0131mlar\u0131 daha yeni s\u00fcr\u00fcmler i\u00e7in de benzerlik g\u00f6sterir.<\/p>\n<h3>1. Ortam Kurulumu<\/h3>\n<p>SPA geli\u015ftirmeye ba\u015flamadan \u00f6nce, gerekli ara\u00e7lar\u0131 Ubuntu 14.04 sisteminize kurman\u0131z gerekmektedir.<\/p>\n<h4>1.1 Node.js ve npm Kurulumu<\/h4>\n<p>Node.js, sunucu taraf\u0131 JavaScript \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131d\u0131r ve npm (Node Package Manager) ile birlikte gelir. Sails.js ve Dust.js gibi paketleri kurmak i\u00e7in npm&#8217;e ihtiyac\u0131m\u0131z var. Ubuntu 14.04 i\u00e7in Node.js&#8217;in daha g\u00fcncel bir s\u00fcr\u00fcm\u00fcn\u00fc kurmak i\u00e7in NVM (Node Version Manager) kullanmak en iyi y\u00f6ntemdir.<\/p>\n<pre><code class=\"language-bash\">\r\n<h2>NVM'i indirin ve kurun<\/h2>\r\ncurl -o- https:\/\/raw.githubusercontent.com\/nvm-sh\/nvm\/v0.39.1\/install.sh | bash\r\n\r\n<h2>Terminali yeniden ba\u015flat\u0131n veya a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n<\/h2>\r\nsource ~\/.bashrc\r\n\r\n<h2>Node.js'in en son LTS (Uzun S\u00fcreli Destek) s\u00fcr\u00fcm\u00fcn\u00fc kurun<\/h2>\r\nnvm install --lts\r\n\r\n<h2>Varsay\u0131lan olarak kullanmak i\u00e7in ayarlay\u0131n<\/h2>\r\nnvm use --lts\r\n\r\n<h2>Kurulumu do\u011frulay\u0131n<\/h2>\r\nnode -v\r\nnpm -v\r\n<\/code><\/pre>\n<p>Bu ad\u0131mlar, Node.js ve npm&#8217;in en g\u00fcncel ve kararl\u0131 s\u00fcr\u00fcm\u00fcn\u00fc sisteminize kurman\u0131z\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h4>1.2 Sails.js CLI Kurulumu<\/h4>\n<p>Sails.js, web uygulamalar\u0131n\u0131 h\u0131zla geli\u015ftirmek i\u00e7in tasarlanm\u0131\u015f bir MVC framework&#8217;\u00fcd\u00fcr. Komut sat\u0131r\u0131 aray\u00fcz\u00fc (CLI) ile proje olu\u015fturma, modelleri ve controller&#8217;lar\u0131 y\u00f6netme gibi i\u015flemleri kolayca yapabilirsiniz.<\/p>\n<pre><code class=\"language-bash\">\r\n<h2>Sails.js CLI'\u0131 global olarak kurun<\/h2>\r\nnpm install -g sails@1.x.x # En son 1.x.x s\u00fcr\u00fcm\u00fcn\u00fc kullan\u0131n, \u00f6rne\u011fin 1.5.0\r\n<\/code><\/pre>\n<p>Kurulumdan sonra <code>sails -v<\/code> komutu ile Sails.js s\u00fcr\u00fcm\u00fcn\u00fc kontrol edebilirsiniz.<\/p>\n<h4>1.3 MongoDB Kurulumu (\u0130ste\u011fe Ba\u011fl\u0131 ama \u00d6nerilir)<\/h4>\n<p>\u00c7o\u011fu SPA, veri kal\u0131c\u0131l\u0131\u011f\u0131 i\u00e7in bir veritaban\u0131na ihtiya\u00e7 duyar. Sails.js, \u00e7e\u015fitli veritabanlar\u0131n\u0131 destekler, ancak MongoDB, Node.js ekosistemiyle iyi entegre olan pop\u00fcler bir NoSQL veritaban\u0131d\u0131r.<\/p>\n<pre><code class=\"language-bash\">\r\n<h2>MongoDB public key'ini ekleyin<\/h2>\r\nsudo apt-key adv --keyserver hkp:\/\/keyserver.ubuntu.com:80 --recv 7F0CEB10\r\n\r\n<h2>MongoDB depolar\u0131n\u0131 ekleyin (Ubuntu 14.04 i\u00e7in)<\/h2>\r\necho \"deb http:\/\/repo.mongodb.org\/apt\/ubuntu trusty\/mongodb-org\/3.0 multiverse\" | sudo tee \/etc\/apt\/sources.list.d\/mongodb-org-3.0.list\r\n\r\n<h2>Paket listelerini g\u00fcncelleyin<\/h2>\r\nsudo apt-get update\r\n\r\n<h2>MongoDB'yi kurun<\/h2>\r\nsudo apt-get install -y mongodb-org\r\n\r\n<h2>MongoDB servisini ba\u015flat\u0131n<\/h2>\r\nsudo service mongod start\r\n\r\n<h2>Servisin \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulay\u0131n<\/h2>\r\nsudo service mongod status\r\n<\/code><\/pre>\n<p>Bu ad\u0131mlar, MongoDB 3.0 s\u00fcr\u00fcm\u00fcn\u00fc Ubuntu 14.04&#8217;e kuracakt\u0131r. Daha yeni MongoDB s\u00fcr\u00fcmleri i\u00e7in farkl\u0131 depo konfig\u00fcrasyonlar\u0131 gerekebilir.<\/p>\n<h3>2. Sails.js Projesi Olu\u015fturma ve Temel Yap\u0131land\u0131rma<\/h3>\n<p>\u015eimdi Sails.js projemizi olu\u015fturabilir ve Dust.js&#8217;i view engine olarak yap\u0131land\u0131rabiliriz.<\/p>\n<h4>2.1 Yeni Sails.js Projesi Olu\u015fturma<\/h4>\n<p>Terminalinizde projenizi olu\u015fturmak istedi\u011finiz dizine gidin ve a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">\r\nsails new my-spa-app --no-frontend\r\ncd my-spa-app\r\n<\/code><\/pre>\n<p><code>--no-frontend<\/code> bayra\u011f\u0131, Sails.js&#8217;in varsay\u0131lan olarak gelen \u00f6ny\u00fcz \u015fablonlar\u0131n\u0131 (\u00f6rn. EJS, Grunt\/Gulp) kurmas\u0131n\u0131 engeller. \u00c7\u00fcnk\u00fc biz Dust.js ve kendi \u00f6n y\u00fcz yakla\u015f\u0131m\u0131m\u0131z\u0131 kullanaca\u011f\u0131z.<\/p>\n<h4>2.2 Dust.js&#8217;i View Engine Olarak Ayarlama<\/h4>\n<p>Sails.js, varsay\u0131lan olarak EJS&#8217;i view engine olarak kullan\u0131r. Dust.js&#8217;i kullanmak i\u00e7in \u00f6nce paketi kurmal\u0131 ve ard\u0131ndan <code>config\/views.js<\/code> dosyas\u0131n\u0131 d\u00fczenlemeliyiz.<\/p>\n<pre><code class=\"language-bash\">\r\nnpm install consolidate dustjs-linkedin dustjs-helpers --save\r\n<\/code><\/pre>\n<p>\u015eimdi <code>config\/views.js<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve i\u00e7eri\u011fini a\u015fa\u011f\u0131daki gibi g\u00fcncelleyin:<\/p>\n<pre><code class=\"language-javascript\">\r\n\/\/ config\/views.js\r\nmodule.exports.views = {\r\n  engine: require('consolidate').dust,\r\n  layout: 'layouts\/layout', \/\/ T\u00fcm sayfalar i\u00e7in ana layout dosyas\u0131\r\n  extension: 'dust',\r\n  partials: require('path').resolve(__dirname, '..', 'views', 'partials')\r\n};\r\n<\/code><\/pre>\n<p>Bu yap\u0131land\u0131rma, Sails.js&#8217;e <code>.dust<\/code> uzant\u0131l\u0131 dosyalar\u0131 Dust.js ile derlemesini ve <code>views\/layouts\/layout.dust<\/code> dosyas\u0131n\u0131 ana \u015fablon olarak kullanmas\u0131n\u0131 s\u00f6yler. <code>partials<\/code> ayar\u0131, Dust.js&#8217;in par\u00e7al\u0131 \u015fablonlar\u0131 nerede arayaca\u011f\u0131n\u0131 belirtir.<\/p>\n<h4>2.3 Temel Rota ve Controller Olu\u015fturma<\/h4>\n<p>SPA&#8217;lar genellikle tek bir ana giri\u015f noktas\u0131na sahiptir. Bu giri\u015f noktas\u0131, uygulaman\u0131n kabu\u011funu (shell) ve ilk g\u00f6r\u00fcn\u00fcm\u00fc y\u00fckler.<\/p>\n<p><code>config\/routes.js<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve basit bir ana sayfa rotas\u0131 tan\u0131mlay\u0131n:<\/p>\n<pre><code class=\"language-javascript\">\r\n\/\/ config\/routes.js\r\nmodule.exports.routes = {\r\n  '\/': {\r\n    view: 'pages\/homepage' \/\/ Bu, views\/pages\/homepage.dust dosyas\u0131n\u0131 \u00e7a\u011f\u0131racak\r\n  },\r\n\r\n  \/\/ API rotalar\u0131n\u0131z buraya gelecek\r\n  'GET \/api\/products': 'ProductController.find',\r\n  'POST \/api\/products': 'ProductController.create'\r\n};\r\n<\/code><\/pre>\n<p>\u015eimdi <code>views\/pages\/<\/code> dizini alt\u0131nda <code>homepage.dust<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-html\">\r\n<!-- views\/pages\/homepage.dust -->\r\n<div id=\"app-root\">\r\n  <h1>Ho\u015f Geldiniz!<\/h1>\r\n  <p>Bu sizin Tek Sayfa Uygulaman\u0131z\u0131n ana sayfas\u0131d\u0131r.<\/p>\r\n  <!-- Uygulaman\u0131z\u0131n di\u011fer bile\u015fenleri buraya y\u00fcklenecek -->\r\n<\/div>\r\n\r\n<!-- \u0130stemci taraf\u0131 JavaScript'inizi buraya dahil edin -->\r\n<script src=\"\/js\/main.js\"><\/script>\r\n<\/code><\/pre>\n<p>Ve bir ana layout dosyas\u0131 olu\u015ftural\u0131m: <code>views\/layouts\/layout.dust<\/code>.<\/p>\n<pre><code class=\"language-html\">\r\n<!-- views\/layouts\/layout.dust -->\r\n<!DOCTYPE html>\r\n<html lang=\"tr\">\r\n<head>\r\n  <meta charset=\"UTF-8\">\r\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n  <title>My Sails.js SPA<\/title>\r\n  <!-- CSS dosyalar\u0131n\u0131z\u0131 buraya ekleyin -->\r\n  <link rel=\"stylesheet\" href=\"\/styles\/main.css\">\r\n<\/head>\r\n<body>\r\n  <!-- Header, Navigasyon gibi sabit k\u0131s\u0131mlar buraya gelebilir -->\r\n  {+body \/} <!-- Sails.js view i\u00e7eri\u011fi buraya render edilecek -->\r\n  <!-- Footer veya global script'ler buraya gelebilir -->\r\n<\/body>\r\n<\/html>\r\n<\/code><\/pre>\n<p>Uygulaman\u0131z\u0131 ba\u015flatmak i\u00e7in <code>sails lift<\/code> komutunu kullan\u0131n. Taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost:1337<\/code> adresine giderek ana sayfan\u0131z\u0131 g\u00f6rebilirsiniz.<\/p>\n<h3>3. Dust.js ile SPA \u015eablonlar\u0131 Olu\u015fturma<\/h3>\n<p>Dust.js, h\u0131zl\u0131 ve esnek bir istemci taraf\u0131 \u015fablonlama motorudur. Sunucu taraf\u0131nda ilk y\u00fcklemeyi yaparken ve daha sonra istemci taraf\u0131nda AJAX ile \u00e7ekilen verileri dinamik olarak render etmek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h4>3.1 Dust.js Temel S\u00f6zdizimi<\/h4>\n<p>Dust.js&#8217;in temel yap\u0131 ta\u015flar\u0131 \u015funlard\u0131r:<br \/>\n*   <code>{key}<\/code>: Veri nesnesindeki bir anahtar\u0131n de\u011ferini g\u00f6sterir.<br \/>\n*   <code>{#section} ... {\/section}<\/code>: Bir dizi veya nesne \u00fczerinde d\u00f6ng\u00fc yapar veya bir de\u011ferin varl\u0131\u011f\u0131n\u0131 kontrol eder.<br \/>\n*   <code>{^section} ... {\/section}<\/code>: <code>{#section}<\/code>&#8216;\u0131n tersi, de\u011fer yoksa \u00e7al\u0131\u015f\u0131r.<br \/>\n*   <code>{>partial}<\/code>: Ba\u015fka bir Dust \u015fablonunu (par\u00e7al\u0131) dahil eder.<br \/>\n*   <code>{?helper args \/}<\/code>: Yard\u0131mc\u0131 fonksiyonlar\u0131 \u00e7a\u011f\u0131r\u0131r.<\/p>\n<h4>3.2 \u0130stemci Taraf\u0131 Render Etme<\/h4>\n<p>SPA&#8217;lar\u0131n g\u00fcc\u00fc, sayfan\u0131n tamam\u0131n\u0131 yeniden y\u00fcklemeden i\u00e7eri\u011fi dinamik olarak g\u00fcncelleyebilmesidir. Bunu Dust.js ile yapmak i\u00e7in:<\/p>\n<p>1.  <strong>Dust \u015eablonlar\u0131n\u0131 \u00d6n Derleme (Pre-compilation):<\/strong> Dust \u015fablonlar\u0131n\u0131z\u0131 sunucu taraf\u0131nda JavaScript fonksiyonlar\u0131na derleyip istemciye g\u00f6ndermek en performansl\u0131 y\u00f6ntemdir. Bunun i\u00e7in bir build arac\u0131 (Webpack, Gulp) kullanabilirsiniz.<br \/>\n2.  <strong>AJAX ile Veri \u00c7ekme:<\/strong> \u0130stemci taraf\u0131nda JavaScript kullanarak Sails.js API endpoint&#8217;lerinizden veri \u00e7ekin.<br \/>\n3.  <strong>Dust ile Render Etme:<\/strong> \u00c7ekilen veriyi \u00f6nceden derlenmi\u015f Dust \u015fablonunuzla birle\u015ftirerek HTML olu\u015fturun ve DOM&#8217;a ekleyin.<\/p>\n<p>Basit bir \u00f6rnek i\u00e7in, <code>assets\/js\/main.js<\/code> dosyas\u0131n\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-javascript\">\r\n\/\/ assets\/js\/main.js\r\n\r\n\/\/ Dust \u015fablonlar\u0131n\u0131 client-side kullanmak i\u00e7in Dust.js k\u00fct\u00fcphanesini dahil etmeniz gerekir.\r\n\/\/ \u00d6rne\u011fin, <script src=\"\/js\/dust-full.min.js\"><\/script> ile layout.dust i\u00e7inde ekleyebilirsiniz.\r\n\r\ndocument.addEventListener('DOMContentLoaded', function() {\r\n  const appRoot = document.getElementById('app-root');\r\n\r\n  function loadProducts() {\r\n    fetch('\/api\/products') \/\/ API'den \u00fcr\u00fcn verilerini \u00e7ek\r\n      .then(response => response.json())\r\n      .then(products => {\r\n        \/\/ \u00dcr\u00fcn listesi i\u00e7in bir Dust \u015fablonu olu\u015ftural\u0131m (\u00f6rne\u011fin, views\/partials\/product-list.dust)\r\n        \/\/ Bu \u015fablonun client-side'da derlenmi\u015f olmas\u0131 veya Dust.load() ile y\u00fcklenmesi gerekir.\r\n\r\n        \/\/ Basit bir \u00f6rnek i\u00e7in \u015fablonu do\u011frudan string olarak tan\u0131mlayal\u0131m.\r\n        \/\/ Ger\u00e7ek projede bir build ad\u0131m\u0131yla \u00f6n derlenmi\u015f \u015fablonlar\u0131 kullan\u0131rd\u0131n\u0131z.\r\n        const productListTemplate = <code>\r\n          <h2>\u00dcr\u00fcn Listesi<\/h2>\r\n          {#products}\r\n            <div class=\"product-item\">\r\n              <h3>{name}<\/h3>\r\n              <p>Fiyat: {price} TL<\/p>\r\n            <\/div>\r\n          {\/products}\r\n          {^products}\r\n            <p>Hen\u00fcz \u00fcr\u00fcn bulunmamaktad\u0131r.<\/p>\r\n          {\/products}\r\n        <\/code>;\r\n\r\n        \/\/ Dust \u015fablonunu derle ve render et\r\n        \/\/ Normalde bu ad\u0131m\u0131 bir build s\u00fcreci yapar ve Dust.render(templateName, data, callback) \u00e7a\u011f\u0131r\u0131rs\u0131n\u0131z.\r\n        \/\/ Basitlik ad\u0131na, direkt string \u015fablonu derleyip render edelim.\r\n        dust.loadSource(dust.compile(productListTemplate, 'product-list'));\r\n        dust.render('product-list', { products: products }, function(err, out) {\r\n          if (err) {\r\n            console.error('Dust rendering error:', err);\r\n            return;\r\n          }\r\n          appRoot.innerHTML = out; \/\/ Yeni i\u00e7eri\u011fi sayfaya ekle\r\n        });\r\n      })\r\n      .catch(error => console.error('Error fetching products:', error));\r\n  }\r\n\r\n  \/\/ Uygulama y\u00fcklendi\u011finde \u00fcr\u00fcnleri getir\r\n  loadProducts();\r\n\r\n  \/\/ Y\u00f6nlendirme (Routing) Mant\u0131\u011f\u0131:\r\n  \/\/ SPA'lar genellikle taray\u0131c\u0131 ge\u00e7mi\u015fi API'sini (pushState) kullanarak URL'yi de\u011fi\u015ftirir\r\n  \/\/ ve ilgili bile\u015fenleri y\u00fckler. Basitlik ad\u0131na bu \u00f6rnekte sadece AJAX ile veri \u00e7ekme g\u00f6sterilmi\u015ftir.\r\n  \/\/ Ger\u00e7ek bir SPA'da bir client-side router (\u00f6rn. Page.js, Vue Router, React Router) kullan\u0131rs\u0131n\u0131z.\r\n});\r\n<\/code><\/pre>\n<p>Bu <code>main.js<\/code> dosyas\u0131n\u0131n \u00e7al\u0131\u015fabilmesi i\u00e7in Dust.js k\u00fct\u00fcphanesini <code>layout.dust<\/code> i\u00e7inde HTML&#8217;inize dahil etmeniz gerekir:<\/p>\n<pre><code class=\"language-html\">\r\n<!-- views\/layouts\/layout.dust -->\r\n...\r\n<body>\r\n  ...\r\n  <script src=\"\/js\/dependencies\/dust-full.min.js\"><\/script> <!-- Dust.js k\u00fct\u00fcphanesi -->\r\n  <script src=\"\/js\/main.js\"><\/script> <!-- Kendi SPA logic'iniz -->\r\n<\/body>\r\n<\/html>\r\n<\/code><\/pre>\n<p><code>dust-full.min.js<\/code> dosyas\u0131n\u0131 <code>assets\/js\/dependencies\/<\/code> klas\u00f6r\u00fcne kopyalaman\u0131z gerekecektir.<\/p>\n<h3>4. API Geli\u015ftirme ve Veri Y\u00f6netimi<\/h3>\n<p>SPA&#8217;lar, backend&#8217;den veri almak ve g\u00f6ndermek i\u00e7in RESTful API&#8217;lere g\u00fcvenir. Sails.js, model ve controller katmanlar\u0131 ile g\u00fc\u00e7l\u00fc bir API geli\u015ftirme yetene\u011fi sunar.<\/p>\n<h4>4.1 Sails.js Modelleri<\/h4>\n<p>Sails.js modelleri, veritaban\u0131 tablolar\u0131n\u0131za veya koleksiyonlar\u0131n\u0131za kar\u015f\u0131l\u0131k gelir.<\/p>\n<pre><code class=\"language-bash\">\r\nsails generate model Product name:string price:number description:string\r\n<\/code><\/pre>\n<p>Bu komut <code>api\/models\/Product.js<\/code> dosyas\u0131n\u0131 olu\u015fturacakt\u0131r:<\/p>\n<pre><code class=\"language-javascript\">\r\n\/\/ api\/models\/Product.js\r\nmodule.exports = {\r\n  attributes: {\r\n    name: { type: 'string', required: true },\r\n    price: { type: 'number', defaultsTo: 0 },\r\n    description: { type: 'string' }\r\n  },\r\n  \/\/ Veritaban\u0131 ba\u011flant\u0131s\u0131 i\u00e7in config\/datastores.js'i kontrol edin\r\n  \/\/ Varsay\u0131lan olarak development ortam\u0131nda diskdb (file-based) kullan\u0131r.\r\n  \/\/ MongoDB i\u00e7in config\/datastores.js'te bir 'mongo' ba\u011flant\u0131s\u0131 tan\u0131mlaman\u0131z gerekir.\r\n  \/\/ \u00d6rne\u011fin:\r\n  \/\/ mongo: {\r\n  \/\/   adapter: 'sails-mongo',\r\n  \/\/   url: 'mongodb:\/\/localhost:27017\/my-spa-db'\r\n  \/\/ }\r\n};\r\n<\/code><\/pre>\n<p><code>config\/datastores.js<\/code> dosyas\u0131n\u0131 a\u00e7arak MongoDB ba\u011flant\u0131s\u0131n\u0131 yap\u0131land\u0131rabilirsiniz. <code>npm install sails-mongo --save<\/code> komutu ile MongoDB adapt\u00f6r\u00fcn\u00fc kurmay\u0131 unutmay\u0131n.<\/p>\n<h4>4.2 Sails.js Controller&#8217;lar\u0131 ve API Endpoint&#8217;leri<\/h4>\n<p>Controller&#8217;lar, gelen HTTP isteklerini i\u015fler ve model ile etkile\u015fime girerek veritaban\u0131 i\u015flemlerini yapar.<\/p>\n<pre><code class=\"language-bash\">\r\nsails generate controller Product find create update delete\r\n<\/code><\/pre>\n<p>Bu komut <code>api\/controllers\/ProductController.js<\/code> dosyas\u0131n\u0131 olu\u015fturur. \u0130\u00e7eri\u011fini a\u015fa\u011f\u0131daki gibi g\u00fcncelleyelim:<\/p>\n<pre><code class=\"language-javascript\">\r\n\/\/ api\/controllers\/ProductController.js\r\nmodule.exports = {\r\n\r\n  \/\/ T\u00fcm \u00fcr\u00fcnleri listele\r\n  find: async function (req, res) {\r\n    try {\r\n      const products = await Product.find();\r\n      return res.json(products);\r\n    } catch (err) {\r\n      return res.serverError(err);\r\n    }\r\n  },\r\n\r\n  \/\/ Yeni \u00fcr\u00fcn olu\u015ftur\r\n  create: async function (req, res) {\r\n    try {\r\n      const newProduct = await Product.create(req.body).fetch();\r\n      return res.status(201).json(newProduct);\r\n    } catch (err) {\r\n      return res.serverError(err);\r\n    }\r\n  },\r\n\r\n  \/\/ \u00dcr\u00fcn g\u00fcncelle\r\n  update: async function (req, res) {\r\n    try {\r\n      const updatedProduct = await Product.updateOne({ id: req.params.id }).set(req.body);\r\n      if (!updatedProduct) {\r\n        return res.notFound('\u00dcr\u00fcn bulunamad\u0131.');\r\n      }\r\n      return res.json(updatedProduct);\r\n    } catch (err) {\r\n      return res.serverError(err);\r\n    }\r\n  },\r\n\r\n  \/\/ \u00dcr\u00fcn sil\r\n  delete: async function (req, res) {\r\n    try {\r\n      const deletedProduct = await Product.destroyOne({ id: req.params.id });\r\n      if (!deletedProduct) {\r\n        return res.notFound('\u00dcr\u00fcn bulunamad\u0131.');\r\n      }\r\n      return res.ok('\u00dcr\u00fcn ba\u015far\u0131yla silindi.');\r\n    } catch (err) {\r\n      return res.serverError(err);\r\n    }\r\n  }\r\n};\r\n<\/code><\/pre>\n<p><code>config\/routes.js<\/code> i\u00e7inde API rotalar\u0131n\u0131 tan\u0131mlad\u0131\u011f\u0131m\u0131zdan emin olun:<\/p>\n<pre><code class=\"language-javascript\">\r\n\/\/ config\/routes.js\r\nmodule.exports.routes = {\r\n  \/\/ ... di\u011fer rotalar\r\n  'GET \/api\/products': 'ProductController.find',\r\n  'POST \/api\/products': 'ProductController.create',\r\n  'PUT \/api\/products\/:id': 'ProductController.update',\r\n  'DELETE \/api\/products\/:id': 'ProductController.delete'\r\n};\r\n<\/code><\/pre>\n<p>Art\u0131k istemci taraf\u0131nda (\u00f6rne\u011fin <code>assets\/js\/main.js<\/code> i\u00e7inde) bu API endpoint&#8217;lerini kullanarak \u00fcr\u00fcn verilerini \u00e7ekebilir, g\u00f6nderebilir ve g\u00fcncelleyebilirsiniz.<\/p>\n<h3>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p>Bu rehberde, Ubuntu 14.04 \u00fczerinde Node.js, Sails.js ve Dust.js kullanarak temel bir Tek Sayfa Uygulamas\u0131 (SPA) geli\u015ftirme ad\u0131mlar\u0131n\u0131 \u00f6\u011frendiniz. Ortam kurulumundan, Sails.js proje yap\u0131s\u0131na, Dust.js ile \u015fablonlamaya ve API geli\u015ftirmeye kadar bir\u00e7ok konuya de\u011findik. Bu temel bilgilerle kendi karma\u015f\u0131k SPA&#8217;lar\u0131n\u0131z\u0131 in\u015fa etmeye ba\u015flayabilirsiniz.<\/p>\n<h4>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h4>\n<p><strong>1. Neden Dust.js? Alternatifleri nelerdir?<\/strong><br \/>\nDust.js, h\u0131zl\u0131, hafif ve hem sunucu hem de istemci taraf\u0131nda \u00e7al\u0131\u015fabilen bir \u015fablonlama motorudur. \u00d6zellikle b\u00fcy\u00fck uygulamalarda performans avantaj\u0131 sa\u011flayabilir. Alternatif olarak EJS, Handlebars, Pug (eski ad\u0131yla Jade) veya React, Vue, Angular gibi modern frontend framework&#8217;lerinin kendi bile\u015fen tabanl\u0131 yakla\u015f\u0131mlar\u0131 kullan\u0131labilir. Dust.js, daha &#8220;geleneksel&#8221; bir \u015fablonlama motoru arayanlar i\u00e7in iyi bir se\u00e7enektir.<\/p>\n<p><strong>2. Sails.js&#8217;in avantajlar\u0131 nelerdir?<\/strong><br \/>\nSails.js, Ruby on Rails&#8217;den esinlenmi\u015f, h\u0131zl\u0131 geli\u015ftirme i\u00e7in tasarlanm\u0131\u015f bir MVC framework&#8217;\u00fcd\u00fcr. Otomatik API olu\u015fturma (blueprint API&#8217;ler), g\u00fc\u00e7l\u00fc ORM (Waterline), ger\u00e7ek zamanl\u0131 WebSockets entegrasyonu, dosya tabanl\u0131 yap\u0131land\u0131rma ve geni\u015fletilebilir yap\u0131s\u0131 gibi avantajlar\u0131 vard\u0131r. \u00d6zellikle RESTful API&#8217;ler ve ger\u00e7ek zamanl\u0131 uygulamalar geli\u015ftirmek i\u00e7in idealdir.<\/p>\n<p><strong>3. SPA&#8217;da SEO nas\u0131l yap\u0131l\u0131r?<\/strong><br \/>\nSPA&#8217;lar\u0131n geleneksel web sitelerine g\u00f6re SEO konusunda baz\u0131 zorluklar\u0131 vard\u0131r \u00e7\u00fcnk\u00fc i\u00e7erik genellikle JavaScript ile dinamik olarak y\u00fcklenir ve arama motoru botlar\u0131 bunu her zaman do\u011fru bir \u015fekilde indeksleyemeyebilir. \u00c7\u00f6z\u00fcmler aras\u0131nda sunucu taraf\u0131 render (SSR), \u00f6n render (prerendering) veya dinamik render (dynamic rendering) gibi teknikler bulunur. Sails.js ile SSR yapmak, Dust.js \u015fablonlar\u0131n\u0131 sunucuda derleyip direkt HTML olarak g\u00f6ndermekle m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<p><strong>4. Ubuntu 14.04 yerine daha yeni bir s\u00fcr\u00fcm kullanabilir miyim?<\/strong><br \/>\nKesinlikle evet. Ubuntu 14.04 art\u0131k uzun s\u00fcreli destek almamaktad\u0131r ve g\u00fcvenlik riskleri ta\u015f\u0131yabilir. Bu rehberdeki temel prensipler ve komutlar, Ubuntu 16.04, 18.04, 20.04 veya 22.04 gibi daha yeni s\u00fcr\u00fcmlerde de ge\u00e7erlidir. Sadece Node.js ve MongoDB kurulum ad\u0131mlar\u0131, i\u015fletim sistemi s\u00fcr\u00fcm\u00fcne g\u00f6re k\u00fc\u00e7\u00fck farkl\u0131l\u0131klar g\u00f6sterebilir.<\/p>\n<p><strong>5. Projeyi da\u011f\u0131tmak (deployment) i\u00e7in ne yapmal\u0131y\u0131m?<\/strong><br \/>\nSails.js projenizi da\u011f\u0131tmak i\u00e7in genellikle bir VPS (Virtual Private Server) veya bir PaaS (Platform as a Service) sa\u011flay\u0131c\u0131s\u0131 (\u00f6rn. Heroku, DigitalOcean App Platform) kullan\u0131rs\u0131n\u0131z. Da\u011f\u0131t\u0131m ad\u0131mlar\u0131 \u015funlar\u0131 i\u00e7erir:<br \/>\n*   Sunucunuza Node.js ve npm kurmak.<br \/>\n*   Proje dosyalar\u0131n\u0131z\u0131 sunucuya aktarmak (git clone veya SFTP).<br \/>\n*   <code>npm install<\/code> ile ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fcklemek.<br \/>\n*   <code>NODE_ENV=production sails lift<\/code> komutuyla uygulamay\u0131 \u00fcretim modunda ba\u015flatmak.<br \/>\n*   PM2 gibi bir s\u00fcre\u00e7 y\u00f6neticisi kullanarak uygulaman\u0131n s\u00fcrekli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamak.<br \/>\n*   Nginx veya Apache gibi bir ters proxy (reverse proxy) kullanarak gelen istekleri Sails.js uygulaman\u0131za y\u00f6nlendirmek.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Node.js, Sails.js ve Dust.js ile Tek Sayfa Uygulamalar\u0131 (SPA) Geli\u015ftirme Rehberi (Ubuntu 14.04)\nTek Sayfa Uygulamalar\u0131 (Single Page Applications","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":[1468],"tags":[],"class_list":{"0":"post-30307","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ubuntu","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>Ubuntu 14.04&#039;te Node JS, Sails JS ve Dust JS Kullanarak SPA&#039;lar (Tek Sayfal\u0131k Uygulamalar) Nas\u0131l Olu\u015fturulur - 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\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ubuntu 14.04&#039;te Node JS, Sails JS ve Dust JS Kullanarak SPA&#039;lar (Tek Sayfal\u0131k Uygulamalar) Nas\u0131l Olu\u015fturulur\" \/>\n<meta property=\"og:description\" content=\"Node.js, Sails.js ve Dust.js ile Tek Sayfa Uygulamalar\u0131 (SPA) Geli\u015ftirme Rehberi (Ubuntu 14.04)  Tek Sayfa Uygulamalar\u0131 (Single Page Applications\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-26T12:42:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-26T12:59:34+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=\"7 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Ubuntu 14.04&#8217;te Node JS, Sails JS ve Dust JS Kullanarak SPA&#8217;lar (Tek Sayfal\u0131k Uygulamalar) Nas\u0131l Olu\u015fturulur\",\"datePublished\":\"2025-09-26T12:42:30+00:00\",\"dateModified\":\"2025-09-26T12:59:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/\"},\"wordCount\":1476,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Ubuntu\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/\",\"name\":\"Ubuntu 14.04'te Node JS, Sails JS ve Dust JS Kullanarak SPA'lar (Tek Sayfal\u0131k Uygulamalar) Nas\u0131l Olu\u015fturulur - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-09-26T12:42:30+00:00\",\"dateModified\":\"2025-09-26T12:59:34+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ubuntu 14.04&#8217;te Node JS, Sails JS ve Dust JS Kullanarak SPA&#8217;lar (Tek Sayfal\u0131k Uygulamalar) Nas\u0131l Olu\u015fturulur\"}]},{\"@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":"Ubuntu 14.04'te Node JS, Sails JS ve Dust JS Kullanarak SPA'lar (Tek Sayfal\u0131k Uygulamalar) Nas\u0131l Olu\u015fturulur - 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\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/","og_locale":"tr_TR","og_type":"article","og_title":"Ubuntu 14.04'te Node JS, Sails JS ve Dust JS Kullanarak SPA'lar (Tek Sayfal\u0131k Uygulamalar) Nas\u0131l Olu\u015fturulur","og_description":"Node.js, Sails.js ve Dust.js ile Tek Sayfa Uygulamalar\u0131 (SPA) Geli\u015ftirme Rehberi (Ubuntu 14.04)  Tek Sayfa Uygulamalar\u0131 (Single Page Applications","og_url":"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-09-26T12:42:30+00:00","article_modified_time":"2025-09-26T12:59:34+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"7 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Ubuntu 14.04&#8217;te Node JS, Sails JS ve Dust JS Kullanarak SPA&#8217;lar (Tek Sayfal\u0131k Uygulamalar) Nas\u0131l Olu\u015fturulur","datePublished":"2025-09-26T12:42:30+00:00","dateModified":"2025-09-26T12:59:34+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/"},"wordCount":1476,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Ubuntu"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/","url":"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/","name":"Ubuntu 14.04'te Node JS, Sails JS ve Dust JS Kullanarak SPA'lar (Tek Sayfal\u0131k Uygulamalar) Nas\u0131l Olu\u015fturulur - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-09-26T12:42:30+00:00","dateModified":"2025-09-26T12:59:34+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-14-04te-node-js-sails-js-ve-dust-js-kullanarak-spalar-tek-sayfalik-uygulamalar-nasil-olusturulur\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ubuntu 14.04&#8217;te Node JS, Sails JS ve Dust JS Kullanarak SPA&#8217;lar (Tek Sayfal\u0131k Uygulamalar) Nas\u0131l Olu\u015fturulur"}]},{"@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\/30307","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=30307"}],"version-history":[{"count":2,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30307\/revisions"}],"predecessor-version":[{"id":30309,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30307\/revisions\/30309"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=30307"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=30307"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=30307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}