请查看this。这个对我有用。我正在使用 CRA 和 Electron。
preload.js
const { contextBridge, ipcRenderer } = require('electron');
const MESSAGE_TYPES = ipcRenderer.sendSync('GET_MESSAGE_TYPES');
require = null;
class SafeIpcRenderer { ... }
const registerMessages = () => {
const safeIpcRenderer = new SafeIpcRenderer(Object.values(MESSAGE_TYPES));
contextBridge.exposeInMainWorld('ELECTRON', {
sendMessage: safeIpcRenderer.send,
onReceiveMessage: safeIpcRenderer.on,
MESSAGE_TYPES,
});
};
registerMessages();
main.js
const registerPreloadImports = require('./src/client/preloadUtils');
// Required if sandbox flag is set to true. Non-electron modules cannot be directly imported in preload script.
// For more info please check https://www.electronjs.org/docs/api/sandbox-option
registerPreloadImports();
let mainWindow = new BrowserWindow({
// Web preferences for mainWindow
webPreferences: {
preload: path.join(__dirname, 'src/client/preload.js'),
contextIsolation: true, // TODO: Remove it once it's enabled by default (from Electron v12)
disableBlinkFeatures: 'Auxclick',
sandbox: true,
// https://www.electronjs.org/docs/api/sandbox-option#status
enableRemoteModule: false,
},
});
preloadUtils.js
const { ipcMain } = require('electron');
const MESSAGE_TYPES = require('../utils/messageTypes');
const registerPreloadImports = () => {
ipcMain.on(MESSAGE_TYPES.GET_MESSAGE_TYPES, (event, message) => {
event.returnValue = MESSAGE_TYPES;
});
};
module.exports = registerPreloadImports;
messageTypes.js
module.exports = {
DNS_ONLINE_STATUS: 'dns-online-status',
APP_ONLINE_STATUS: 'online-status',
ONLINE_MODEL_SYNC: 'online-model-sync',
APP_ONLINE: 'app-online',
INITIAL_DATA_SYNC: 'INITIAL_DATA_SYNC',
GET_MESSAGE_TYPES: 'GET_MESSAGE_TYPES',
};
actions.js(渲染器)
const { MESSAGE_TYPES, sendMessage } = window.ELECTRON || {};
if (!MESSAGE_TYPES) return;
const actions = {
[MESSAGE_TYPES.INITIAL_DATA_SYNC]: (event, initialSync) => {
console.log(MESSAGE_TYPES.INITIAL_DATA_SYNC, initialSync);
},
[MESSAGE_TYPES.ONLINE_MODEL_SYNC]: (event, message) => {
console.log(MESSAGE_TYPES.ONLINE_MODEL_SYNC, message);
},
[MESSAGE_TYPES.APP_ONLINE]: (event, isOnline) => {
console.log(MESSAGE_TYPES.APP_ONLINE, isOnline);
},
};
const registerActions = () => {
const { onReceiveMessage } = window.ELECTRON;
Object.keys(actions).forEach((messageType) => {
onReceiveMessage(messageType, actions[messageType]);
});
};
registerActions();
package.json
{
"dependencies": {
"cross-env": "7.0.2",
"deepmerge": "4.2.2",
"electron-is-dev": "1.2.0",
"electron-log": "4.2.2",
"electron-updater": "4.3.1",
"sequelize-cli": "6.2.0",
"sequelize": "6.3.3",
"sqlite3": "5.0.0",
"umzug": "2.3.0",
"uuid": "8.2.0"
},
"devDependencies": {
"concurrently": "5.2.0",
"electron": "9.1.0",
"electron-builder": "22.7.0",
"spectron": "11.1.0",
"wait-on": "5.1.0",
"xvfb-maybe": "0.2.1"
}
}