{"id":32350,"date":"2025-10-20T19:41:19","date_gmt":"2025-10-20T16:41:19","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=32350"},"modified":"2025-10-20T19:41:19","modified_gmt":"2025-10-20T16:41:19","slug":"angular-ve-electron-ile-baslangic","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/","title":{"rendered":"Angular ve Electron ile Ba\u015flang\u0131\u00e7"},"content":{"rendered":"<p><body><\/p>\n<h2>Angular ve Electron ile Ba\u015flang\u0131\u00e7<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz masa\u00fcst\u00fc uygulama geli\u015ftirme d\u00fcnyas\u0131nda, web teknolojilerinin g\u00fcc\u00fcn\u00fc ve esnekli\u011fini masa\u00fcst\u00fcne ta\u015f\u0131mak, geli\u015ftiriciler i\u00e7in giderek daha cazip hale gelmektedir. Bu yakla\u015f\u0131m\u0131n en pop\u00fcler temsilcilerinden biri de <a href=\"https:\/\/www.electronjs.org\/\" target=\"_blank\" rel=\"noopener\">Electron<\/a>&#8216;dur. Electron, web teknolojileri (HTML, CSS, JavaScript) kullanarak platformlar aras\u0131 masa\u00fcst\u00fc uygulamalar\u0131 geli\u015ftirmenize olanak tan\u0131r. Modern ve g\u00fc\u00e7l\u00fc bir \u00f6n u\u00e7 (frontend) framework&#8217;\u00fc olan <a href=\"https:\/\/angular.io\/\" target=\"_blank\" rel=\"noopener\">Angular<\/a> ile Electron&#8217;u birle\u015ftirmek ise, zengin kullan\u0131c\u0131 aray\u00fczleri ve karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131na sahip, performansl\u0131 masa\u00fcst\u00fc uygulamalar\u0131 olu\u015fturman\u0131n kap\u0131lar\u0131n\u0131 aralar.<\/p>\n<p>Bu makalede, Angular ve Electron&#8217;u kullanarak s\u0131f\u0131rdan bir masa\u00fcst\u00fc uygulamas\u0131 geli\u015ftirmeye ba\u015flayaca\u011f\u0131z. Temel kurulumdan, iki teknolojiyi bir araya getirmeye, geli\u015ftirme s\u00fcrecini iyile\u015ftirmeye ve hatta Angular uygulaman\u0131z ile Electron&#8217;un ana s\u00fcre\u00e7leri aras\u0131nda nas\u0131l ileti\u015fim kurulaca\u011f\u0131na kadar bir\u00e7ok konuyu ad\u0131m ad\u0131m ele alaca\u011f\u0131z. Amac\u0131m\u0131z, web geli\u015ftirme bilginizi masa\u00fcst\u00fc d\u00fcnyas\u0131na ta\u015f\u0131man\u0131z i\u00e7in size sa\u011flam bir temel sunmakt\u0131r.<\/p>\n<h2>Neden Angular ve Electron?<\/h2>\n<p>Angular ve Electron&#8217;un birle\u015fimi, geli\u015ftiricilere bir dizi \u00f6nemli avantaj sunar:<\/p>\n<ul>\n<li>\n<h3>Platformlar Aras\u0131 Uyumluluk<\/h3>\n<p>Electron, uygulaman\u0131z\u0131 Windows, macOS ve Linux gibi farkl\u0131 i\u015fletim sistemlerinde tek bir kod taban\u0131yla \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131r. Bu, geli\u015ftirme maliyetlerini d\u00fc\u015f\u00fcr\u00fcr ve pazar eri\u015fiminizi geni\u015fletir. Angular ile olu\u015fturulan web uygulamalar\u0131 da do\u011fal olarak platformdan ba\u011f\u0131ms\u0131zd\u0131r, bu da bu iki teknolojinin uyumunu art\u0131r\u0131r.<\/p>\n<\/li>\n<li>\n<h3>Web Teknolojilerinin G\u00fcc\u00fc<\/h3>\n<p>HTML, CSS ve JavaScript (TypeScript) gibi web standartlar\u0131n\u0131 kullanarak masa\u00fcst\u00fc uygulamalar\u0131 geli\u015ftirmek, web geli\u015ftiricilerinin mevcut bilgi birikimlerini do\u011frudan kullanmalar\u0131n\u0131 sa\u011flar. Bu, \u00f6\u011frenme e\u011frisini azalt\u0131r ve geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r. Angular&#8217;\u0131n bile\u015fen tabanl\u0131 mimarisi, mod\u00fcler yap\u0131s\u0131 ve g\u00fc\u00e7l\u00fc veri ba\u011flama yetenekleri, karma\u015f\u0131k kullan\u0131c\u0131 aray\u00fczlerini kolayca olu\u015fturman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<\/li>\n<li>\n<h3>Zengin Kullan\u0131c\u0131 Deneyimi<\/h3>\n<p>Angular, dinamik ve interaktif kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmak i\u00e7in g\u00fc\u00e7l\u00fc ara\u00e7lar sunar. Electron ise, Chromium&#8217;un rendering motorunu kullanarak bu aray\u00fczleri masa\u00fcst\u00fc ortam\u0131nda, taray\u0131c\u0131 k\u0131s\u0131tlamalar\u0131 olmadan, y\u00fcksek performansla \u00e7al\u0131\u015ft\u0131rma yetene\u011fi sa\u011flar. Bu sayede, taray\u0131c\u0131 tabanl\u0131 uygulamalardan \u00e7ok daha zengin ve entegre bir masa\u00fcst\u00fc deneyimi sunabilirsiniz.<\/p>\n<\/li>\n<li>\n<h3>Node.js Entegrasyonu<\/h3>\n<p>Electron, Node.js \u00e7al\u0131\u015fma zaman\u0131n\u0131 (runtime) i\u00e7inde bar\u0131nd\u0131r\u0131r. Bu, Electron uygulamalar\u0131n\u0131n dosya sistemi eri\u015fimi, i\u015fletim sistemi etkile\u015fimi ve a\u011f i\u015flemleri gibi Node.js mod\u00fcllerini kullanabilece\u011fi anlam\u0131na gelir. Angular uygulaman\u0131z\u0131n taray\u0131c\u0131da yapamayaca\u011f\u0131 bir\u00e7ok i\u015flemi (\u00f6rne\u011fin, yerel dosya okuma\/yazma, sistem bildirimleri g\u00f6nderme) Electron sayesinde ger\u00e7ekle\u015ftirebilirsiniz.<\/p>\n<\/li>\n<li>\n<h3>Geni\u015f Ekosistem ve Topluluk Deste\u011fi<\/h3>\n<p>Hem Angular hem de Electron, geni\u015f ve aktif geli\u015ftirici topluluklar\u0131na sahiptir. Bu, sorun ya\u015fad\u0131\u011f\u0131n\u0131zda veya yeni \u00f6zellikler eklemek istedi\u011finizde kolayca destek bulabilece\u011finiz anlam\u0131na gelir. Ayr\u0131ca, her iki teknoloji i\u00e7in de zengin k\u00fct\u00fcphane ve ara\u00e7 ekosistemi mevcuttur.<\/p>\n<\/li>\n<\/ul>\n<h2>\u00d6n Ko\u015fullar<\/h2>\n<p>Bu makaledeki ad\u0131mlar\u0131 takip edebilmek i\u00e7in bilgisayar\u0131n\u0131zda a\u015fa\u011f\u0131daki yaz\u0131l\u0131mlar\u0131n kurulu olmas\u0131 gerekmektedir:<\/p>\n<ul>\n<li>\n<h3>Node.js ve npm<\/h3>\n<p>Angular CLI ve Electron&#8217;u \u00e7al\u0131\u015ft\u0131rmak i\u00e7in Node.js ve paket y\u00f6neticisi npm&#8217;e ihtiyac\u0131n\u0131z olacak. Node.js&#8217;i resmi web sitesinden (<a href=\"https:\/\/nodejs.org\/\" target=\"_blank\" rel=\"noopener\">nodejs.org<\/a>) indirebilirsiniz. Kurulumla birlikte npm de otomatik olarak kurulacakt\u0131r. Kurulum sonras\u0131 terminalinizde <code>node -v<\/code> ve <code>npm -v<\/code> komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rarak s\u00fcr\u00fcmleri kontrol edebilirsiniz.<\/p>\n<\/li>\n<li>\n<h3>Metin D\u00fczenleyici \/ IDE<\/h3>\n<p>Visual Studio Code (<a href=\"https:\/\/code.visualstudio.com\/\" target=\"_blank\" rel=\"noopener\">code.visualstudio.com<\/a>) gibi modern bir metin d\u00fczenleyici veya entegre geli\u015ftirme ortam\u0131 (IDE) kullanman\u0131z \u00f6nerilir. Bu, kod yazmay\u0131 ve hata ay\u0131klamay\u0131 kolayla\u015ft\u0131racakt\u0131r.<\/p>\n<\/li>\n<\/ul>\n<h2>Angular Uygulamas\u0131 Olu\u015fturma<\/h2>\n<p>\u0130lk ad\u0131m\u0131m\u0131z, temel bir Angular uygulamas\u0131 olu\u015fturmak olacak. Bu uygulama, daha sonra Electron i\u00e7ine entegre edece\u011fimiz \u00f6n u\u00e7 k\u0131sm\u0131n\u0131 olu\u015fturacak.<\/p>\n<h3>Angular CLI Kurulumu<\/h3>\n<p>Angular CLI (Command Line Interface), Angular uygulamalar\u0131 olu\u015fturmak, geli\u015ftirmek ve da\u011f\u0131tmak i\u00e7in kullan\u0131lan g\u00fc\u00e7l\u00fc bir komut sat\u0131r\u0131 arac\u0131d\u0131r. Hen\u00fcz kurulu de\u011filse, a\u015fa\u011f\u0131daki npm komutuyla global olarak kurabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">npm install -g @angular\/cli<\/code><\/pre>\n<p>Kurulumun ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">ng version<\/code><\/pre>\n<h3>Yeni Bir Angular Projesi Olu\u015fturma<\/h3>\n<p>\u015eimdi Angular CLI kullanarak yeni bir Angular projesi olu\u015ftural\u0131m. Projemize &#8216;angular-electron-app&#8217; ad\u0131n\u0131 verelim:<\/p>\n<pre><code class=\"language-bash\">ng new angular-electron-app --skip-install<\/code><\/pre>\n<p><code>--skip-install<\/code> parametresi, projenin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n otomatik olarak y\u00fcklenmesini engeller. Bunu daha sonra manuel olarak yapaca\u011f\u0131z. Komut \u00e7al\u0131\u015ft\u0131ktan sonra size baz\u0131 sorular sorabilir (\u00f6rne\u011fin, &#8220;Would you like to add Angular routing?&#8221;). Genellikle varsay\u0131lan de\u011ferleri kabul edebilirsiniz (<code>No<\/code> veya <code>Enter<\/code>). CSS preprocessor sorusunda <code>CSS<\/code> se\u00e7ene\u011fini se\u00e7ebilirsiniz.<\/p>\n<p>Proje dizinine gidin ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleyin:<\/p>\n<pre><code class=\"language-bash\">cd angular-electron-app\nnpm install<\/code><\/pre>\n<h3>Angular Uygulamas\u0131n\u0131 \u00c7al\u0131\u015ft\u0131rma<\/h3>\n<p>Angular uygulamas\u0131n\u0131n do\u011fru \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in geli\u015ftirme sunucusunu ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">ng serve --open<\/code><\/pre>\n<p>Bu komut, uygulamay\u0131 derler ve genellikle <code>http:\/\/localhost:4200<\/code> adresinde bir taray\u0131c\u0131 penceresinde a\u00e7ar. Taray\u0131c\u0131n\u0131zda &#8220;angular-electron-app app is running!&#8221; gibi bir mesaj g\u00f6rmelisiniz. Bu, Angular uygulaman\u0131z\u0131n ba\u015far\u0131yla \u00e7al\u0131\u015ft\u0131\u011f\u0131 anlam\u0131na gelir.<\/p>\n<h2>Electron&#8217;a Giri\u015f<\/h2>\n<p>Angular uygulamam\u0131z\u0131 Electron ile birle\u015ftirmeden \u00f6nce, Electron&#8217;un ne oldu\u011funu ve nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 k\u0131saca anlayal\u0131m.<\/p>\n<h3>Electron Nedir?<\/h3>\n<p>Electron, GitHub taraf\u0131ndan geli\u015ftirilen a\u00e7\u0131k kaynakl\u0131 bir framework&#8217;t\u00fcr. HTML, CSS ve JavaScript kullanarak masa\u00fcst\u00fc uygulamalar\u0131 geli\u015ftirmenize olanak tan\u0131r. Temelinde Chromium ve Node.js&#8217;i bar\u0131nd\u0131r\u0131r. Chromium, web i\u00e7eri\u011fini g\u00f6r\u00fcnt\u00fclemek i\u00e7in kullan\u0131l\u0131rken (t\u0131pk\u0131 bir web taray\u0131c\u0131s\u0131 gibi), Node.js ise i\u015fletim sistemiyle etkile\u015fim kurmak ve web teknolojileriyle eri\u015filemeyen yerel i\u015flevleri sa\u011flamak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>Electron ile geli\u015ftirilen pop\u00fcler uygulamalara \u00f6rnek olarak Visual Studio Code, Slack, Discord ve Figma&#8217;n\u0131n masa\u00fcst\u00fc s\u00fcr\u00fcmleri verilebilir.<\/p>\n<h3>Electron&#8217;un Temel Bile\u015fenleri<\/h3>\n<p>Electron uygulamalar\u0131 genellikle iki ana i\u015flem (process) t\u00fcr\u00fcnden olu\u015fur:<\/p>\n<ul>\n<li>\n<h3>Main Process (Ana \u0130\u015flem)<\/h3>\n<p>Bu, uygulaman\u0131z\u0131n ana kontrolc\u00fcs\u00fcd\u00fcr. Her Electron uygulamas\u0131n\u0131n yaln\u0131zca bir ana i\u015flemi vard\u0131r. Ana i\u015flem, uygulaman\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc y\u00f6netir (uygulama a\u00e7\u0131l\u0131\u015f\u0131, kapan\u0131\u015f\u0131), yerel i\u015fletim sistemi API&#8217;lerine eri\u015fimi sa\u011flar (dosya sistemi, men\u00fcler, bildirimler), yeni taray\u0131c\u0131 pencereleri (renderer process&#8217;ler) olu\u015fturur ve y\u00f6netir. Node.js API&#8217;lerine tam eri\u015fimi vard\u0131r. Genellikle <code>main.js<\/code> veya benzeri bir dosyada bulunur.<\/p>\n<\/li>\n<li>\n<h3>Renderer Process (\u0130\u015fleyici \u0130\u015flem)<\/h3>\n<p>Her taray\u0131c\u0131 penceresi (<code>BrowserWindow<\/code> \u00f6rne\u011fi), kendi ayr\u0131 i\u015fleyici s\u00fcrecinde \u00e7al\u0131\u015f\u0131r. \u0130\u015fleyici s\u00fcre\u00e7leri, web sayfalar\u0131n\u0131 g\u00f6r\u00fcnt\u00fclemekten sorumludur. T\u0131pk\u0131 bir web taray\u0131c\u0131s\u0131ndaki sekmeler gibi d\u00fc\u015f\u00fcnebilirsiniz. Her i\u015fleyici s\u00fcreci kendi izole ortam\u0131nda \u00e7al\u0131\u015f\u0131r ve Node.js API&#8217;lerine do\u011frudan eri\u015fimi yoktur (g\u00fcvenlik nedeniyle, ancak bu davran\u0131\u015f de\u011fi\u015ftirilebilir). Angular uygulaman\u0131z bu i\u015fleyici s\u00fcre\u00e7lerinden birinde \u00e7al\u0131\u015facakt\u0131r.<\/p>\n<\/li>\n<\/ul>\n<p>Ana i\u015flem ve i\u015fleyici s\u00fcre\u00e7leri aras\u0131nda ileti\u015fim kurmak i\u00e7in Electron&#8217;un Inter-Process Communication (IPC) mod\u00fclleri (<code>ipcMain<\/code> ve <code>ipcRenderer<\/code>) kullan\u0131l\u0131r.<\/p>\n<h2>Angular Uygulamas\u0131n\u0131 Electron ile Birle\u015ftirme<\/h2>\n<p>\u015eimdi Angular uygulamam\u0131z\u0131 Electron&#8217;un i\u00e7ine entegre etme zaman\u0131. Bu, Angular uygulamas\u0131n\u0131 Electron penceresinde g\u00f6sterecek ve ona masa\u00fcst\u00fc yetenekleri kazand\u0131racak.<\/p>\n<h3>Electron Ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 Ekleme<\/h3>\n<p>\u00d6ncelikle, Angular projemizin k\u00f6k dizininde Electron&#8217;u ve ilgili ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fcklememiz gerekiyor:<\/p>\n<pre><code class=\"language-bash\">npm install electron electron-builder --save-dev<\/code><\/pre>\n<p><code>electron-builder<\/code>, uygulaman\u0131z\u0131 farkl\u0131 i\u015fletim sistemleri i\u00e7in paketlemek (installer olu\u015fturmak) i\u00e7in kullanaca\u011f\u0131m\u0131z g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r.<\/p>\n<h3><code>main.js<\/code> Dosyas\u0131 Olu\u015fturma<\/h3>\n<p>Electron&#8217;un ana s\u00fcrecini y\u00f6netecek olan <code>main.js<\/code> dosyas\u0131n\u0131 Angular projemizin k\u00f6k dizininde (<code>angular-electron-app\/<\/code>) olu\u015ftural\u0131m. Bu dosya, Electron uygulamas\u0131n\u0131n ba\u015flang\u0131\u00e7 noktas\u0131n\u0131 tan\u0131mlayacak ve Angular uygulamas\u0131n\u0131 y\u00fckleyecek pencereyi olu\u015fturacakt\u0131r.<\/p>\n<p><code>main.js<\/code> i\u00e7eri\u011fi:<\/p>\n<pre><code class=\"language-javascript\">const { app, BrowserWindow, ipcMain } = require('electron');\nconst path = require('path');\nconst url = require('url');\n\nlet win;\n\nfunction createWindow() {\n  \/\/ Taray\u0131c\u0131 penceresini olu\u015ftur.\n  win = new BrowserWindow({\n    width: 800,\n    height: 600,\n    webPreferences: {\n      nodeIntegration: true, \/\/ Node.js API'lerini renderer s\u00fcrecinde etkinle\u015ftirir (g\u00fcvenlik uyar\u0131s\u0131: geli\u015ftirme i\u00e7in uygun, \u00fcretim i\u00e7in \u00f6nerilmez)\n      contextIsolation: false, \/\/ Node.js API'lerini do\u011frudan window objesine ekler (g\u00fcvenlik uyar\u0131s\u0131: geli\u015ftirme i\u00e7in uygun, \u00fcretim i\u00e7in \u00f6nerilmez)\n      preload: path.join(__dirname, 'preload.js') \/\/ G\u00fcvenli IPC i\u00e7in preload script'i\n    }\n  });\n\n  \/\/ Angular uygulamas\u0131n\u0131n derlenmi\u015f \u00e7\u0131kt\u0131s\u0131n\u0131 y\u00fckle\n  \/\/ Geli\u015ftirme modunda: Angular'\u0131n geli\u015ftirme sunucusuna i\u015faret et\n  \/\/ \u00dcretim modunda: Angular'\u0131n build \u00e7\u0131kt\u0131s\u0131na i\u015faret et\n  const isDev = process.env.NODE_ENV === 'development';\n\n  if (isDev) {\n    win.loadURL('http:\/\/localhost:4200'); \/\/ Angular geli\u015ftirme sunucusu\n    win.webContents.openDevTools(); \/\/ Geli\u015ftirici ara\u00e7lar\u0131n\u0131 a\u00e7\n  } else {\n    \/\/ \u00dcretim i\u00e7in Angular uygulamas\u0131n\u0131n derlenmi\u015f dosyalar\u0131n\u0131 y\u00fckle\n    win.loadURL(url.format({\n      pathname: path.join(__dirname, 'dist\/angular-electron-app\/index.html'),\n      protocol: 'file:',\n      slashes: true\n    }));\n  }\n\n  \/\/ Pencere kapand\u0131\u011f\u0131nda null yap\n  win.on('closed', () => {\n    win = null;\n  });\n}\n\n\/\/ Electron haz\u0131r oldu\u011funda pencere olu\u015ftur\napp.on('ready', createWindow);\n\n\/\/ T\u00fcm pencereler kapat\u0131ld\u0131\u011f\u0131nda uygulamadan \u00e7\u0131k (macOS hari\u00e7)\napp.on('window-all-closed', () => {\n  if (process.platform !== 'darwin') {\n    app.quit();\n  }\n});\n\napp.on('activate', () => {\n  \/\/ macOS'ta dock ikonuna t\u0131kland\u0131\u011f\u0131nda pencere yoksa yeni bir pencere olu\u015ftur\n  if (win === null) {\n    createWindow();\n  }\n});\n\n\/\/ \u00d6rnek IPC ileti\u015fimi (main process'ten renderer process'e)\nipcMain.on('asynchronous-message', (event, arg) => {\n  console.log(arg); \/\/ \"ping\" \u00e7\u0131kt\u0131s\u0131 verir\n  event.reply('asynchronous-reply', 'pong');\n});\n<\/code><\/pre>\n<p>Yukar\u0131daki kodda \u00f6nemli noktalar:<\/p>\n<ul>\n<li><code>BrowserWindow<\/code>: Masa\u00fcst\u00fc penceresini olu\u015fturur.<\/li>\n<li><code>webPreferences<\/code>: Bu nesne, Electron penceresinin web \u00f6zelliklerini yap\u0131land\u0131r\u0131r. <code>nodeIntegration: true<\/code> ve <code>contextIsolation: false<\/code> geli\u015ftirme s\u0131ras\u0131nda Node.js API&#8217;lerine do\u011frudan eri\u015fim sa\u011flar, ancak g\u00fcvenlik a\u00e7\u0131klar\u0131 olu\u015fturabilir. \u00dcretim uygulamalar\u0131nda bu ayarlar dikkatli kullan\u0131lmal\u0131 veya <code>contextBridge<\/code> ile g\u00fcvenli bir ileti\u015fim katman\u0131 olu\u015fturulmal\u0131d\u0131r.<\/li>\n<li><code>loadURL<\/code>: Angular uygulamas\u0131n\u0131n nerede \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 Electron&#8217;a bildirir. Geli\u015ftirme modunda Angular&#8217;\u0131n geli\u015ftirme sunucusuna (<code>http:\/\/localhost:4200<\/code>), \u00fcretim modunda ise derlenmi\u015f <code>index.html<\/code> dosyas\u0131na i\u015faret eder.<\/li>\n<li><code>preload.js<\/code>: G\u00fcvenli IPC ileti\u015fimi i\u00e7in kullan\u0131lacak bir betiktir. Hen\u00fcz olu\u015fturmad\u0131k ama bu, ileri seviye g\u00fcvenlik i\u00e7in \u00f6nemlidir.<\/li>\n<\/ul>\n<h3><code>preload.js<\/code> Dosyas\u0131 Olu\u015fturma (G\u00fcvenli IPC i\u00e7in)<\/h3>\n<p>Electron&#8217;da g\u00fcvenlik, \u00f6zellikle <code>nodeIntegration<\/code> ve <code>contextIsolation<\/code> ayarlar\u0131 nedeniyle \u00f6nemlidir. \u00dcretim uygulamalar\u0131nda <code>nodeIntegration: false<\/code> ve <code>contextIsolation: true<\/code> olarak ayarlanmas\u0131 \u00f6nerilir. Bu durumda, ana s\u00fcre\u00e7 ile i\u015fleyici s\u00fcre\u00e7 (Angular) aras\u0131nda g\u00fcvenli ileti\u015fim kurmak i\u00e7in bir preload beti\u011fi kullan\u0131r\u0131z.<\/p>\n<p>Proje k\u00f6k dizininde <code>preload.js<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine \u015funlar\u0131 ekleyin:<\/p>\n<pre><code class=\"language-javascript\">const { contextBridge, ipcRenderer } = require('electron');\n\n\/\/ Renderer s\u00fcrecinde (Angular) eri\u015filebilecek API'leri tan\u0131mla\ncontextBridge.exposeInMainWorld('electronAPI', {\n  send: (channel, data) => ipcRenderer.send(channel, data),\n  on: (channel, func) => ipcRenderer.on(channel, (event, ...args) => func(...args)),\n  \/\/ ipcRenderer.once i\u00e7in de benzer bir metod eklenebilir\n});\n<\/code><\/pre>\n<p>Bu betik, <code>electronAPI<\/code> ad\u0131nda global bir obje tan\u0131mlar ve Angular uygulaman\u0131z\u0131n ana s\u00fcre\u00e7le g\u00fcvenli bir \u015fekilde ileti\u015fim kurmas\u0131n\u0131 sa\u011flar. <code>main.js<\/code> dosyas\u0131nda <code>preload<\/code> \u00f6zelli\u011fini bu dosyaya i\u015faret etti\u011fimizden emin olun.<\/p>\n<h3><code>package.json<\/code> Dosyas\u0131n\u0131 Yap\u0131land\u0131rma<\/h3>\n<p>Electron uygulamas\u0131n\u0131 ba\u015flatmak i\u00e7in <code>package.json<\/code> dosyam\u0131za baz\u0131 betikler (scripts) eklememiz gerekiyor. Bu betikler, Angular uygulamas\u0131n\u0131 derlememize ve Electron&#8217;u ba\u015flatmam\u0131za yard\u0131mc\u0131 olacak.<\/p>\n<p><code>package.json<\/code> dosyan\u0131z\u0131 a\u00e7\u0131n ve <code>\"scripts\"<\/code> b\u00f6l\u00fcm\u00fcne a\u015fa\u011f\u0131daki sat\u0131rlar\u0131 ekleyin:<\/p>\n<pre><code class=\"language-json\">  \"main\": \"main.js\",\n  \"scripts\": {\n    \"ng\": \"ng\",\n    \"start\": \"npm run build:electron-dev\",\n    \"build\": \"ng build\",\n    \"watch\": \"ng build --watch --configuration development\",\n    \"test\": \"ng test\",\n    \"electron\": \"electron .\",\n    \"electron-dev\": \"concurrently \\\"ng serve --port 4200\\\" \\\"wait-on http:\/\/localhost:4200 && electron .\\\"\",\n    \"build:electron\": \"ng build --base-href .\/ && electron-builder\",\n    \"build:electron-dev\": \"ng build --base-href .\/ && electron .\"\n  },\n  \"private\": true,\n<\/code><\/pre>\n<p>A\u00e7\u0131klamalar:<\/p>\n<ul>\n<li><code>\"main\": \"main.js\"<\/code>: Electron&#8217;a uygulaman\u0131n ana giri\u015f noktas\u0131n\u0131n <code>main.js<\/code> oldu\u011funu bildirir.<\/li>\n<li><code>\"electron\": \"electron .\"<\/code>: Electron&#8217;u mevcut dizinde ba\u015flat\u0131r ve <code>main.js<\/code> dosyas\u0131n\u0131 ana i\u015flem olarak kullan\u0131r.<\/li>\n<li><code>\"electron-dev\"<\/code>: Geli\u015ftirme i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131 bir betiktir. <code>concurrently<\/code> ve <code>wait-on<\/code> k\u00fct\u00fcphanelerini kullanarak Angular geli\u015ftirme sunucusunu ve Electron&#8217;u ayn\u0131 anda ba\u015flat\u0131r. <code>wait-on<\/code>, Angular sunucusunun haz\u0131r olmas\u0131n\u0131 bekler.<\/li>\n<li><code>\"build:electron\"<\/code>: Angular uygulamas\u0131n\u0131 \u00fcretim i\u00e7in derler (<code>--base-href .\/<\/code>, Electron&#8217;da do\u011fru yol \u00e7\u00f6z\u00fcmlemesi i\u00e7in \u00f6nemlidir) ve ard\u0131ndan <code>electron-builder<\/code> ile uygulamay\u0131 paketler.<\/li>\n<li><code>\"build:electron-dev\"<\/code>: Angular uygulamas\u0131n\u0131 derler ve ard\u0131ndan Electron&#8217;u ba\u015flat\u0131r. Bu, Angular&#8217;\u0131n statik \u00e7\u0131kt\u0131 dosyalar\u0131n\u0131 Electron i\u00e7inde g\u00f6rmek istedi\u011finizde kullan\u0131\u015fl\u0131d\u0131r.<\/li>\n<\/ul>\n<p><code>concurrently<\/code> ve <code>wait-on<\/code> paketlerini y\u00fcklemeyi unutmay\u0131n:<\/p>\n<pre><code class=\"language-bash\">npm install concurrently wait-on --save-dev<\/code><\/pre>\n<h3>Angular Uygulamas\u0131n\u0131 Electron \u0130\u00e7inde \u00c7al\u0131\u015ft\u0131rma<\/h3>\n<p>Art\u0131k her \u015fey haz\u0131r! Angular uygulaman\u0131z\u0131 Electron i\u00e7inde geli\u015ftirmek i\u00e7in a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">npm run electron-dev<\/code><\/pre>\n<p>Bu komut s\u0131ras\u0131yla \u015funlar\u0131 yapacakt\u0131r:<\/p>\n<ol>\n<li>Angular geli\u015ftirme sunucusunu <code>http:\/\/localhost:4200<\/code> adresinde ba\u015flat\u0131r.<\/li>\n<li>Angular sunucusunun haz\u0131r olmas\u0131n\u0131 bekler.<\/li>\n<li>Electron uygulamas\u0131n\u0131 ba\u015flat\u0131r. Electron, <code>main.js<\/code> dosyas\u0131nda belirtildi\u011fi gibi <code>http:\/\/localhost:4200<\/code> adresindeki Angular uygulamas\u0131n\u0131 y\u00fckleyecektir.<\/li>\n<\/ol>\n<p>Bir Electron penceresi a\u00e7\u0131lmal\u0131 ve i\u00e7inde Angular uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6rmelisiniz. Geli\u015ftirme s\u00fcrecinde Angular kodunuzda yapt\u0131\u011f\u0131n\u0131z de\u011fi\u015fiklikler, canl\u0131 yenileme (live reload) sayesinde Electron penceresinde otomatik olarak g\u00fcncellenecektir.<\/p>\n<h2>Geli\u015ftirme S\u00fcreci \u0130yile\u015ftirmeleri<\/h2>\n<p>Geli\u015ftirme deneyimini daha da verimli hale getirmek i\u00e7in baz\u0131 ek ara\u00e7lar ve yakla\u015f\u0131mlar kullanabiliriz.<\/p>\n<h3>Otomatik Yenileme (Hot Reloading\/Live Reloading)<\/h3>\n<p>Yukar\u0131daki <code>npm run electron-dev<\/code> beti\u011fi, Angular CLI&#8217;\u0131n yerle\u015fik canl\u0131 yenileme \u00f6zelli\u011fini kullan\u0131r. Angular kodunuzda yapt\u0131\u011f\u0131n\u0131z de\u011fi\u015fiklikler otomatik olarak alg\u0131lan\u0131r ve Electron penceresinde yenilenir. Bu, geli\u015ftirme h\u0131z\u0131n\u0131z\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<p>Ancak, Electron&#8217;un ana s\u00fcrecinde (<code>main.js<\/code>) yapt\u0131\u011f\u0131n\u0131z de\u011fi\u015fiklikler otomatik olarak yenilenmez. Bu durumda, Electron uygulamas\u0131n\u0131 kapat\u0131p tekrar ba\u015flatman\u0131z gerekir. Geli\u015ftirme s\u0131ras\u0131nda bu manuel ad\u0131m\u0131 otomatikle\u015ftirmek i\u00e7in <code>electronmon<\/code> veya <code>nodemon<\/code> gibi ara\u00e7lar kullanabilirsiniz. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-bash\">npm install electronmon --save-dev<\/code><\/pre>\n<p>Ard\u0131ndan <code>package.json<\/code> dosyan\u0131zdaki <code>\"electron-dev\"<\/code> beti\u011fini g\u00fcncelleyebilirsiniz (bu \u00f6rnekte <code>main.js<\/code> de\u011fi\u015fikliklerini izlemek i\u00e7in):<\/p>\n<pre><code class=\"language-json\">    \"electron-dev\": \"concurrently \\\"ng serve --port 4200\\\" \\\"wait-on http:\/\/localhost:4200 && electronmon .\\\"\"\n<\/code><\/pre>\n<p><code>electronmon<\/code>, <code>main.js<\/code> veya di\u011fer Electron ile ilgili dosyalarda de\u011fi\u015fiklik alg\u0131lad\u0131\u011f\u0131nda Electron uygulamas\u0131n\u0131 otomatik olarak yeniden ba\u015flatacakt\u0131r.<\/p>\n<h3>Electron Builder ile Uygulama Paketleme<\/h3>\n<p>Uygulaman\u0131z\u0131 son kullan\u0131c\u0131lara da\u011f\u0131tmak i\u00e7in paketlemeniz gerekir. <code>electron-builder<\/code>, bu s\u00fcreci otomatikle\u015ftiren ve Windows (.exe), macOS (.dmg) ve Linux (.deb, .AppImage) i\u00e7in y\u00fckleyiciler olu\u015fturan g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r.<\/p>\n<h4>Electron Builder Kurulumu<\/h4>\n<p>Daha \u00f6nce y\u00fcklemi\u015ftik: <code>npm install electron electron-builder --save-dev<\/code><\/p>\n<h4><code>package.json<\/code> Yap\u0131land\u0131rmas\u0131<\/h4>\n<p><code>package.json<\/code> dosyan\u0131za <code>\"build\"<\/code> anahtar\u0131n\u0131 ekleyerek <code>electron-builder<\/code>&#8216;\u0131 yap\u0131land\u0131rman\u0131z gerekir. Bu b\u00f6l\u00fcm, uygulaman\u0131z\u0131n ad\u0131, s\u00fcr\u00fcm\u00fc, simgeleri, \u00e7\u0131k\u0131\u015f dizinleri ve hedef platformlar gibi bilgileri i\u00e7erir.<\/p>\n<p>\u00d6rnek <code>\"build\"<\/code> yap\u0131land\u0131rmas\u0131:<\/p>\n<pre><code class=\"language-json\">  \"build\": {\n    \"appId\": \"com.yourcompany.angularelectronapp\",\n    \"productName\": \"Angular Electron App\",\n    \"copyright\": \"Copyright \u00a9 2023 ${author}\",\n    \"directories\": {\n      \"output\": \"release\/\"\n    },\n    \"files\": [\n      \"dist\/angular-electron-app\/<em><\/em>\/*\",\n      \"main.js\",\n      \"preload.js\"\n    ],\n    \"win\": {\n      \"target\": \"nsis\",\n      \"icon\": \"build\/icon.ico\"\n    },\n    \"mac\": {\n      \"target\": \"dmg\",\n      \"icon\": \"build\/icon.icns\"\n    },\n    \"linux\": {\n      \"target\": \"AppImage\",\n      \"icon\": \"build\/icon.png\"\n    }\n  }\n<\/code><\/pre>\n<p>Bu yap\u0131land\u0131rmada:<\/p>\n<ul>\n<li><code>appId<\/code>: Uygulaman\u0131z\u0131n benzersiz kimli\u011fi.<\/li>\n<li><code>productName<\/code>: Uygulaman\u0131z\u0131n g\u00f6r\u00fcnen ad\u0131.<\/li>\n<li><code>directories.output<\/code>: Olu\u015fturulan y\u00fckleyicilerin kaydedilece\u011fi dizin.<\/li>\n<li><code>files<\/code>: Paketlenecek dosyalar\u0131 belirtir. Angular&#8217;\u0131n derlenmi\u015f \u00e7\u0131kt\u0131s\u0131 (<code>dist\/angular-electron-app\/<em><\/em>\/*<\/code>), <code>main.js<\/code> ve <code>preload.js<\/code> dosyalar\u0131n\u0131n dahil edildi\u011finden emin olun.<\/li>\n<li><code>win<\/code>, <code>mac<\/code>, <code>linux<\/code>: Her i\u015fletim sistemi i\u00e7in hedef formatlar\u0131 ve simgeleri belirtir. <code>build\/icon.ico<\/code>, <code>build\/icon.icns<\/code>, <code>build\/icon.png<\/code> gibi simge dosyalar\u0131n\u0131 projenizin k\u00f6k dizinindeki <code>build<\/code> klas\u00f6r\u00fcne yerle\u015ftirmeniz gerekecektir.<\/li>\n<\/ul>\n<h4>Uygulamay\u0131 Olu\u015fturma<\/h4>\n<p>Uygulaman\u0131z\u0131 paketlemek i\u00e7in \u00f6nce Angular uygulamas\u0131n\u0131 \u00fcretim modunda derlemeli, ard\u0131ndan <code>electron-builder<\/code>&#8216;\u0131 \u00e7al\u0131\u015ft\u0131rmal\u0131s\u0131n\u0131z:<\/p>\n<pre><code class=\"language-bash\">npm run build:electron<\/code><\/pre>\n<p>Bu komut, <code>package.json<\/code>&#8216;daki <code>\"build:electron\"<\/code> beti\u011fini \u00e7al\u0131\u015ft\u0131r\u0131r. Angular uygulamas\u0131n\u0131 derler ve ard\u0131ndan <code>electron-builder<\/code>&#8216;\u0131 kullanarak <code>release\/<\/code> dizinine platforma \u00f6zel y\u00fckleyiciler olu\u015fturur.<\/p>\n<h2>Angular ve Electron Aras\u0131nda \u0130leti\u015fim<\/h2>\n<p>Electron&#8217;un ger\u00e7ek g\u00fcc\u00fc, Angular uygulaman\u0131z\u0131n (renderer process) ile ana s\u00fcre\u00e7 (main process) aras\u0131nda ileti\u015fim kurabilme yetene\u011finden gelir. Bu, Angular uygulaman\u0131z\u0131n Node.js API&#8217;lerine ve i\u015fletim sistemi kaynaklar\u0131na eri\u015fmesini sa\u011flar.<\/p>\n<h3><code>ipcRenderer<\/code> ve <code>ipcMain<\/code> Kullan\u0131m\u0131<\/h3>\n<p>\u0130ki s\u00fcre\u00e7 aras\u0131nda ileti\u015fim kurmak i\u00e7in Electron&#8217;un Inter-Process Communication (IPC) mod\u00fclleri kullan\u0131l\u0131r:<\/p>\n<ul>\n<li><code>ipcRenderer<\/code>: Renderer s\u00fcre\u00e7lerinde (Angular bile\u015fenleri) kullan\u0131l\u0131r ve ana s\u00fcrece mesaj g\u00f6ndermek veya ana s\u00fcre\u00e7ten mesaj almak i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><code>ipcMain<\/code>: Ana s\u00fcre\u00e7te (<code>main.js<\/code>) kullan\u0131l\u0131r ve renderer s\u00fcre\u00e7lerinden gelen mesajlar\u0131 dinlemek veya onlara mesaj g\u00f6ndermek i\u00e7in kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<p>Daha \u00f6nce olu\u015fturdu\u011fumuz <code>preload.js<\/code> dosyas\u0131 ve <code>contextBridge<\/code>, bu ileti\u015fimi g\u00fcvenli bir \u015fekilde sa\u011flamak i\u00e7in tasarlanm\u0131\u015ft\u0131r. Angular bile\u015feniniz do\u011frudan Node.js mod\u00fcllerine eri\u015fmek yerine, <code>preload.js<\/code> taraf\u0131ndan a\u00e7\u0131\u011fa \u00e7\u0131kar\u0131lan g\u00fcvenli bir API&#8217;yi kullanacakt\u0131r.<\/p>\n<h3>\u00d6rnek: Dosya Okuma<\/h3>\n<p>Bir d\u00fc\u011fmeye t\u0131kland\u0131\u011f\u0131nda Angular uygulamas\u0131n\u0131n Electron ana s\u00fcrecinden bir dosya okumas\u0131n\u0131 isteyelim.<\/p>\n<h4>Ana \u0130\u015flemde (<code>main.js<\/code>)<\/h4>\n<p><code>main.js<\/code> dosyan\u0131za, bir dosya okuma iste\u011fini dinleyecek bir <code>ipcMain<\/code> olay\u0131 ekleyin:<\/p>\n<pre><code class=\"language-javascript\">const { app, BrowserWindow, ipcMain } = require('electron');\nconst path = require('path');\nconst url = require('url');\nconst fs = require('fs'); \/\/ Node.js'in dosya sistemi mod\u00fcl\u00fc\n\n\/\/ ... (createWindow ve di\u011fer kodlar) ...\n\nipcMain.handle('read-file', async (event, filePath) => {\n  try {\n    const data = await fs.promises.readFile(filePath, 'utf8');\n    return data;\n  } catch (error) {\n    console.error('Dosya okuma hatas\u0131:', error);\n    throw error; \/\/ Hata durumunda renderer s\u00fcrece ilet\n  }\n});\n<\/code><\/pre>\n<p>Burada <code>ipcMain.handle<\/code> kullan\u0131yoruz. Bu, renderer s\u00fcrecinden bir istek ald\u0131\u011f\u0131nda bir Promise d\u00f6nd\u00fcren asenkron bir i\u015fleyici tan\u0131mlar. Bu sayede renderer s\u00fcreci, ana s\u00fcre\u00e7ten bir yan\u0131t bekleyebilir.<\/p>\n<h4>\u0130\u015fleyici \u0130\u015flemde (Renderer Process &#8211; Angular Component)<\/h4>\n<p>Angular uygulaman\u0131zda, bir bile\u015fen i\u00e7inde bu API&#8217;yi kullanabilirsiniz. \u00d6rne\u011fin, <code>app.component.ts<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki kodu ekleyelim:<\/p>\n<pre><code class=\"language-typescript\">\/\/ src\/app\/app.component.ts\nimport { Component } from '@angular\/core';\n\n\/\/ window.electronAPI'yi TypeScript'e tan\u0131tmak i\u00e7in\ndeclare global {\n  interface Window {\n    electronAPI?: {\n      send: (channel: string, data?: any) => void;\n      on: (channel: string, func: (...args: any[]) => void) => void;\n    };\n  }\n}\n\n@Component({\n  selector: 'app-root',\n  template: <code>\n    <h1>Angular Electron Uygulamas\u0131<\/h1>\n    <button (click)=\"readFile()\">Dosya Oku<\/button>\n    <p>Dosya \u0130\u00e7eri\u011fi: {{ fileContent }}<\/p>\n  <\/code>,\n  styleUrls: ['.\/app.component.css']\n})\nexport class AppComponent {\n  fileContent: string = 'Hen\u00fcz okunmad\u0131.';\n\n  async readFile() {\n    if (window.electronAPI) {\n      try {\n        \/\/ Ana s\u00fcrece 'read-file' mesaj\u0131 g\u00f6nder ve yan\u0131t bekle\n        const data = await window.electronAPI.send('read-file', path.join(app.getAppPath(), 'README.md')); \/\/ \u00d6rnek olarak README.md okuyal\u0131m\n        this.fileContent = data;\n      } catch (error) {\n        this.fileContent = 'Dosya okunamad\u0131: ' + error.message;\n        console.error('Angular taraf\u0131nda dosya okuma hatas\u0131:', error);\n      }\n    } else {\n      this.fileContent = 'Electron API kullan\u0131lam\u0131yor.';\n      console.warn('Electron API (window.electronAPI) mevcut de\u011fil. Uygulama taray\u0131c\u0131da m\u0131 \u00e7al\u0131\u015f\u0131yor?');\n    }\n  }\n}\n<\/code><\/pre>\n<p>Bu \u00f6rnekte, bir d\u00fc\u011fmeye t\u0131kland\u0131\u011f\u0131nda <code>readFile()<\/code> metodu \u00e7a\u011fr\u0131l\u0131r. Bu metod, <code>window.electronAPI.send()<\/code> kullanarak ana s\u00fcrece <code>'read-file'<\/code> kanal\u0131ndan bir mesaj g\u00f6nderir ve yan\u0131t\u0131 bekler. Ana s\u00fcre\u00e7, <code>fs<\/code> mod\u00fcl\u00fcn\u00fc kullanarak dosyay\u0131 okur ve i\u00e7eri\u011fini geri d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p><strong>\u00d6nemli Not:<\/strong> Yukar\u0131daki \u00f6rnekte <code>path.join(app.getAppPath(), 'README.md')<\/code> ifadesi, Electron ana s\u00fcrecinde \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda uygulaman\u0131n k\u00f6k dizinindeki <code>README.md<\/code> dosyas\u0131n\u0131 okumay\u0131 deneyecektir. Angular taraf\u0131nda do\u011frudan <code>path<\/code> veya <code>app<\/code> objelerine eri\u015fiminiz yoktur. Bu nedenle, dosya yolunu Angular taraf\u0131ndan bir string olarak iletmeniz veya ana s\u00fcrecin kendisinin bir dosya yolu belirlemesini sa\u011flaman\u0131z gerekir. Yukar\u0131daki <code>main.js<\/code> taraf\u0131ndaki <code>ipcMain.handle<\/code> fonksiyonuna dikkat edin, <code>filePath<\/code> parametresini al\u0131yor. Angular taraf\u0131nda bu parametreyi uygun bir \u015fekilde (\u00f6rne\u011fin bir diyalog penceresi ile kullan\u0131c\u0131dan dosya se\u00e7mesini isteyerek) sa\u011flaman\u0131z gerekir. Basitlik ad\u0131na, ben \u00f6rnekte <code>README.md<\/code> dosyas\u0131n\u0131 okumay\u0131 g\u00f6sterdim.<\/p>\n<h2>S\u0131k Kar\u015f\u0131la\u015f\u0131lan Sorunlar ve \u00c7\u00f6z\u00fcmleri<\/h2>\n<p>Angular ve Electron ile \u00e7al\u0131\u015f\u0131rken kar\u015f\u0131la\u015fabilece\u011finiz baz\u0131 yayg\u0131n sorunlar ve bunlar\u0131n \u00e7\u00f6z\u00fcmleri:<\/p>\n<ul>\n<li>\n<h3><code>nodeIntegration<\/code> ve G\u00fcvenlik<\/h3>\n<p>Geli\u015ftirme s\u0131ras\u0131nda <code>webPreferences: { nodeIntegration: true, contextIsolation: false }<\/code> kullanmak kolayl\u0131k sa\u011flar. Ancak, \u00fcretim uygulamalar\u0131nda bu ciddi g\u00fcvenlik a\u00e7\u0131klar\u0131 yaratabilir. K\u00f6t\u00fc niyetli bir web i\u00e7eri\u011fi, Node.js API&#8217;lerine tam eri\u015fim sa\u011flayabilir.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong> \u00dcretim i\u00e7in <code>nodeIntegration: false<\/code> ve <code>contextIsolation: true<\/code> olarak ayarlay\u0131n. Ard\u0131ndan, Node.js API&#8217;lerine eri\u015fim sa\u011flamak i\u00e7in <code>preload.js<\/code> beti\u011fi ve <code>contextBridge<\/code> kullan\u0131n. Bu, Angular uygulaman\u0131z\u0131n Node.js API&#8217;lerine do\u011frudan de\u011fil, yaln\u0131zca <code>preload.js<\/code> taraf\u0131ndan g\u00fcvenli bir \u015fekilde a\u00e7\u0131\u011fa \u00e7\u0131kar\u0131lan API&#8217;lere eri\u015fmesini sa\u011flar.<\/p>\n<\/li>\n<li>\n<h3><code>contextBridge<\/code> Kullan\u0131m\u0131<\/h3>\n<p><code>contextBridge<\/code>, ana s\u00fcre\u00e7ten g\u00fcvenli bir \u015fekilde i\u015fleyici s\u00fcrece API&#8217;ler aktarman\u0131n en iyi yoludur. \u0130\u015fleyici s\u00fcrecin (Angular) Node.js ortam\u0131ndan tamamen izole kalmas\u0131n\u0131 sa\u011flarken, yine de ana s\u00fcre\u00e7le ileti\u015fim kurmas\u0131na olanak tan\u0131r.<\/p>\n<p><code>preload.js<\/code> dosyas\u0131nda <code>contextBridge.exposeInMainWorld()<\/code> kullanarak API&#8217;lerinizi tan\u0131mlay\u0131n ve Angular uygulaman\u0131zda <code>window.electronAPI<\/code> (veya verdi\u011finiz herhangi bir isim) \u00fczerinden bunlara eri\u015fin. Bu, daha \u00f6nce dosya okuma \u00f6rne\u011finde g\u00f6sterildi\u011fi gibidir.<\/p>\n<\/li>\n<li>\n<h3>Dosya Yollar\u0131<\/h3>\n<p>Electron uygulamas\u0131nda dosya yollar\u0131n\u0131 y\u00f6netmek kafa kar\u0131\u015ft\u0131r\u0131c\u0131 olabilir. \u00d6zellikle Angular uygulamas\u0131n\u0131 derledikten sonra (<code>ng build<\/code>), statik varl\u0131klar\u0131n yollar\u0131 de\u011fi\u015febilir.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong><\/p>\n<ul>\n<li>Angular&#8217;\u0131 derlerken <code>--base-href .\/<\/code> kullan\u0131n: <code>ng build --base-href .\/<\/code>. Bu, g\u00f6receli yollar\u0131n do\u011fru \u015fekilde \u00e7al\u0131\u015fmas\u0131na yard\u0131mc\u0131 olur.<\/li>\n<li>Electron&#8217;da statik dosyalar\u0131 i\u015faret ederken <code>path.join(__dirname, 'dist\/your-app-name\/index.html')<\/code> gibi ifadeler kullan\u0131n. <code>__dirname<\/code>, mevcut beti\u011fin (genellikle <code>main.js<\/code>) dizinini temsil eder.<\/li>\n<li>Uygulama i\u00e7inde dosya veya dizinlere eri\u015firken Electron&#8217;un <code>app.getPath()<\/code> veya <code>app.getAppPath()<\/code> gibi metodlar\u0131n\u0131 kullan\u0131n. Bu, i\u015fletim sistemleri aras\u0131nda tutarl\u0131 yollar sa\u011flar.<\/li>\n<\/ul>\n<\/li>\n<li>\n<h3>Angular Router ve <code>HashLocationStrategy<\/code><\/h3>\n<p>Electron, dosya tabanl\u0131 bir protokol (<code>file:\/\/<\/code>) kulland\u0131\u011f\u0131ndan, Angular Router&#8217;\u0131n varsay\u0131lan <code>PathLocationStrategy<\/code>&#8216;si sorunlara neden olabilir. Taray\u0131c\u0131da oldu\u011fu gibi bir web sunucusu olmad\u0131\u011f\u0131ndan, URL&#8217;deki yollar\u0131n sunucu taraf\u0131ndan i\u015flenmesi beklenmez.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong> Angular uygulaman\u0131zda <code>HashLocationStrategy<\/code> kullan\u0131n. Bunu <code>app.module.ts<\/code> dosyan\u0131zda a\u015fa\u011f\u0131daki gibi yap\u0131land\u0131rabilirsiniz:<\/p>\n<pre><code class=\"language-typescript\">import { BrowserModule } from '@angular\/platform-browser';\nimport { NgModule } from '@angular\/core';\nimport { AppRoutingModule } from '.\/app-routing.module';\nimport { AppComponent } from '.\/app.component';\nimport { LocationStrategy, HashLocationStrategy } from '@angular\/common'; \/\/ Ekleyin\n\n@NgModule({\n  declarations: [\n    AppComponent\n  ],\n  imports: [\n    BrowserModule,\n    AppRoutingModule\n  ],\n  providers: [\n    { provide: LocationStrategy, useClass: HashLocationStrategy } \/\/ Ekleyin\n  ],\n  bootstrap: [AppComponent]\n})\nexport class AppModule { }\n<\/code><\/pre>\n<p>Bu, rotalar\u0131 URL&#8217;de <code>#<\/code> i\u015faretiyle y\u00f6netir (\u00f6rne\u011fin, <code>file:\/\/\/path\/to\/index.html#\/home<\/code>), bu da Electron&#8217;un dosya protokol\u00fcyle uyumludur.<\/p>\n<\/li>\n<\/ul>\n<h2>Performans \u0130pu\u00e7lar\u0131<\/h2>\n<p>Electron uygulamalar\u0131, \u00f6zellikle b\u00fcy\u00fck Angular uygulamalar\u0131, kaynak t\u00fcketimi a\u00e7\u0131s\u0131ndan a\u011f\u0131r olabilir. Performans\u0131 art\u0131rmak i\u00e7in baz\u0131 ipu\u00e7lar\u0131:<\/p>\n<ul>\n<li>\n<h3>Gereksiz Mod\u00fclleri Y\u00fcklemeyin<\/h3>\n<p>Ana s\u00fcre\u00e7te (<code>main.js<\/code>) yaln\u0131zca ihtiyac\u0131n\u0131z olan Node.js mod\u00fcllerini y\u00fckleyin. Angular taraf\u0131nda da gereksiz k\u00fct\u00fcphanelerden ka\u00e7\u0131n\u0131n.<\/p>\n<\/li>\n<li>\n<h3>Lazy Loading Kullan\u0131n<\/h3>\n<p>Angular&#8217;\u0131n tembel y\u00fckleme (lazy loading) \u00f6zelli\u011fini kullanarak mod\u00fclleri yaln\u0131zca ihtiya\u00e7 duyuldu\u011funda y\u00fckleyin. Bu, uygulaman\u0131z\u0131n ba\u015flang\u0131\u00e7 s\u00fcresini ve bellek kullan\u0131m\u0131n\u0131 azalt\u0131r.<\/p>\n<\/li>\n<li>\n<h3>Bellek Kullan\u0131m\u0131n\u0131 \u0130zleyin<\/h3>\n<p>Electron geli\u015ftirici ara\u00e7lar\u0131n\u0131 (Chromium DevTools) kullanarak uygulaman\u0131z\u0131n bellek ve CPU kullan\u0131m\u0131n\u0131 izleyin. Bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 ve performans darbo\u011fazlar\u0131n\u0131 tespit edin.<\/p>\n<\/li>\n<li>\n<h3>Gereksiz Renderer S\u00fcre\u00e7lerinden Ka\u00e7\u0131n\u0131n<\/h3>\n<p>Her <code>BrowserWindow<\/code> bir renderer s\u00fcreci demektir ve kendi kaynaklar\u0131n\u0131 t\u00fcketir. M\u00fcmk\u00fcnse, tek bir pencereyle veya minimum say\u0131da pencereyle \u00e7al\u0131\u015fmaya \u00f6zen g\u00f6sterin.<\/p>\n<\/li>\n<li>\n<h3>Uygulama Boyutunu Optimize Edin<\/h3>\n<p>Angular uygulaman\u0131z\u0131 \u00fcretim i\u00e7in derlerken a\u011fa\u00e7 sallama (tree-shaking) ve AOT (Ahead-of-Time) derleme gibi optimizasyonlar\u0131 kullan\u0131n. <code>electron-builder<\/code>, paketleme s\u0131ras\u0131nda gereksiz dosyalar\u0131 temizleyerek uygulama boyutunu daha da k\u00fc\u00e7\u00fcltmenize yard\u0131mc\u0131 olabilir.<\/p>\n<\/li>\n<li>\n<h3>Yerel Mod\u00fclleri Dikkatli Kullan\u0131n<\/h3>\n<p>Node.js&#8217;in yerel mod\u00fclleri (C++ eklentileri) performansl\u0131 olabilir ancak Electron&#8217;un farkl\u0131 s\u00fcr\u00fcmleriyle uyumluluk sorunlar\u0131 ya\u015fayabilir. Bu t\u00fcr mod\u00fclleri kullan\u0131rken dikkatli olun ve <code>electron-rebuild<\/code> gibi ara\u00e7lar\u0131 kullanman\u0131z gerekebilir.<\/p>\n<\/li>\n<\/ul>\n<h2>Sonu\u00e7<\/h2>\n<p>Bu makalede, Angular ve Electron&#8217;u kullanarak s\u0131f\u0131rdan bir masa\u00fcst\u00fc uygulamas\u0131 geli\u015ftirme s\u00fcrecini ad\u0131m ad\u0131m inceledik. Angular&#8217;\u0131n g\u00fc\u00e7l\u00fc \u00f6n u\u00e7 yeteneklerini Electron&#8217;un masa\u00fcst\u00fc entegrasyonu ile birle\u015ftirmenin ne kadar kolay ve etkili olabilece\u011fini g\u00f6rd\u00fck. Temel kurulumdan, geli\u015ftirme ve \u00fcretim ortam\u0131 yap\u0131land\u0131rmas\u0131na, iki teknoloji aras\u0131nda g\u00fcvenli ileti\u015fim kurmaya ve s\u0131k kar\u015f\u0131la\u015f\u0131lan sorunlar\u0131n \u00e7\u00f6z\u00fcm\u00fcne kadar bir\u00e7ok konuya de\u011findik.<\/p>\n<p>Art\u0131k web geli\u015ftirme bilginizi kullanarak platformlar aras\u0131, zengin \u00f6zelliklere sahip masa\u00fcst\u00fc uygulamalar\u0131 olu\u015fturmak i\u00e7in sa\u011flam bir temele sahipsiniz. Angular ve Electron&#8217;un sundu\u011fu bu sinerji, modern masa\u00fcst\u00fc uygulamalar\u0131 geli\u015ftirme \u015feklinizi de\u011fi\u015ftirebilir. Ba\u015far\u0131lar dileriz!<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Angular ve Electron ile Ba\u015flang\u0131\u00e7\nG\u00fcn\u00fcm\u00fcz masa\u00fcst\u00fc uygulama geli\u015ftirme d\u00fcnyas\u0131nda, web teknolojilerinin g\u00fcc\u00fcn\u00fc ve esnekli\u011fini masa\u00fcs","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":[1488],"tags":[],"class_list":{"0":"post-32350","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-angular","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>Angular ve Electron ile Ba\u015flang\u0131\u00e7 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular ve Electron ile Ba\u015flang\u0131\u00e7\" \/>\n<meta property=\"og:description\" content=\"Angular ve Electron ile Ba\u015flang\u0131\u00e7 G\u00fcn\u00fcm\u00fcz masa\u00fcst\u00fc uygulama geli\u015ftirme d\u00fcnyas\u0131nda, web teknolojilerinin g\u00fcc\u00fcn\u00fc ve esnekli\u011fini masa\u00fcs\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-20T16:41:19+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Angular ve Electron ile Ba\u015flang\u0131\u00e7\",\"datePublished\":\"2025-10-20T16:41:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/\"},\"wordCount\":3383,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Angular\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/\",\"name\":\"Angular ve Electron ile Ba\u015flang\u0131\u00e7 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-20T16:41:19+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular ve Electron ile Ba\u015flang\u0131\u00e7\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Angular ve Electron ile Ba\u015flang\u0131\u00e7 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/","og_locale":"tr_TR","og_type":"article","og_title":"Angular ve Electron ile Ba\u015flang\u0131\u00e7","og_description":"Angular ve Electron ile Ba\u015flang\u0131\u00e7 G\u00fcn\u00fcm\u00fcz masa\u00fcst\u00fc uygulama geli\u015ftirme d\u00fcnyas\u0131nda, web teknolojilerinin g\u00fcc\u00fcn\u00fc ve esnekli\u011fini masa\u00fcs","og_url":"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-20T16:41:19+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"22 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Angular ve Electron ile Ba\u015flang\u0131\u00e7","datePublished":"2025-10-20T16:41:19+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/"},"wordCount":3383,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Angular"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/","url":"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/","name":"Angular ve Electron ile Ba\u015flang\u0131\u00e7 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-20T16:41:19+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/angular-ve-electron-ile-baslangic\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Angular ve Electron ile Ba\u015flang\u0131\u00e7"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32350","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=32350"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32350\/revisions"}],"predecessor-version":[{"id":32351,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32350\/revisions\/32351"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32350"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32350"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32350"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}