Edited at

electronでTray Iconを使った時、メニューバーからアイコンが消える

More than 1 year has passed since last update.


解決策

new Tray() を代入する変数を app.on('ready')のコールバック関数のブロック外で宣言する。


原因

Trayのインスタンスが入る変数をapp.on('ready')のコールバック内に宣言するとGCされる事がある。


GC(ガベージコレクション)とは


ガベージコレクション(英語: garbage collection; GC)とは、プログラムが動的に確保したメモリ領域のうち、不要になった領域を自動的に解放する機能である。「 ガベージコレクション」を直訳すれば「ゴミ集め」「ごみ拾い」となる。


プログラムがもうアクセスしないと判断した変数を自動的に破棄する機能。


コード例

良い例

let tray = null;

app.on('ready', () => {
tray = new Tray('path/to/icon');
});

悪い例

app.on('ready', () => {

  const appIcon = new Tray(icon); //一定時間アクセスがない場合はGCされる
});


背景

appの起動が完了するより前にTrayのインスタンスは作れない(electronがエラーを返す)。


そのためnew Tray()をapp.on('ready') 等のコールバック内に書くのが一般的。