Electron preload.js通过contextBridge暴露的fs同步方法返回undefined问题
问题结论
不是contextBridge不支持跨上下文暴露fs模块函数,问题出在你的preload脚本代码写法错误。
核心错误点:你封装的existsSync、readFileSync方法仅内部调用了fs对应的原生方法,没有通过return关键字返回执行结果,因此渲染进程调用这两个挂载到window.api上的方法时,永远会拿到undefined。
现象对应说明
你封装的invoke、send方法都显式写了return返回IPC调用的结果,因此这几个方法可以正常工作,和两个fs方法的差异仅在于是否返回了执行结果。
额外注意事项
如果后续你开启contextIsolation: true(Electron高版本默认配置),跨上下文桥接传递值时会经过结构化克隆算法序列化:
fs.existsSync返回布尔值,属于原始类型,序列化不会有异常fs.readFileSync默认返回Node.js的Buffer实例,序列化后在渲染进程主世界拿到的不是原生Buffer对象,如果需要正常使用返回值,可以在preload层把结果转成Uint8Array,或者调用时传入编码参数(比如'utf-8')直接返回字符串,避免类型异常。
修正后的preload代码
process.once('loaded', () => { const { contextBridge, ipcRenderer } = require('electron') const fs = require('fs') const validChannels = ['requestChan', 'controlChan', 'displayChan', 'previewTxChan', 'previewRxChan'] contextBridge.exposeInMainWorld('api', { async invoke(channel, ...params) { if (validChannels.includes(channel)) return await ipcRenderer.invoke(channel, ...params) }, async send(channel, ...params) { if (validChannels.includes(channel)) return ipcRenderer.send(channel, ...params) }, on(channel, callback) { if (validChannels.includes(channel)) ipcRenderer.on(channel, callback) }, existsSync(path) { return fs.existsSync(path) }, readFileSync(path, options) { return fs.readFileSync(path, options) } }) })
内容的提问来源于stack exchange,提问作者puzzler
相关产品推荐
相关产品推荐

