Electron Builder打包生成AppImage后fs模块写入JSON文件失效如何解决
问题根因
AppImage格式的Electron应用运行时,会将自身作为只读镜像临时挂载到系统目录,你代码中使用__dirname拼接的配置文件路径指向镜像内部的只读目录,无写入权限:
- 开发阶段
__dirname对应本地可读写的项目目录,所以写入功能正常 - 打包后路径指向只读镜像内的文件,仅支持读取,写入会直接失败
修复方案
改用Electron官方提供的userData目录存储配置文件,该目录是系统分配给应用的专属可写目录,跨平台都有正常读写权限,修改步骤如下:
- 主进程新增配置读写逻辑,统一操作
userData路径下的配置文件
// 主进程代码 const { app, ipcMain } = require('electron') const fs = require('fs') const path = require('path') // 配置文件固定存到userData目录 const settingsPath = path.join(app.getPath('userData'), 'settings.json') // 应用启动时如果配置不存在,复制项目默认配置到目标路径 app.on('ready', () => { const defaultSettingsPath = path.join(__dirname, 'settings.json') if (!fs.existsSync(settingsPath)) { fs.copyFileSync(defaultSettingsPath, settingsPath) } }) // 监听写配置请求 ipcMain.handle('writeSettings', (_, value) => { fs.writeFileSync(settingsPath, JSON.stringify(value), 'utf8') }) // 监听读配置请求 ipcMain.handle('readSettings', () => { return JSON.parse(fs.readFileSync(settingsPath, 'utf8')) })
- 修改预加载脚本,通过IPC调用主进程的读写能力,不要直接在预加载层操作本地文件
// 预加载脚本代码 const { contextBridge, ipcRenderer } = require('electron') contextBridge.exposeInMainWorld('api', { setSettings: (value) => ipcRenderer.invoke('writeSettings', value), getSettings: () => ipcRenderer.invoke('readSettings') })
- 前端调用逻辑调整为异步写法(ipc.invoke默认返回Promise)
// 前端调用代码 await api.setSettings(settings) // 读取配置示例 const settings = await api.getSettings()
内容的提问来源于stack exchange,提问作者Nils
相关产品推荐
相关产品推荐

