bof*_*ink 5 javascript node.js electron
我正在摆弄电子。在我的应用程序中,我有一个 Javascript 对象,其中包含我的应用程序的所有设置。该对象有一个名为“渲染器”的键,我想将其传递到渲染窗口以将所有设置保存在一个方便的位置。
我一直在查看文档,我发现的最好方法如下(除了通过 BrowserWindow 的附加参数通过 process.argv 传递变量之外)。
在 main.js 中:
ipcMain.handle('getSettings', () => {
        return settings.renderer
    })
预加载.js
contextBridge.exposeInMainWorld('bridge', {
    getSettings: () => ipcRenderer.invoke('getSettings')
})
渲染器.js
    function getSettings() {
        settings = window.bridge.getSettings().then(response => {
            console.log(response)
        })
    }
    getSettings()
是否有更方便的方法来完成此任务,并且是否可以以同步方式完成?
mid*_*ing 12
Once your window has been created and loaded you can immediately send your settings object to the render process via IPC.
Use contents.send(channel, ...arg) to send data to the render process.
Use ipcRenderer.on(channel, listener)
within your preload.js script to receive data from the main process.
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();
    }
});
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);
        }
    }
);
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>
| 归档时间: | 
 | 
| 查看次数: | 10293 次 | 
| 最近记录: |