Ошибка 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. Придется узнать больше, чтобы проверить это.

Другие вопросы по тегам