将数据从主程序传递到渲染器(电子js)

bof*_*ink 5 javascript node.js electron

我正在摆弄电子。在我的应用程序中,我有一个 Javascript 对象,其中包含我的应用程序的所有设置。该对象有一个名为“渲染器”的键,我想将其传递到渲染窗口以将所有设置保存在一个方便的位置。

我一直在查看文档,我发现的最好方法如下(除了通过 BrowserWindow 的附加参数通过 process.argv 传递变量之外)。

在 main.js 中:

ipcMain.handle('getSettings', () => {
        return settings.renderer
    })
Run Code Online (Sandbox Code Playgroud)

预加载.js

contextBridge.exposeInMainWorld('bridge', {
    getSettings: () => ipcRenderer.invoke('getSettings')
})
Run Code Online (Sandbox Code Playgroud)

渲染器.js

    function getSettings() {
        settings = window.bridge.getSettings().then(response => {
            console.log(response)
        })
    }

    getSettings()
Run Code Online (Sandbox Code Playgroud)

是否有更方便的方法来完成此任务,并且是否可以以同步方式完成?

mid*_*ing 12

Once your window has been created and loaded you can immediately send your settings object to the render process via IPC.


main.js (main process)

// Import required electron modules
const electronApp = require('electron').app;
const electronBrowserWindow = require('electron').BrowserWindow;

// Import required Node modules
const nodePath = require('path');

// Prevent garbage collection
let window;

// Settings object
let settings = {
    'renderer': {
        'key1': 'value1',
        'key2': 'value2'
    }
}

function createWindow() {
    const window = new electronBrowserWindow({
        x: 0,
        y: 0,
        width: 800,
        height: 600,
        show: false,
        webPreferences: {
            nodeIntegration: false,
            contextIsolation: true,
            preload: nodePath.join(__dirname, 'preload.js')
        }
    });

    window.loadFile('index.html')
        .then(() => { window.webContents.send('sendSettings', settings.renderer); })
        .then(() => { window.show(); });

    return window;
}

electronApp.on('ready', () => {
    window = createWindow();
});

electronApp.on('window-all-closed', () => {
    if (process.platform !== 'darwin') {
        electronApp.quit();
    }
});

electronApp.on('activate', () => {
    if (electronBrowserWindow.getAllWindows().length === 0) {
        createWindow();
    }
});
Run Code Online (Sandbox Code Playgroud)

preload.js (main process)

// Import the necessary Electron modules
const contextBridge = require('electron').contextBridge;
const ipcRenderer = require('electron').ipcRenderer;

// Exposed protected methods in the render process
contextBridge.exposeInMainWorld(
    // Allowed 'ipcRenderer' methods
    'bridge', {
        // From main to render
        sendSettings: (message) => {
            ipcRenderer.on('sendSettings', message);
        }
    }
);
Run Code Online (Sandbox Code Playgroud)

index.html (render process)

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Electron Test</title>
        <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';"/>
    </head>

    <body>
        <p>See Developer Tools -> Console</p>
    </body>

    <script>
        window.bridge.sendSettings((event, settings) => {
            console.log(settings);
        });
    </script>
</html>
Run Code Online (Sandbox Code Playgroud)