Ошибка JavaScript в электронном браузере
Я очень новичок в узле, JavaScript и электрон. Я просто пытаюсь написать простое приложение, которое открывает локальный файл 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? Извините за отсутствие понимания. Заранее спасибо за помощь.
3 ответа
Ты на правильном пути. Другой способ сделать это - установить для свойства nodeIntegration значение false и предварительно загрузить js-файл, который будет запускаться в контексте BrowserWindow и иметь возможность доступа к объекту окна после запуска события, загруженного процессом. Предварительно загруженный файл JavaScript имеет полную интеграцию узлов только для себя.
Я использовал его для создания обработчика TiddlyFox, чтобы я мог использовать заставку TiddlyFox, которая входит в TiddlyWiki, в моем приложении Electron. Вот код для этого. Это на самом деле очень просто.
https://github.com/Arlen22/TiddlyWiki-Electron
Если вы хотите загрузить папку данных TiddlyWiki непосредственно в Electron, вы можете попробовать загрузить этот HTML-файл. Интеграция узла должна быть установлена в true в new BrowserWindow(...)
<!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>
Вы положили 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>
Также протестировано с локальным файлом:empty.html от tiddlywiki.com, и это сработало. Я думаю, что это дает мне возможность предварительно загрузить файл.js для управления некоторыми событиями tiddlywiki. Придется узнать больше, чтобы проверить это.