Angular ve Electron ile Başlangıç
Günümüz masaüstü uygulama geliştirme dünyasında, web teknolojilerinin gücünü ve esnekliğini masaüstüne taşımak, geliştiriciler için giderek daha cazip hale gelmektedir. Bu yaklaşımın en popüler temsilcilerinden biri de Electron‘dur. Electron, web teknolojileri (HTML, CSS, JavaScript) kullanarak platformlar arası masaüstü uygulamaları geliştirmenize olanak tanır. Modern ve güçlü bir ön uç (frontend) framework’ü olan Angular ile Electron’u birleştirmek ise, zengin kullanıcı arayüzleri ve karmaşık iş mantığına sahip, performanslı masaüstü uygulamaları oluşturmanın kapılarını aralar.
Bu makalede, Angular ve Electron’u kullanarak sıfırdan bir masaüstü uygulaması geliştirmeye başlayacağız. Temel kurulumdan, iki teknolojiyi bir araya getirmeye, geliştirme sürecini iyileştirmeye ve hatta Angular uygulamanız ile Electron’un ana süreçleri arasında nasıl iletişim kurulacağına kadar birçok konuyu adım adım ele alacağız. Amacımız, web geliştirme bilginizi masaüstü dünyasına taşımanız için size sağlam bir temel sunmaktır.
Neden Angular ve Electron?
Angular ve Electron’un birleşimi, geliştiricilere bir dizi önemli avantaj sunar:
-
Platformlar Arası Uyumluluk
Electron, uygulamanızı Windows, macOS ve Linux gibi farklı işletim sistemlerinde tek bir kod tabanıyla çalıştırmanıza olanak tanır. Bu, geliştirme maliyetlerini düşürür ve pazar erişiminizi genişletir. Angular ile oluşturulan web uygulamaları da doğal olarak platformdan bağımsızdır, bu da bu iki teknolojinin uyumunu artırır.
-
Web Teknolojilerinin Gücü
HTML, CSS ve JavaScript (TypeScript) gibi web standartlarını kullanarak masaüstü uygulamaları geliştirmek, web geliştiricilerinin mevcut bilgi birikimlerini doğrudan kullanmalarını sağlar. Bu, öğrenme eğrisini azaltır ve geliştirme sürecini hızlandırır. Angular’ın bileşen tabanlı mimarisi, modüler yapısı ve güçlü veri bağlama yetenekleri, karmaşık kullanıcı arayüzlerini kolayca oluşturmanıza yardımcı olur.
-
Zengin Kullanıcı Deneyimi
Angular, dinamik ve interaktif kullanıcı arayüzleri oluşturmak için güçlü araçlar sunar. Electron ise, Chromium’un rendering motorunu kullanarak bu arayüzleri masaüstü ortamında, tarayıcı kısıtlamaları olmadan, yüksek performansla çalıştırma yeteneği sağlar. Bu sayede, tarayıcı tabanlı uygulamalardan çok daha zengin ve entegre bir masaüstü deneyimi sunabilirsiniz.
-
Node.js Entegrasyonu
Electron, Node.js çalışma zamanını (runtime) içinde barındırır. Bu, Electron uygulamalarının dosya sistemi erişimi, işletim sistemi etkileşimi ve ağ işlemleri gibi Node.js modüllerini kullanabileceği anlamına gelir. Angular uygulamanızın tarayıcıda yapamayacağı birçok işlemi (örneğin, yerel dosya okuma/yazma, sistem bildirimleri gönderme) Electron sayesinde gerçekleştirebilirsiniz.
-
Geniş Ekosistem ve Topluluk Desteği
Hem Angular hem de Electron, geniş ve aktif geliştirici topluluklarına sahiptir. Bu, sorun yaşadığınızda veya yeni özellikler eklemek istediğinizde kolayca destek bulabileceğiniz anlamına gelir. Ayrıca, her iki teknoloji için de zengin kütüphane ve araç ekosistemi mevcuttur.
Ön Koşullar
Bu makaledeki adımları takip edebilmek için bilgisayarınızda aşağıdaki yazılımların kurulu olması gerekmektedir:
-
Node.js ve npm
Angular CLI ve Electron’u çalıştırmak için Node.js ve paket yöneticisi npm’e ihtiyacınız olacak. Node.js’i resmi web sitesinden (nodejs.org) indirebilirsiniz. Kurulumla birlikte npm de otomatik olarak kurulacaktır. Kurulum sonrası terminalinizde
node -vvenpm -vkomutlarını çalıştırarak sürümleri kontrol edebilirsiniz. -
Metin Düzenleyici / IDE
Visual Studio Code (code.visualstudio.com) gibi modern bir metin düzenleyici veya entegre geliştirme ortamı (IDE) kullanmanız önerilir. Bu, kod yazmayı ve hata ayıklamayı kolaylaştıracaktır.
Angular Uygulaması Oluşturma
İlk adımımız, temel bir Angular uygulaması oluşturmak olacak. Bu uygulama, daha sonra Electron içine entegre edeceğimiz ön uç kısmını oluşturacak.
Angular CLI Kurulumu
Angular CLI (Command Line Interface), Angular uygulamaları oluşturmak, geliştirmek ve dağıtmak için kullanılan güçlü bir komut satırı aracıdır. Henüz kurulu değilse, aşağıdaki npm komutuyla global olarak kurabilirsiniz:
npm install -g @angular/cli
Kurulumun başarılı olup olmadığını kontrol etmek için:
ng version
Yeni Bir Angular Projesi Oluşturma
Şimdi Angular CLI kullanarak yeni bir Angular projesi oluşturalım. Projemize ‘angular-electron-app’ adını verelim:
ng new angular-electron-app --skip-install
--skip-install parametresi, projenin bağımlılıklarının otomatik olarak yüklenmesini engeller. Bunu daha sonra manuel olarak yapacağız. Komut çalıştıktan sonra size bazı sorular sorabilir (örneğin, “Would you like to add Angular routing?”). Genellikle varsayılan değerleri kabul edebilirsiniz (No veya Enter). CSS preprocessor sorusunda CSS seçeneğini seçebilirsiniz.
Proje dizinine gidin ve bağımlılıkları yükleyin:
cd angular-electron-app
npm install
Angular Uygulamasını Çalıştırma
Angular uygulamasının doğru şekilde çalıştığından emin olmak için geliştirme sunucusunu başlatın:
ng serve --open
Bu komut, uygulamayı derler ve genellikle http://localhost:4200 adresinde bir tarayıcı penceresinde açar. Tarayıcınızda “angular-electron-app app is running!” gibi bir mesaj görmelisiniz. Bu, Angular uygulamanızın başarıyla çalıştığı anlamına gelir.
Electron’a Giriş
Angular uygulamamızı Electron ile birleştirmeden önce, Electron’un ne olduğunu ve nasıl çalıştığını kısaca anlayalım.
Electron Nedir?
Electron, GitHub tarafından geliştirilen açık kaynaklı bir framework’tür. HTML, CSS ve JavaScript kullanarak masaüstü uygulamaları geliştirmenize olanak tanır. Temelinde Chromium ve Node.js’i barındırır. Chromium, web içeriğini görüntülemek için kullanılırken (tıpkı bir web tarayıcısı gibi), Node.js ise işletim sistemiyle etkileşim kurmak ve web teknolojileriyle erişilemeyen yerel işlevleri sağlamak için kullanılır.
Electron ile geliştirilen popüler uygulamalara örnek olarak Visual Studio Code, Slack, Discord ve Figma’nın masaüstü sürümleri verilebilir.
Electron’un Temel Bileşenleri
Electron uygulamaları genellikle iki ana işlem (process) türünden oluşur:
-
Main Process (Ana İşlem)
Bu, uygulamanızın ana kontrolcüsüdür. Her Electron uygulamasının yalnızca bir ana işlemi vardır. Ana işlem, uygulamanın yaşam döngüsünü yönetir (uygulama açılışı, kapanışı), yerel işletim sistemi API’lerine erişimi sağlar (dosya sistemi, menüler, bildirimler), yeni tarayıcı pencereleri (renderer process’ler) oluşturur ve yönetir. Node.js API’lerine tam erişimi vardır. Genellikle
main.jsveya benzeri bir dosyada bulunur. -
Renderer Process (İşleyici İşlem)
Her tarayıcı penceresi (
BrowserWindowörneği), kendi ayrı işleyici sürecinde çalışır. İşleyici süreçleri, web sayfalarını görüntülemekten sorumludur. Tıpkı bir web tarayıcısındaki sekmeler gibi düşünebilirsiniz. Her işleyici süreci kendi izole ortamında çalışır ve Node.js API’lerine doğrudan erişimi yoktur (güvenlik nedeniyle, ancak bu davranış değiştirilebilir). Angular uygulamanız bu işleyici süreçlerinden birinde çalışacaktır.
Ana işlem ve işleyici süreçleri arasında iletişim kurmak için Electron’un Inter-Process Communication (IPC) modülleri (ipcMain ve ipcRenderer) kullanılır.
Angular Uygulamasını Electron ile Birleştirme
Şimdi Angular uygulamamızı Electron’un içine entegre etme zamanı. Bu, Angular uygulamasını Electron penceresinde gösterecek ve ona masaüstü yetenekleri kazandıracak.
Electron Bağımlılıklarını Ekleme
Öncelikle, Angular projemizin kök dizininde Electron’u ve ilgili bağımlılıkları yüklememiz gerekiyor:
npm install electron electron-builder --save-dev
electron-builder, uygulamanızı farklı işletim sistemleri için paketlemek (installer oluşturmak) için kullanacağımız güçlü bir araçtır.
main.js Dosyası Oluşturma
Electron’un ana sürecini yönetecek olan main.js dosyasını Angular projemizin kök dizininde (angular-electron-app/) oluşturalım. Bu dosya, Electron uygulamasının başlangıç noktasını tanımlayacak ve Angular uygulamasını yükleyecek pencereyi oluşturacaktır.
main.js içeriği:
const { app, BrowserWindow, ipcMain } = require('electron');
const path = require('path');
const url = require('url');
let win;
function createWindow() {
// Tarayıcı penceresini oluştur.
win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true, // Node.js API'lerini renderer sürecinde etkinleştirir (güvenlik uyarısı: geliştirme için uygun, üretim için önerilmez)
contextIsolation: false, // Node.js API'lerini doğrudan window objesine ekler (güvenlik uyarısı: geliştirme için uygun, üretim için önerilmez)
preload: path.join(__dirname, 'preload.js') // Güvenli IPC için preload script'i
}
});
// Angular uygulamasının derlenmiş çıktısını yükle
// Geliştirme modunda: Angular'ın geliştirme sunucusuna işaret et
// Üretim modunda: Angular'ın build çıktısına işaret et
const isDev = process.env.NODE_ENV === 'development';
if (isDev) {
win.loadURL('http://localhost:4200'); // Angular geliştirme sunucusu
win.webContents.openDevTools(); // Geliştirici araçlarını aç
} else {
// Üretim için Angular uygulamasının derlenmiş dosyalarını yükle
win.loadURL(url.format({
pathname: path.join(__dirname, 'dist/angular-electron-app/index.html'),
protocol: 'file:',
slashes: true
}));
}
// Pencere kapandığında null yap
win.on('closed', () => {
win = null;
});
}
// Electron hazır olduğunda pencere oluştur
app.on('ready', createWindow);
// Tüm pencereler kapatıldığında uygulamadan çık (macOS hariç)
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
});
app.on('activate', () => {
// macOS'ta dock ikonuna tıklandığında pencere yoksa yeni bir pencere oluştur
if (win === null) {
createWindow();
}
});
// Örnek IPC iletişimi (main process'ten renderer process'e)
ipcMain.on('asynchronous-message', (event, arg) => {
console.log(arg); // "ping" çıktısı verir
event.reply('asynchronous-reply', 'pong');
});
Yukarıdaki kodda önemli noktalar:
BrowserWindow: Masaüstü penceresini oluşturur.webPreferences: Bu nesne, Electron penceresinin web özelliklerini yapılandırır.nodeIntegration: truevecontextIsolation: falsegeliştirme sırasında Node.js API’lerine doğrudan erişim sağlar, ancak güvenlik açıkları oluşturabilir. Üretim uygulamalarında bu ayarlar dikkatli kullanılmalı veyacontextBridgeile güvenli bir iletişim katmanı oluşturulmalıdır.loadURL: Angular uygulamasının nerede çalıştığını Electron’a bildirir. Geliştirme modunda Angular’ın geliştirme sunucusuna (http://localhost:4200), üretim modunda ise derlenmişindex.htmldosyasına işaret eder.preload.js: Güvenli IPC iletişimi için kullanılacak bir betiktir. Henüz oluşturmadık ama bu, ileri seviye güvenlik için önemlidir.
preload.js Dosyası Oluşturma (Güvenli IPC için)
Electron’da güvenlik, özellikle nodeIntegration ve contextIsolation ayarları nedeniyle önemlidir. Üretim uygulamalarında nodeIntegration: false ve contextIsolation: true olarak ayarlanması önerilir. Bu durumda, ana süreç ile işleyici süreç (Angular) arasında güvenli iletişim kurmak için bir preload betiği kullanırız.
Proje kök dizininde preload.js adında bir dosya oluşturun ve içine şunları ekleyin:
const { contextBridge, ipcRenderer } = require('electron');
// Renderer sürecinde (Angular) erişilebilecek API'leri tanımla
contextBridge.exposeInMainWorld('electronAPI', {
send: (channel, data) => ipcRenderer.send(channel, data),
on: (channel, func) => ipcRenderer.on(channel, (event, ...args) => func(...args)),
// ipcRenderer.once için de benzer bir metod eklenebilir
});
Bu betik, electronAPI adında global bir obje tanımlar ve Angular uygulamanızın ana süreçle güvenli bir şekilde iletişim kurmasını sağlar. main.js dosyasında preload özelliğini bu dosyaya işaret ettiğimizden emin olun.
package.json Dosyasını Yapılandırma
Electron uygulamasını başlatmak için package.json dosyamıza bazı betikler (scripts) eklememiz gerekiyor. Bu betikler, Angular uygulamasını derlememize ve Electron’u başlatmamıza yardımcı olacak.
package.json dosyanızı açın ve "scripts" bölümüne aşağıdaki satırları ekleyin:
"main": "main.js",
"scripts": {
"ng": "ng",
"start": "npm run build:electron-dev",
"build": "ng build",
"watch": "ng build --watch --configuration development",
"test": "ng test",
"electron": "electron .",
"electron-dev": "concurrently \"ng serve --port 4200\" \"wait-on http://localhost:4200 && electron .\"",
"build:electron": "ng build --base-href ./ && electron-builder",
"build:electron-dev": "ng build --base-href ./ && electron ."
},
"private": true,
Açıklamalar:
"main": "main.js": Electron’a uygulamanın ana giriş noktasınınmain.jsolduğunu bildirir."electron": "electron .": Electron’u mevcut dizinde başlatır vemain.jsdosyasını ana işlem olarak kullanır."electron-dev": Geliştirme için çok kullanışlı bir betiktir.concurrentlyvewait-onkütüphanelerini kullanarak Angular geliştirme sunucusunu ve Electron’u aynı anda başlatır.wait-on, Angular sunucusunun hazır olmasını bekler."build:electron": Angular uygulamasını üretim için derler (--base-href ./, Electron’da doğru yol çözümlemesi için önemlidir) ve ardındanelectron-builderile uygulamayı paketler."build:electron-dev": Angular uygulamasını derler ve ardından Electron’u başlatır. Bu, Angular’ın statik çıktı dosyalarını Electron içinde görmek istediğinizde kullanışlıdır.
concurrently ve wait-on paketlerini yüklemeyi unutmayın:
npm install concurrently wait-on --save-dev
Angular Uygulamasını Electron İçinde Çalıştırma
Artık her şey hazır! Angular uygulamanızı Electron içinde geliştirmek için aşağıdaki komutu çalıştırın:
npm run electron-dev
Bu komut sırasıyla şunları yapacaktır:
- Angular geliştirme sunucusunu
http://localhost:4200adresinde başlatır. - Angular sunucusunun hazır olmasını bekler.
- Electron uygulamasını başlatır. Electron,
main.jsdosyasında belirtildiği gibihttp://localhost:4200adresindeki Angular uygulamasını yükleyecektir.
Bir Electron penceresi açılmalı ve içinde Angular uygulamanızın çalıştığını görmelisiniz. Geliştirme sürecinde Angular kodunuzda yaptığınız değişiklikler, canlı yenileme (live reload) sayesinde Electron penceresinde otomatik olarak güncellenecektir.
Geliştirme Süreci İyileştirmeleri
Geliştirme deneyimini daha da verimli hale getirmek için bazı ek araçlar ve yaklaşımlar kullanabiliriz.
Otomatik Yenileme (Hot Reloading/Live Reloading)
Yukarıdaki npm run electron-dev betiği, Angular CLI’ın yerleşik canlı yenileme özelliğini kullanır. Angular kodunuzda yaptığınız değişiklikler otomatik olarak algılanır ve Electron penceresinde yenilenir. Bu, geliştirme hızınızı önemli ölçüde artırır.
Ancak, Electron’un ana sürecinde (main.js) yaptığınız değişiklikler otomatik olarak yenilenmez. Bu durumda, Electron uygulamasını kapatıp tekrar başlatmanız gerekir. Geliştirme sırasında bu manuel adımı otomatikleştirmek için electronmon veya nodemon gibi araçlar kullanabilirsiniz. Örneğin:
npm install electronmon --save-dev
Ardından package.json dosyanızdaki "electron-dev" betiğini güncelleyebilirsiniz (bu örnekte main.js değişikliklerini izlemek için):
"electron-dev": "concurrently \"ng serve --port 4200\" \"wait-on http://localhost:4200 && electronmon .\""
electronmon, main.js veya diğer Electron ile ilgili dosyalarda değişiklik algıladığında Electron uygulamasını otomatik olarak yeniden başlatacaktır.
Electron Builder ile Uygulama Paketleme
Uygulamanızı son kullanıcılara dağıtmak için paketlemeniz gerekir. electron-builder, bu süreci otomatikleştiren ve Windows (.exe), macOS (.dmg) ve Linux (.deb, .AppImage) için yükleyiciler oluşturan güçlü bir araçtır.
Electron Builder Kurulumu
Daha önce yüklemiştik: npm install electron electron-builder --save-dev
package.json Yapılandırması
package.json dosyanıza "build" anahtarını ekleyerek electron-builder‘ı yapılandırmanız gerekir. Bu bölüm, uygulamanızın adı, sürümü, simgeleri, çıkış dizinleri ve hedef platformlar gibi bilgileri içerir.
Örnek "build" yapılandırması:
"build": {
"appId": "com.yourcompany.angularelectronapp",
"productName": "Angular Electron App",
"copyright": "Copyright © 2023 ${author}",
"directories": {
"output": "release/"
},
"files": [
"dist/angular-electron-app//*",
"main.js",
"preload.js"
],
"win": {
"target": "nsis",
"icon": "build/icon.ico"
},
"mac": {
"target": "dmg",
"icon": "build/icon.icns"
},
"linux": {
"target": "AppImage",
"icon": "build/icon.png"
}
}
Bu yapılandırmada:
appId: Uygulamanızın benzersiz kimliği.productName: Uygulamanızın görünen adı.directories.output: Oluşturulan yükleyicilerin kaydedileceği dizin.files: Paketlenecek dosyaları belirtir. Angular’ın derlenmiş çıktısı (dist/angular-electron-app//*),main.jsvepreload.jsdosyalarının dahil edildiğinden emin olun.win,mac,linux: Her işletim sistemi için hedef formatları ve simgeleri belirtir.build/icon.ico,build/icon.icns,build/icon.pnggibi simge dosyalarını projenizin kök dizinindekibuildklasörüne yerleştirmeniz gerekecektir.
Uygulamayı Oluşturma
Uygulamanızı paketlemek için önce Angular uygulamasını üretim modunda derlemeli, ardından electron-builder‘ı çalıştırmalısınız:
npm run build:electron
Bu komut, package.json‘daki "build:electron" betiğini çalıştırır. Angular uygulamasını derler ve ardından electron-builder‘ı kullanarak release/ dizinine platforma özel yükleyiciler oluşturur.
Angular ve Electron Arasında İletişim
Electron’un gerçek gücü, Angular uygulamanızın (renderer process) ile ana süreç (main process) arasında iletişim kurabilme yeteneğinden gelir. Bu, Angular uygulamanızın Node.js API’lerine ve işletim sistemi kaynaklarına erişmesini sağlar.
ipcRenderer ve ipcMain Kullanımı
İki süreç arasında iletişim kurmak için Electron’un Inter-Process Communication (IPC) modülleri kullanılır:
ipcRenderer: Renderer süreçlerinde (Angular bileşenleri) kullanılır ve ana sürece mesaj göndermek veya ana süreçten mesaj almak için kullanılır.ipcMain: Ana süreçte (main.js) kullanılır ve renderer süreçlerinden gelen mesajları dinlemek veya onlara mesaj göndermek için kullanılır.
Daha önce oluşturduğumuz preload.js dosyası ve contextBridge, bu iletişimi güvenli bir şekilde sağlamak için tasarlanmıştır. Angular bileşeniniz doğrudan Node.js modüllerine erişmek yerine, preload.js tarafından açığa çıkarılan güvenli bir API’yi kullanacaktır.
Örnek: Dosya Okuma
Bir düğmeye tıklandığında Angular uygulamasının Electron ana sürecinden bir dosya okumasını isteyelim.
Ana İşlemde (main.js)
main.js dosyanıza, bir dosya okuma isteğini dinleyecek bir ipcMain olayı ekleyin:
const { app, BrowserWindow, ipcMain } = require('electron');
const path = require('path');
const url = require('url');
const fs = require('fs'); // Node.js'in dosya sistemi modülü
// ... (createWindow ve diğer kodlar) ...
ipcMain.handle('read-file', async (event, filePath) => {
try {
const data = await fs.promises.readFile(filePath, 'utf8');
return data;
} catch (error) {
console.error('Dosya okuma hatası:', error);
throw error; // Hata durumunda renderer sürece ilet
}
});
Burada ipcMain.handle kullanıyoruz. Bu, renderer sürecinden bir istek aldığında bir Promise döndüren asenkron bir işleyici tanımlar. Bu sayede renderer süreci, ana süreçten bir yanıt bekleyebilir.
İşleyici İşlemde (Renderer Process – Angular Component)
Angular uygulamanızda, bir bileşen içinde bu API’yi kullanabilirsiniz. Örneğin, app.component.ts dosyanıza aşağıdaki kodu ekleyelim:
// src/app/app.component.ts
import { Component } from '@angular/core';
// window.electronAPI'yi TypeScript'e tanıtmak için
declare global {
interface Window {
electronAPI?: {
send: (channel: string, data?: any) => void;
on: (channel: string, func: (...args: any[]) => void) => void;
};
}
}
@Component({
selector: 'app-root',
template:
Angular Electron Uygulaması
Dosya İçeriği: {{ fileContent }}
,
styleUrls: ['./app.component.css']
})
export class AppComponent {
fileContent: string = 'Henüz okunmadı.';
async readFile() {
if (window.electronAPI) {
try {
// Ana sürece 'read-file' mesajı gönder ve yanıt bekle
const data = await window.electronAPI.send('read-file', path.join(app.getAppPath(), 'README.md')); // Örnek olarak README.md okuyalım
this.fileContent = data;
} catch (error) {
this.fileContent = 'Dosya okunamadı: ' + error.message;
console.error('Angular tarafında dosya okuma hatası:', error);
}
} else {
this.fileContent = 'Electron API kullanılamıyor.';
console.warn('Electron API (window.electronAPI) mevcut değil. Uygulama tarayıcıda mı çalışıyor?');
}
}
}
Bu örnekte, bir düğmeye tıklandığında readFile() metodu çağrılır. Bu metod, window.electronAPI.send() kullanarak ana sürece 'read-file' kanalından bir mesaj gönderir ve yanıtı bekler. Ana süreç, fs modülünü kullanarak dosyayı okur ve içeriğini geri döndürür.
Önemli Not: Yukarıdaki örnekte path.join(app.getAppPath(), 'README.md') ifadesi, Electron ana sürecinde çalıştırıldığında uygulamanın kök dizinindeki README.md dosyasını okumayı deneyecektir. Angular tarafında doğrudan path veya app objelerine erişiminiz yoktur. Bu nedenle, dosya yolunu Angular tarafından bir string olarak iletmeniz veya ana sürecin kendisinin bir dosya yolu belirlemesini sağlamanız gerekir. Yukarıdaki main.js tarafındaki ipcMain.handle fonksiyonuna dikkat edin, filePath parametresini alıyor. Angular tarafında bu parametreyi uygun bir şekilde (örneğin bir diyalog penceresi ile kullanıcıdan dosya seçmesini isteyerek) sağlamanız gerekir. Basitlik adına, ben örnekte README.md dosyasını okumayı gösterdim.
Sık Karşılaşılan Sorunlar ve Çözümleri
Angular ve Electron ile çalışırken karşılaşabileceğiniz bazı yaygın sorunlar ve bunların çözümleri:
-
nodeIntegrationve GüvenlikGeliştirme sırasında
webPreferences: { nodeIntegration: true, contextIsolation: false }kullanmak kolaylık sağlar. Ancak, üretim uygulamalarında bu ciddi güvenlik açıkları yaratabilir. Kötü niyetli bir web içeriği, Node.js API’lerine tam erişim sağlayabilir.Çözüm: Üretim için
nodeIntegration: falsevecontextIsolation: trueolarak ayarlayın. Ardından, Node.js API’lerine erişim sağlamak içinpreload.jsbetiği vecontextBridgekullanın. Bu, Angular uygulamanızın Node.js API’lerine doğrudan değil, yalnızcapreload.jstarafından güvenli bir şekilde açığa çıkarılan API’lere erişmesini sağlar. -
contextBridgeKullanımıcontextBridge, ana süreçten güvenli bir şekilde işleyici sürece API’ler aktarmanın en iyi yoludur. İşleyici sürecin (Angular) Node.js ortamından tamamen izole kalmasını sağlarken, yine de ana süreçle iletişim kurmasına olanak tanır.preload.jsdosyasındacontextBridge.exposeInMainWorld()kullanarak API’lerinizi tanımlayın ve Angular uygulamanızdawindow.electronAPI(veya verdiğiniz herhangi bir isim) üzerinden bunlara erişin. Bu, daha önce dosya okuma örneğinde gösterildiği gibidir. -
Dosya Yolları
Electron uygulamasında dosya yollarını yönetmek kafa karıştırıcı olabilir. Özellikle Angular uygulamasını derledikten sonra (
ng build), statik varlıkların yolları değişebilir.Çözüm:
- Angular’ı derlerken
--base-href ./kullanın:ng build --base-href ./. Bu, göreceli yolların doğru şekilde çalışmasına yardımcı olur. - Electron’da statik dosyaları işaret ederken
path.join(__dirname, 'dist/your-app-name/index.html')gibi ifadeler kullanın.__dirname, mevcut betiğin (genelliklemain.js) dizinini temsil eder. - Uygulama içinde dosya veya dizinlere erişirken Electron’un
app.getPath()veyaapp.getAppPath()gibi metodlarını kullanın. Bu, işletim sistemleri arasında tutarlı yollar sağlar.
- Angular’ı derlerken
-
Angular Router ve
HashLocationStrategyElectron, dosya tabanlı bir protokol (
file://) kullandığından, Angular Router’ın varsayılanPathLocationStrategy‘si sorunlara neden olabilir. Tarayıcıda olduğu gibi bir web sunucusu olmadığından, URL’deki yolların sunucu tarafından işlenmesi beklenmez.Çözüm: Angular uygulamanızda
HashLocationStrategykullanın. Bunuapp.module.tsdosyanızda aşağıdaki gibi yapılandırabilirsiniz:import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { LocationStrategy, HashLocationStrategy } from '@angular/common'; // Ekleyin @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, AppRoutingModule ], providers: [ { provide: LocationStrategy, useClass: HashLocationStrategy } // Ekleyin ], bootstrap: [AppComponent] }) export class AppModule { }Bu, rotaları URL’de
#işaretiyle yönetir (örneğin,file:///path/to/index.html#/home), bu da Electron’un dosya protokolüyle uyumludur.
Performans İpuçları
Electron uygulamaları, özellikle büyük Angular uygulamaları, kaynak tüketimi açısından ağır olabilir. Performansı artırmak için bazı ipuçları:
-
Gereksiz Modülleri Yüklemeyin
Ana süreçte (
main.js) yalnızca ihtiyacınız olan Node.js modüllerini yükleyin. Angular tarafında da gereksiz kütüphanelerden kaçının. -
Lazy Loading Kullanın
Angular’ın tembel yükleme (lazy loading) özelliğini kullanarak modülleri yalnızca ihtiyaç duyulduğunda yükleyin. Bu, uygulamanızın başlangıç süresini ve bellek kullanımını azaltır.
-
Bellek Kullanımını İzleyin
Electron geliştirici araçlarını (Chromium DevTools) kullanarak uygulamanızın bellek ve CPU kullanımını izleyin. Bellek sızıntılarını ve performans darboğazlarını tespit edin.
-
Gereksiz Renderer Süreçlerinden Kaçının
Her
BrowserWindowbir renderer süreci demektir ve kendi kaynaklarını tüketir. Mümkünse, tek bir pencereyle veya minimum sayıda pencereyle çalışmaya özen gösterin. -
Uygulama Boyutunu Optimize Edin
Angular uygulamanızı üretim için derlerken ağaç sallama (tree-shaking) ve AOT (Ahead-of-Time) derleme gibi optimizasyonları kullanın.
electron-builder, paketleme sırasında gereksiz dosyaları temizleyerek uygulama boyutunu daha da küçültmenize yardımcı olabilir. -
Yerel Modülleri Dikkatli Kullanın
Node.js’in yerel modülleri (C++ eklentileri) performanslı olabilir ancak Electron’un farklı sürümleriyle uyumluluk sorunları yaşayabilir. Bu tür modülleri kullanırken dikkatli olun ve
electron-rebuildgibi araçları kullanmanız gerekebilir.
Sonuç
Bu makalede, Angular ve Electron’u kullanarak sıfırdan bir masaüstü uygulaması geliştirme sürecini adım adım inceledik. Angular’ın güçlü ön uç yeteneklerini Electron’un masaüstü entegrasyonu ile birleştirmenin ne kadar kolay ve etkili olabileceğini gördük. Temel kurulumdan, geliştirme ve üretim ortamı yapılandırmasına, iki teknoloji arasında güvenli iletişim kurmaya ve sık karşılaşılan sorunların çözümüne kadar birçok konuya değindik.
Artık web geliştirme bilginizi kullanarak platformlar arası, zengin özelliklere sahip masaüstü uygulamaları oluşturmak için sağlam bir temele sahipsiniz. Angular ve Electron’un sunduğu bu sinerji, modern masaüstü uygulamaları geliştirme şeklinizi değiştirebilir. Başarılar dileriz!