电子浏览器 javascript 错误

electron browser javascript error

我对节点、javascript 和电子还很陌生。我只是想编写一个简单的应用程序,在浏览器 window 中打开本地 HTML 文件。本地文件嵌入了一些复杂的 javascript (tiddlywiki)。这是一些示例代码(我没有在这个中使用本地文件,但结果是一样的):

const {app, BrowserWindow} = require('electron')
const path = require('path')
const url = require('url')

let win

function createWindow () {
// Create the browser window.
win = new BrowserWindow({width: 800, height: 600})


// and load the index.html of the app.
win.loadURL(url.format({
    pathname: 'tiddlywiki.com',
    protocol: 'http:',
    slashes: true,
    webPreferences: {
      nodeIntegration: false,
 }
 }))

当电子应用程序启动时,我在浏览器开发工具中收到以下错误。

Uncaught TypeError: Cannot read property 'length' of undefined
    at Object.$tw.boot.startup (tiddlywiki.com/:27506)
    at tiddlywiki.com/:27765
    at Object.$tw.boot.decryptEncryptedTiddlers (tiddlywiki.com/:27053)
    at Object.$tw.boot.boot (tiddlywiki.com/:27763)
    at _boot (tiddlywiki.com/:27772)
    at tiddlywiki.com/:27782

我假设这是因为 node.js 对象模型的某种集成?抱歉,缺乏理解。在此先感谢您的帮助。

你把 webPreferences 放错地方了。

您必须将它放在 BrowserWindow 的初始化中而不是 url.format:

win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
        nodeIntegration: false
    }
})

我最终解决这个问题的方法是在 main.js 中使用以下代码:

 win.loadURL(url.format({
    pathname: path.join(__dirname, 'index2.html'),
    protocol: 'file:',
    slashes: true
}))

那么 index2 包含以下内容:

<html>
  <body>
    <webview id="webView" src="http://tiddlywiki.com" style="display:inline-flex; width:100%; height:100%" </webview>
  </body>    
</html>

还使用来自 tiddlywiki.com 的本地 文件:empty.html 进行了测试,并且工作正常。我认为这使我能够预加载 .js 文件来控制一些 tiddlywiki 事件。将不得不学习更多来测试它。

你走在正确的轨道上。另一种方法是将 nodeIntegration 设置为 false 并预加载一个 js 文件,这将在 BrowserWindow 上下文中获取 运行 并且一旦进程加载事件触发就能够访问 window 对象。 preload javascript 文件本身具有完整的节点集成。

我用它制作了一个 TiddlyFox 处理程序,这样我就可以在我的 Electron 应用程序中使用 TiddlyWiki 中的 TiddlyFox 保护程序。这是它的代码。其实很简单。

https://github.com/Arlen22/TiddlyWiki-Electron

如果你想将 TiddlyWiki 数据文件夹直接加载到 Electron 中,你可以尝试加载这个 HTML 文件。需要在 new BrowserWindow(...)

中将节点集成设置为 true
<!doctype html>
<html>
<head></head>
<body class="tc-body">
<script>
global.$tw = global.require("./boot/bootprefix.js").bootprefix();
global.$tw.boot.argv = ['./editions/server'];
global.$tw = require("./boot/boot.js").TiddlyWiki(global.$tw);
</script>
</body>
</html>