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

时间:2015-06-25 20:18:34

标签: dojo electron

我正在探索Electron而且我遇到了障碍。我无法弄清楚如何加载Dojo Toolkit并在Electron中使用它。

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

<!DOCTYPE html>
<html>
<head>
    <title>Tutorial: Hello Dojo!</title>
</head>
<body>
    <h1 id="greeting">Hello</h1>
    <!-- load Dojo -->
    <script src="//ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js"
        data-dojo-config="async: true"></script>
    <script>
        require([
            'dojo/dom',
            'dojo/dom-construct'
        ], function (dom, domConstruct) {
            var greetingNode = dom.byId('greeting');
            domConstruct.place('<em> Dojo!</em>', greetingNode);
        });
    </script>
</body>
</html>

在浏览器中工作正常,但在Electron中根本不起作用。经过几个小时的谷歌搜索并尝试了50个不同的实验,我无处可去。

有人可以赐教我吗?

2 个答案:

答案 0 :(得分:4)

虽然您可以像Shwany所说的那样禁用node-integration,但我认为这会有效地使ipc模块无效,这可能会造成不良限制,因为您无法在主要和渲染过程。

然而,通过一点点的努力,可以让Dojo与Electron玩得很好。在您的输入页面中只需要做几件事。

首先,强制host-node具有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的要求移到其他地方并移回Electron。是否要执行此操作可能取决于您打算如何编写应用程序的客户端代码。表面上看,Dojo的全局require从不需要,因为您可以通过require模块ID在任何已定义的模块中请求上下文相关的'require'

如果你想看到一个包含Dojo的脚手架Electron应用程序,我几个星期前创建了一个boilerplate(虽然被告知它目前依赖于电子包装器的分支)。如果你想看一个更全面的Electron / Dojo应用程序的例子,几个月前我写了一个名为Nukebox的音乐播放器,它使用了Dojo和dgrid(尽管它的脚手架与新版本有点不同)样板)。

答案 1 :(得分:2)

我的测试代码在Electron中工作。

首先,我假设您正在尝试从Web加载dojo.js. //ajax.googleapis ...等可能会尝试从文件系统中提取文件。我在其前面添加了http:。这允许我在浏览器中打开.html文件并工作。我不确定这是否是疏忽。

其次,由于浏览器窗口默认启用了节点集成,因此需要&#39;已经定义了,它不明白你传递给它的是什么,因为它期望路径不是数组。如果您在关闭节点集成的情况下构建浏览器窗口,它应该可以工作:

  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;
  });  
});

请注意"node-integration": false。如果要在应用程序中使用节点集成,这可能会导致其他问题。但是,您的代码应该可以工作。

enter image description here