我如何在 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(尽管它的脚手架与较新的样板有点不同)。
我正在探索 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(尽管它的脚手架与较新的样板有点不同)。