You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开启nodeIntegration后,Electron渲染进程无法获取systemPreferences怎么办?

Electron渲染进程中systemPreferences为undefined的原因及解决办法

原因

systemPreferences是Electron的主进程专属API模块,它并未被暴露给渲染进程环境。即使你开启了nodeIntegration、关闭了contextIsolation,也无法在渲染进程中直接通过require("electron")获取到它——这和shell这类支持渲染进程调用的通用模块不同。

解决办法

方法一:使用IPC通信(官方推荐)

通过主进程与渲染进程的IPC(进程间通信)机制,让主进程代为执行systemPreferences的相关操作,再将结果返回给渲染进程。

  1. 主进程(main.js)代码修改:
const { app, BrowserWindow, ipcMain, systemPreferences } = require('electron');

// 窗口创建代码保持原有配置
const win = new BrowserWindow({
    webPreferences: {
        nodeIntegration: true,
        contextIsolation: false,
        sandbox: false
    }
});

// 监听渲染进程的请求,处理后返回结果
ipcMain.handle('invoke-system-preference', async (event, methodName, ...args) => {
    // 调用systemPreferences指定方法并传入参数
    return systemPreferences[methodName](...args);
});
  1. 渲染进程代码:
const { ipcRenderer } = require('electron');

// 封装调用函数
async function callSystemPreference(methodName, ...args) {
    return await ipcRenderer.invoke('invoke-system-preference', methodName, ...args);
}

// 示例:获取系统深色模式设置
callSystemPreference('getUserDefault', 'AppleInterfaceStyle')
    .then(result => console.log('深色模式状态:', result))
    .catch(err => console.error('调用失败:', err));

方法二:启用remote模块(仅兼容旧版本)

如果你的Electron版本低于14,可以通过开启enableRemoteModule让渲染进程间接调用主进程的systemPreferences,但此方式已被官方弃用,存在安全和性能风险。

  1. 主进程(main.js)修改窗口配置:
const win = new BrowserWindow({
    webPreferences: {
        nodeIntegration: true,
        contextIsolation: false,
        sandbox: false,
        enableRemoteModule: true // 新增开启remote模块
    }
});
  1. 渲染进程代码:
const { remote } = require('electron');
const { systemPreferences } = remote;

// 直接调用systemPreferences方法
console.log('系统语言:', systemPreferences.getUserDefault('AppleLanguages'));

内容的提问来源于stack exchange,提问作者Pedro Henrique

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 08:50:59