【问题标题】:Electron app: Reference mainWindow object in another module?电子应用程序:在另一个模块中引用 mainWindow 对象?
【发布时间】:2017-03-14 09:06:30
【问题描述】:

我正在构建一个电子应用程序,其中 mainWindow 对象是在快速启动之后创建的:http://electron.atom.io/docs/tutorial/quick-start/

按照此快速入门,它是异步创建的。我遇到的问题是,例如,当我想将消息从主进程发送到渲染器进程时,我需要引用 mainWindow 对象。如果这恰好在我需要的模块中,那么我需要一种方法来让这个模块知道mainWindow 对象。

我当然可以在前面加上global.,但我知道这是非常不建议的。所以我希望做得更优雅。

我看到了这个帖子:Asynchronous nodejs module exports;这似乎提供了一个解决方案。从快速入门中获取main.js 文件(请参见上面的链接,它在那里明确显示),看来我会添加到createWindow 函数中

if( typeof callback === 'function' ){
  callback(mainWindow);
}

并将main.js 模块导出为

module.exports = function(cb){
  if(typeof mainWindow !== 'undefined'){
    cb(mainWindow); 
  } else {
    callback = cb;
  }
}

然后,在更高级别的脚本中,我会要求如下:

let main = require('./main.js');
let lib = require('./lib.js');  // Library where I need a mainWindow reference
main(function(window) {
    lib.doSomething(window);
});

lib.js 的样子

module.exports.doSomething = function(window) {
  // Do something with window object, like sending ipc messages to it
  window.webContents.send('hello-from-main', "hi!");
}

虽然原始帖子“异步 nodejs 模块导出”中的简单案例工作正常,但我无法像上面描述的那样工作;运行它抱怨Uncaught Exception: TypeError: Cannot read property 'webContents' of null 的应用程序。如果我直接main() 的回调中要求lib.js 也是这种情况(我知道也建议不要这样做)。

我承认我不完全理解帖子的简单案例,因为我对 node.js 比较陌生。这使我无法修复自己的实现,我同意这是生硬的复制/粘贴,合理地预期会失败。有人可以帮助我纠正上述方法,或者建议我采用不同的方法来使其工作吗?谢谢!

【问题讨论】:

    标签: node.js electron


    【解决方案1】:

    哎呀!魔鬼在细节中……我在main.js之上定义了

    let mainWindow = null, callback;
    

    导致错误!应该是

    let mainWindow, callback;
    

    那就完美了!

    附:我没有删除我的帖子,而是选择保留它并回答自己以供其他需要异步导出的人将来参考。

    【讨论】:

      【解决方案2】:

      我已经为此创建了 npm 包 electron-main-window

      安装:

      $ npm install electron-main-window
      
      or 
      
      $ yarn add electron-main-window
      

      用法:

      // Import ES6 way
      import { getMainWindow } from 'electron-main-window';
      const mainWindow = getMainWindow();
      
      // Import ES5 way
      const mainWindow = require('electron-main-window').getMainWindow();
      
      // e.g:
      if(mainWindow !== null ){
        mainWindow.webContents.send('mainWindowCommunication', "This is a test message");
      }
      

      【讨论】:

      • ES6 和 ES2015 是一回事。你的意思是 ES5。
      • 我遇到了这个问题,谷歌搜索把我带到了这里。试过你的包,效果很好。谢谢,Ganesh!
      • 谷歌搜索了几个小时,但找不到答案。你刚刚拯救了我的一天。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      • 2018-07-19
      • 2016-03-15
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      相关资源
      最近更新 更多