ошибка 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? Извините за непонимание. Заранее спасибо за помощь.


person BrandonKurtz    schedule 04.06.2017    source источник
comment
Что не работает, так это код tiddlywiki на веб-сайте: (tiddlywiki.com/:27506) После просмотра строк, на которые есть ссылки в трассировке стека, похоже, что tiddlywiki не может определить браузер, в котором она запущена, и, таким образом, предполагает, что она была запущена из командной строки.   -  person ccprog    schedule 04.06.2017


Ответы (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>
person Arlen Beiler    schedule 12.06.2017
comment
Это хорошая информация @ArlenBeiler. Я работаю над версией TiddlyDesktop для Electron в качестве личного проекта по изучению Javascript, node и electronic. На самом деле я смог заставить функцию сохранения работать через мой preload.js, добавив функцию сохранения, которая может использовать «fs». -- $tw.saverHandler.savers.push(новый MyTempSaver($tw.saverHandler.wiki)); - person BrandonKurtz; 13.06.2017

Вы поставили webPreferences не в том месте.

Вы должны поместить его в инициализацию для BrowserWindow, а не в url.format:

win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
        nodeIntegration: false
    }
})
person RoyalBingBong    schedule 04.06.2017
comment
Это на самом деле отлично работает для того, что я просил. Я также нашел другой способ, используя тег webView для локального HTML-файла. На самом деле это может лучше удовлетворить мои потребности, потому что позволяет мне вводить некоторые js в качестве предварительной загрузки на страницу, что позволяет мне сохранить некоторый контроль над tiddlywiki (я думаю). - person BrandonKurtz; 04.06.2017

В итоге я решил это, используя следующий код в 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>

Также протестировано с локальным file:empty.html с tiddlywiki.com, и все работает нормально. Я думаю, что это дает мне возможность предварительно загрузить файл .js для управления некоторыми событиями tiddlywiki. Придется узнать больше, чтобы проверить это.

person BrandonKurtz    schedule 04.06.2017