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

How do I use Dojo Toolkit in an Electron application?

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

谁能赐教吗?

我有你的测试代码在 Electron 中运行。

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

其次,因为浏览器-window 默认启用了节点集成,'require' 已经定义并且它不理解您传递给它的内容,因为它期望的是路径而不是大批。如果您在关闭节点集成的情况下构建浏览器 window,它应该可以工作:

  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。如果您想在您的应用程序中使用节点集成,这可能会导致其他问题。但是,您的代码应该可以工作。

虽然您可以像 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 的 require 移到别处,然后将 Electron 的 require 移回去。是否要这样做可能取决于您打算如何对应用程序的客户端进行编码。从表面上看,永远不需要 Dojo 的全局 require,因为您可以通过 'require' 模块 ID 在任何定义的模块中请求上下文相关的 require

如果您想查看包含 Dojo 的脚手架 Electron 应用程序,我在几个月前创建了一个 boilerplate a few weeks ago (though be advised it's currently relying on a fork of electron-packager). If you want to see an example of a more full-blown Electron/Dojo application, I wrote a music player called Nukebox,它使用 Dojo 和 dgrid(尽管它的脚手架与较新的样板有点不同)。