Electron / javascript: node.js вызовы не работают из скрипта HTML в представлении с вкладками - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь вызвать функцию при загрузке страницы. Однако обратный вызов при загрузке страницы содержит node.js вызовов, которые, кажется, прерваны.

Приложение использует electron-tab для реализации представления с вкладками.

Код

Следующая HTML - это страница html, загруженная из вкладки: tab1.html.


<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta http-equiv="Content-Security-Policy" content="
        default-src 'self' 'unsafe-inline';
        script-src 'self' 'unsafe-inline';
        connect-src *">
        <!-- <meta http-equiv="Content-Security-Policy" content="default-src * self blob: data: gap:; style-src * self 'unsafe-inline' blob: data: gap:; script-src * 'self' 'unsafe-eval' 'unsafe-inline' blob: data: gap:; object-src * 'self' blob: data: gap:; img-src * self 'unsafe-inline' blob: data: gap:; connect-src self * 'unsafe-inline' blob: data: gap:; frame-src * self blob: data: gap:;"> -->
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>Transport</title>
    <link rel="stylesheet" href="style.css" type="text/css">
    <script type="text/javascript" src="myscript.js"></script>
</head>

<body onload="OnLoadTransport();">

</body>
</html>

JS

const Path = require('path')
const fs = require('fs');
const glob = require('glob');


function OnLoadTransport() {
    alert('Here');
    var filePaths = ListDir(__dirname, ".json");
    alert(filePaths.length.toString());
    for(var f=0; f<filePaths.length; f++) {
        alert(filePaths[f]);
        LoadJSON(filePaths[f], function (response) {
            var jsonObj = JSON.parse(response);
            alert(response);
        });
    }
}

function ListDir(rootDir, ext) {
    if (!fs.existsSync(rootDir)) {
        alert("no dir: " + rootDir);
        return [];
    }
    var filePaths = fs.readdirSync(rootDir);
    filePaths = filePaths.filter(file => file.endsWith(ext));
    return filePaths;
};

function LoadJSON(path, callback) {
    var xobj = new XMLHttpRequest();
    xobj.overrideMimeType("application/json");
    xobj.open('GET', path, true); // Replace 'my_data' with the path to your file
    xobj.onreadystatechange = function () {
        if (xobj.readyState == 4 && xobj.status == "200") {
            // Required use of an anonymous callback as .open will NOT return a value but simply returns undefined in asynchronous mode
            callback(xobj.responseText);
        }
    };
    xobj.send(null);   
}

Средство визуализации


const { remote, ipcRenderer } = require('electron');
const TabGroup = require("electron-tabs");
const mainProc = remote.require('./main.js'); // plug in main process
const parser = new DOMParser();

let tabGroup = new TabGroup({
    newTab: {
        title: 'New Tab'
    }
});

tabGroup.addTab({
    title: 'Tab 1',
    src: './tab1.html',
    closable: false,
    active: true
});

tabGroup.addTab({
    title: "Tab 2",
    src: './tab2.html',
    closable: false,
    // visible: true,
    active: false  // tab button is foregrounded
});


main.js

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

let mainWindow = null;

app.on('ready', () => {
    console.log('Hello from Electron');
    mainWindow = new BrowserWindow({
        webPreferences: {
            nodeIntegration: true,
            webviewTag: true
        }
    });

    // mainWindow.webContents.openDevTools()

    mainWindow.webContents.loadFile('./app/index.html');

    // mainWindow events, within app lifecycle
    mainWindow.webContents.on('did-fail-load', function() {
        console.log("Failed to load index.html");
    })

})

index.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta http-equiv="Content-Security-Policy" content="
        default-src 'self' 'unsafe-inline';
        script-src 'self' 'unsafe-inline';
        connect-src *">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>MAM Hub</title>
    <link rel="stylesheet" href="style.css" type="text/css">
</head>

<body>
    <!-- 2. Include the basic markup of the tabs view -->
    <div class="etabs-tabgroup">
        <div class="etabs-tabs"></div>
        <div class="etabs-buttons"></div>
    </div>
    <div class="etabs-views"></div>
    <!--
        3. Include initialization code, you can include another js file
        Or write directly the JS code here.
    -->
    <script>
        // You can also require other files to run in this process
        require('./renderer.js')
    </script>
</body>

</html>

Ожидание

На странице загрузки Я ожидаю увидеть серию предупреждений:

  1. Here
  2. Путь к найденному JSON файлу
  3. Содержимое файла JSON

Наблюдение

С этим кодом я вижу предупреждение Here. Но не более того. Тот же код, если запустить его в Electron renderer.js, просто работает: я могу видеть предупреждения о найденном файле JSON и его содержимом.

Так что я предполагаю, что вызов fs не сделал т работа. Однако в консоли Chromium ошибок нет.

Как включить поддержку node.js в этом случае? Пожалуйста, помогите.

1 Ответ

0 голосов
/ 13 февраля 2020
mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true
    }
  })

Возможно, я думаю, что вы забыли включить nodeIntegration при создании браузера. Чтобы использовать Node API на вашем renderer.js. Вы должны включить nodeIntegration при создании нового BrowserWindow на вашем main.js

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...