我正在构建一个电子应用,其中SUBMIT
对象是在快速启动后创建的:http://electron.atom.io/docs/tutorial/quick-start/。
按照这个快速入门,它是异步创建的。我遇到的问题是,例如当我想从main向渲染器进程发送消息时,我需要引用mainWindow
对象。如果这恰好出现在我需要的模块中,那么我需要一种方法让这个模块知道mainWindow
对象。
我当然可以用mainWindow
作为前缀,但我知道这是非常建议的。所以我希望更优雅。
我发现了这篇文章:Asynchronous nodejs module exports;这似乎提供了一个解决方案。从快速入门获取global.
文件(参见上面的链接,它已明确显示在那里),看来我会添加到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
虽然原帖中的简单情况'异步nodejs模块导出'工作正常,我不能像上面描述的那样工作;运行它抱怨的应用module.exports.doSomething = function(window) {
// Do something with window object, like sending ipc messages to it
window.webContents.send('hello-from-main', "hi!");
}
。如果我直接在Uncaught Exception: TypeError: Cannot read property 'webContents' of null
的回调中需要lib.js
(我知道也建议不要这样做),情况也是如此。
我承认我并不完全理解帖子的简单情况,因为我对节点很新。这使我无法修复自己的实现,我同意这是合理地应该预期失败的直接复制/粘贴。有人可以帮助我纠正上面的方法,或者告诉我一个不同的方法来使它工作吗?谢谢!
答案 0 :(得分:1)
Whooops!魔鬼在细节......我已经在main.js
let mainWindow = null, callback;
导致错误!应该是
let mainWindow, callback;
然后它完美无缺!
P.S。我没有删除我的帖子,而是选择保留它并回答自己,以便将来参考其他需要异步导出的人。
答案 1 :(得分:0)
我已经为此创建了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 ES2015 way
const mainWindow = require('electron-main-window').getMainWindow();
// e.g:
if(mainWindow !== null ){
mainWindow.webContents.send('mainWindowCommunication', "This is a test message");
}