Geçenlerde bir Electron uygulaması için küçük bir konfigürasyon yöneticisi yazıyordum. Amacım, uygulama paketlendikten sonra bile, `asar` arşivinin içine gömülü bir JSON dosyasını okuyup, kullanıcı ayarlarıyla birleştirmekti. "Kolay iş" diye düşündüm, `fs` modülü var ya...
Meğerse kabus orada başlıyormuş.
İlk denemem, her zamanki gibi senkron okumaydı. Geliştirme ortamında (yani `asar` paketlenmemişken) mükemmel çalışıyordu.
JavaScript:
const configPath = path.join(__dirname, 'config', 'defaults.json');
const defaultConfig = JSON.parse(fs.readFileSync(configPath, 'utf8'));
Ancak, uygulamayı build edip `asar` paketine aldığım anda, her şey yıkıldı. Konsol, o meşhur `ENOENT` (No such file or directory) hatasını fırlatmaya başladı. Dosya orada ama sistem göremiyor! Kafayı yiyecektim.
Biraz araştırınca (yani StackOverflow'da deli gibi scroll edince) olayı çözdüm. Electron, `asar` arşivinden dosya okurken senkron `fs` metodlarını desteklemiyor! Bunun yerine, asenkron metodları (`fs.promises.readFile` gibi) kullanman ya da Electron'un kendi `asar` modülünü (`original-fs` gibi) işin içine katman gerekiyor.
Yani, o güvenli, rahat senkron dünyadan çıkıp, `async/await` veya `.then()` cehennemine dalmak zorundaydım. Tüm fonksiyon zincirimi yeniden yazdım.
JavaScript:
const fs = require('fs').promises; // veya require('fs/promises')
async function loadConfig() {
try {
const configPath = path.join(__dirname, 'config', 'defaults.json');
const data = await fs.readFile(configPath, 'utf8');
return JSON.parse(data);
} catch (error) {
console.error('[B]Config[/B] okuma hatası:', error);
return {};
}
}
Sonuç olarak, Electron ile `asar` paketlenmiş dosyalar üzerinde çalışırken, direkt `fs.readFileSync` kullanma. Her zaman asenkron yöntemlere (`fs.promises`) yönel. Veya daha derinlemesine kontrol için `original-fs` modülüne bak.
Şaka gibi ama, iki satırlık bir dosya okuma işlemi için saatlerimi harcadım. Geliştirme (unpacked) ve production (packed) ortamları arasındaki bu fark, gerçekten sinsi bir tuzak.
Siz de Electron'da `asar` ile çalışırken böyle tuhaf senkron/asenkron geçiş sorunları yaşadınız mı? `original-fs` kullanmak bu tarz durumlarda daha mı güvenli, yoksa `fs.promises` yeterli mi?