如何在电子应用程序中使用Dojo Toolkit?

如何在电子应用程序中使用Dojo Toolkit?,dojo,electron,Dojo,Electron,我在探索电子,我遇到了一个障碍。我不知道如何在电子中加载和使用它 例如,下面是Dojo的简单“Hello World”: 教程:你好,Dojo! 你好 要求([ “dojo/dom”, “dojo/dom构造” ],函数(dom,domConstruct){ var greetingNode=dom.byId('greeting'); place('Dojo!',greetingNode); }); 这在浏览器中运行良好,但在Electron中根本不起作用。在谷歌上搜索了几个小时,尝试了50

我在探索电子,我遇到了一个障碍。我不知道如何在电子中加载和使用它

例如,下面是Dojo的简单“Hello World”:


教程:你好,Dojo!
你好
要求([
“dojo/dom”,
“dojo/dom构造”
],函数(dom,domConstruct){
var greetingNode=dom.byId('greeting');
place('Dojo!',greetingNode);
});
这在浏览器中运行良好,但在Electron中根本不起作用。在谷歌上搜索了几个小时,尝试了50个不同的实验后,我一无所获


有人能告诉我吗?

我有你的电子测试代码

首先,我假设您正在尝试从web加载dojo.js//阿贾克斯。古格里皮斯。。。etc可能会尝试从文件系统中提取文件。我在前面添加了
http:
。这使我能够在浏览器中打开一个.html文件并开始工作。我不确定这是否是疏忽

其次,由于浏览器窗口在默认情况下启用了节点集成,“require”已经定义,它不理解您传递给它的内容,因为它需要的是路径而不是数组。如果在关闭节点集成的情况下构建浏览器窗口,则该窗口应能正常工作:

  app.on('ready', function() {  
  mainWindow = new BrowserWindow({width: 800, height: 600, "node-integration": false});  
  mainWindow.loadUrl('file://' + __dirname + '/index.html');
  mainWindow.openDevTools();
  mainWindow.on('closed', function() {
    mainWindow = null;
  });  
});
注意
“节点集成”:false
。如果要在应用程序中使用节点集成,这可能会导致其他问题。但是,您的代码应该可以工作


我让您的测试代码在Electron中运行

首先,我假设您正在尝试从web加载dojo.js//阿贾克斯。古格里皮斯。。。etc可能会尝试从文件系统中提取文件。我在前面添加了
http:
。这使我能够在浏览器中打开一个.html文件并开始工作。我不确定这是否是疏忽

其次,由于浏览器窗口在默认情况下启用了节点集成,“require”已经定义,它不理解您传递给它的内容,因为它需要的是路径而不是数组。如果在关闭节点集成的情况下构建浏览器窗口,则该窗口应能正常工作:

  app.on('ready', function() {  
  mainWindow = new BrowserWindow({width: 800, height: 600, "node-integration": false});  
  mainWindow.loadUrl('file://' + __dirname + '/index.html');
  mainWindow.openDevTools();
  mainWindow.on('closed', function() {
    mainWindow = null;
  });  
});
注意
“节点集成”:false
。如果要在应用程序中使用节点集成,这可能会导致其他问题。但是,您的代码应该可以工作


正如Shwany所说,虽然您可以禁用
节点集成
,但我相信这将有效地使
ipc
模块无用,这可能会造成不必要的限制,因为您将无法在主进程和渲染器进程之间通信

然而,有可能通过一些欺骗,让Dojo与Electron玩得很好。在你的入门页面中,你只需要做几件事

首先,强制
主机节点
具有
false
功能。这可以通过在
dojoConfig.has
中设置来实现,例如:

var dojoConfig = {
    async: true,
    has: {
        'host-node': false
    }
}
其次,正如Shwany指出的,Dojo将看到已经存在的
require
,因此我们需要在加载Dojo之前将其移出:

// Move Electron's require out before loading Dojo
window.electronRequire = require;
delete window.require;
加载dojo.js后,如果愿意,您可以将dojo的require移到别处,并将Electron移回。您是否希望这样做可能取决于您打算如何对应用程序的客户端进行编码。从表面上看,Dojo的全局
require
是不需要的,因为您可以通过
'require'
模块ID在任何定义的模块中请求上下文敏感的
require


如果您想看到一个包含Dojo的支架式电子应用程序,我在几周前创建了它(不过请注意,它目前依赖于电子分装器)。如果你想看一个更成熟的Electron/Dojo应用程序的例子,我在几个月前写了一个名为的音乐播放器,它使用Dojo和dgrid(尽管它的支架结构与较新的样板有点不同)。

而你可以禁用
节点集成,正如Shwany所说,我相信这将有效地使
ipc
模块无用,这可能会造成不必要的限制,因为您将无法在主进程和渲染器进程之间通信

然而,有可能通过一些欺骗,让Dojo与Electron玩得很好。在你的入门页面中,你只需要做几件事

首先,强制
主机节点
具有
false
功能。这可以通过在
dojoConfig.has
中设置来实现,例如:

var dojoConfig = {
    async: true,
    has: {
        'host-node': false
    }
}
其次,正如Shwany指出的,Dojo将看到已经存在的
require
,因此我们需要在加载Dojo之前将其移出:

// Move Electron's require out before loading Dojo
window.electronRequire = require;
delete window.require;
加载dojo.js后,如果愿意,您可以将dojo的require移到别处,并将Electron移回。您是否希望这样做可能取决于您打算如何对应用程序的客户端进行编码。从表面上看,Dojo的全局
require
是不需要的,因为您可以通过
'require'
模块ID在任何定义的模块中请求上下文敏感的
require


如果您想看到一个包含Dojo的支架式电子应用程序,我在几周前创建了它(不过请注意,它目前依赖于电子分装器)。如果你想看一个更成熟的Electron/Dojo应用程序的例子,我在几个月前写了一个名为的音乐播放器,它使用Dojo和dgrid(尽管它的框架与较新的样板有点不同)。

谢谢你给出了这样一个完整的答案。那肯定行。这太棒了。我可以通过在交换之前检查“electron”来使用它来拥有一个混合的web和桌面应用程序,然后我仍然可以使用应用程序中的ElectronRequest,例如使用ElectronRequest(“fs”)来访问文件系统功能……非常感谢,这对我来说也很好。在我的例子中,强制主机节点
false
是enou