在Electron

时间:2017-08-25 16:11:08

标签: javascript browser electron

我想要实现的是“真正的”应用程序般的行为,当我在MacOS上关闭应用程序时(点击X,所以应用程序仍处于停靠状态)然后再次从Dock中打开应用程序,网页内容应立即在那里。当我正在尝试为Web应用程序构建容器时,我得到的行为是,每次打开应用程序时,网页都会再次加载,从而导致UX中出现摩擦。

我已经尝试了一些肮脏的解决方法,比如在卸载窗口之前从渲染器进程调用主窗口上的.hide():

const {remote} = require('electron');
const main = remote.require('./main.js');

window.onbeforeunload = e => {
  main.hideWindow();
  e.returnValue = false;
};

并在主要流程中

exports.hideWindow = () => {
  mainWindow.hide();
};

但是那样我根本不能退出我的应用程序。

我考虑的另一个选项是将整个mainWindow DOM加载到内存中,然后在打开应用程序时,在<webview> preload script中将缓存的内容加载到webview中,一旦页面加载,覆盖webview内容,但它似乎也非常hackish。

我知道Slack的行为与我希望我的应用程序的行为完全一致,但我很难找到他们如何实现即时加载(或者可能永远不会关闭,除非从Dock中选择Quit或者Cmd + Q是命中)。

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,那么我认为有一些标准的解决方法。具体围绕

  

......永远不会关闭,除非从Dock中选择退出或   Cmd + Q被击中)

// Quit when all windows are closed.
app.on('window-all-closed', () => {
  // On OS X it is common for applications and their menu bar
  // to stay active until the user quits explicitly with Cmd + Q
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

而且......

  

再次从Dock中打开应用程序,网页内容应该在那里   立即

app.on('activate', () => {
  // On OS X it's common to re-create a window in the app when the
  // dock icon is clicked and there are no other windows open.
  if (mainWindow === null) {
    createWindow()
  }
})

答案 1 :(得分:0)

我最终得到了一个旗帜,用于管理&#34;关闭&#34;行为

let allowQuitting = false;

并像这样处理结束

function quitApp() {
  if (app) {
    allowQuitting = true;
    app.quit();
  }
}
function closeApp() {
  if (mainWindow && !mainWindow.isDestroyed()) {
    mainWindow.hide();
  }
}

关闭时,我会听取结束事件

function createWindow() {
  mainWindow.on('closed', function () {
    closeApp();
  });

  mainWindow.on('close', event => {
    if (allowQuitting === false) {
      event.preventDefault();
      closeApp();
    }
  });
  ...
}
app.on('ready', createWindow);

在激活时,我首先检查窗口是否存在

app.on('activate', function () {
  if (mainWindow === null) {
    createWindow();
  } else {
    mainWindow.show();
  }
});

由于加速器,可以使用Cmd + Q关闭应用程序:

const template = [{
  label: 'Application',
  submenu: [
    ...
    {
      label: 'Quit', accelerator: 'Command+Q', click: () => quitApp()
    }
  ]
},
...
];
Menu.setApplicationMenu(Menu.buildFromTemplate(template));

这给了我想要的结果,虽然有副作用。该应用可以使用Cmd + Q关闭,但无法从扩展坞关闭(通过选择退出)或关闭系统(说它中断了关闭)。