Kafayı yiyecektim arkadaş. Electron'da basit bir uygulama yapıyordum, main process'teki bir ayarı, renderer process'teki (yani arayüzdeki) bir butonun durumuna bağlamam gerekiyordu. "Kolay" dedim, ipcMain ve ipcRenderer var ya, onlarla hallederiz. Meğerse o veri taşıma işi, state yönetimini öyle bir karmaşık hale getirecek ki...
Olay şu: Arayüzden bir butona tıklandı, bunu ipcRenderer.send() ile ana proses'e bildirmem lazım. Ana proses işlemi yaptı, state'i güncelledi. Peki ya arayüz bunu nasıl bilecek? Ona da mainWindow.webContents.send() ile event fırlatacaksın. Renderer tarafında da ipcRenderer.on() ile o event'i dinleyip, component'in state'ini güncelleyeceksin.
JavaScript:
// Renderer'da (React örneği)
useEffect(() => {
const handleUpdate = (event, newData) => {
setMyState(newData); // State güncellemesi burada
};
ipcRenderer.on('data-updated', handleUpdate);
return () => ipcRenderer.removeListener('data-updated', handleUpdate);
}, []);
Gördüğün gibi, basit bir veri akışı için bile dinleyici kur, temizle, state'i ayarla... Bir de bunu birden fazla component yapmaya kalk, event isimlerini karıştır, memory leak'ler oluştur. StackOverflow'da bile "Electron state management" diye aratınca çıkan cevapların yarısı bu karmaşayı anlatıyor zaten.
Asıl kabus, React Context veya Redux gibi bir state yönetim aracı kullanırken başlıyor. Context provider'ın içindeki state'i, main process'ten gelen bir event ile güncellemek istersen, işte orası tam bir çıkmaz sokak. IPC event'leri component'lere doğrudan ulaşmıyor, önce window objesine geliyor. Sonra onu bir şekilde context'inize "sokmanız" gerekiyor. Şaka gibi ama, iki farklı dünyayı (Node.js main process ve Chromium renderer) konuşturmaya çalışırken, arada kendi state yönetim mimarin de paramparça oluyor.
Biraz araştırmadan sonra, preload script ile contextBridge kullanarak daha kontrollü bir API oluşturmanın, ya da ipcMain.handle() / ipcRenderer.invoke() ile asenkron fonksiyon çağrıları yapmanın biraz daha temiz olduğunu gördüm. En azından "gönder-bekle-al" mantığı daha net. Ama yine de, state'in senkronizasyonu için event dinlemekten kurtulamıyorsun.
Siz de Electron'da bu IPC-state ikileminde boğuldunuz mu? Bu saçma sapan veri iletim tünellerini daha temiz yönetmenin bir sırrı, bir kütüphanesi var mı? Yoksa ben mi kompleks bir şeyler yapıyorum?