0

我正在探索 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 种不同的实验,我一无所获。

有人可以启发我吗?

4

2 回答 2

4

虽然您可以node-integration像 Shwany 所说的那样禁用,但我相信这会有效地使ipc模块变得无用,这可能会造成不良限制,因为您将无法在主进程和渲染器进程之间进行通信。

但是,有可能通过一些小技巧让 Dojo 与 Electron 配合得很好。在您的入口页面中,您只需要做几件事。

首先,强制host-nodehas 特征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 的 globalrequire是不需要的,因为您可以通过模块 IDrequire在任何已定义的模块中请求上下文相关。'require'

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

于 2015-06-26T04:20:54.053 回答
2

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

首先,我假设您正在尝试从 Web 加载 dojo.js。//ajax.googleapis...等可能会尝试从文件系统中提取文件。我添加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;
  });  
});

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

在此处输入图像描述

于 2015-06-26T00:23:34.747 回答