ElectronのBrowserWindowを閉じた時に、closeでなく非表示にして、次回の再表示を早くする

ElectronのBrowserWindowのインスタンスを画面表示のたびに作り直すのは重い。


ので、閉じたり開いたりを繰り返す、サブのウィンドウでは、

  • BrowserWindowを破棄して、再度作るのではなく
  • いったん隠して、必要になったらウィンドウを再表示する

ように変えると少し早くなる。

実装

実現するには、closeイベントでevent.preventDefault()しておいて、
BrowserWindowをhide()すれば良い。

subwindow.on('close', (event) => {
  event.preventDefault();
  subwindow.hide();
});


ウィンドウ表示部分のコードはこうなった。

var mainwindow = ...;
var subwindow;

function showSubWindow(): void {
  if (subwindow && !subwindow.isDestroyed()) {
    subwindow.show();
    subwindow.focus();
    return;
  }

  subwindow = new BrowserWindow({
    parent: mainwindow,
    show: false
  });
  subwindow.loadFile('./subwindow.html');

  subwindow.webContents.on('did-finish-load', () => {
    subwindow.show();
    subwindow.focus();
  });
  subwindow.on('close', (event) => {
    event.preventDefault();
    subwindow.hide();
  });

  subwindow.on('closed', () => {
    subwindow = null;
  });
}

BrowserWindowの初期化処理が走らなくなるので

この実装だと、BrowserWindowの再表示時に初期化処理が走らない、
テキストフィールドへのautofocusとか動作しないので、

<!DOCTYPE html>
<html>
<head>
</head>
<body>
  <form>
    <label>検索する文字列:</label>
    <input id="search-text" class="form-control" type="search" autofocus>
  </form>
</body>
</html>

うまいこと誤魔化す必要があると思う。
こんな感じに。

window.onfocus = function(){
  document.getElementById('search-text').focus();
}

終わり

おわりじゃ!