我正在构建一个电子应用程序,其中在快速入门之后创建了mainWindow
对象:http://electron.atom.io/docs/tutorial/quick-start/。
根据此快速入门,它是异步创建的。我遇到的问题是,例如,当我要将消息从main发送到渲染器进程时,我需要引用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
。如果我直接在lib.js
的回调中要求main()
(我也建议不要这样做),也是这种情况。
我承认我不完全了解该帖子的简单情况,因为我对node还是很陌生。这使我无法修复自己的实现,我同意这是过分的复制/粘贴,应该合理地认为它会失败。有人可以帮助我纠正上述方法,还是建议我采用其他方法使其有效?谢谢!
哇!细节决定成败...我在main.js
let mainWindow = null, callback;
导致错误!应该是
let mainWindow, callback;
那么它就完美地工作了!
P.s。我没有删除我的帖子,而是选择保留它并回答自己,以供将来需要异步导出的其他人参考。
我已经为它创建了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");
}