electron暴露配置文件(用户可随时修改)

配置文件

一般web前端项目配置文件,写死的放在src/config下,需要打包配置的放在.env文件中。但在electron项目中,如果配置数据更改,需要每次给用户打包升级肯定是行不通的。于是外部配置文件就是有必要的,具体实现方法也比较简单,通过fs去读写外部文件就可实现

具体实现

设置文件不被压缩混淆

比如配置文件放在根目录的config文件夹

配置electron- builder文件,我这里是yml配置

复制代码
...
productName: xxx
asarUnpack:
  - resources/**
extraResources:
  - ./config
...

extraResources属性添加文件夹名称

打包后路径为/resources/config/...可以打包后查看

获取路径

process.cwd()

此时获取是node服务的根路径,再拼接上本地文件的路径

dev环境为项目根目录

prod环境为安装后文件夹路径

复制代码
const path = process.cwd()
const filePath = is.dev
  ? join(path, '/config/app.properties)
  : join(path, '/resources/config/app.properties')

读写文件

这里用到了fspathini等node模块,所以不可以在renderer里面操作,要通过主进程handle通信到渲染进程获取

复制代码
npm i ini


class ConfigHandle {
  private getConfig(_: IpcMainInvokeEvent) {
    return new Promise((resolve, reject) => {
      fs.readFile(filePath, 'utf8', function (err, dataStr) {
        if (err) {
          return reject(err.message)
        }
        resolve(ini.parse(dataStr.toString()))
      })
    })
  }

  private setConfig(_: IpcMainInvokeEvent, config) {
    return new Promise((resolve, reject) => {
      fs.readFile(filePath, 'utf8', function (err, dataStr) {
        if (err) {
          return reject(err.message)
        }
        const origin = ini.parse(dataStr.toString())
        // 这里做了先读取再assign操作,不会全量覆盖
        fs.writeFile(filePath, ini.stringify(Object.assign(origin, config)), function (err) {
          if (err) {
            return reject(err.message)
          }
          resolve('success')
        })
      })
    })
  }

  register() {
    ipcMain.handle('get-config', this.getConfig)
    ipcMain.handle('set-config', this.setConfig)
  }
}

通信到renderer

  • main

    configHandle.register()

  • preload

    const api = {
    config: {
    get: () => ipcRenderer.invoke('get-config'),
    set: (config: object) => ipcRenderer.invoke('set-config', config)
    }
    }

    contextBridge.exposeInMainWorld('api', api)

  • renderer

    export const config = await window.api.config.get()
    export const setConfig = config => window.api.config.set(config)

    const baseUrl = config.baseUrl

    setConfig({baseUrl: "http://xxx"})

这样可以通过程序修改配置文件,或者用户自己编辑修改配置文件

  • config/app.properties

    title=good title
    baseUrl=great url
    defaultPassword=unbelievable pwd

通过ini.parse会转成json格式,非常方便

相关推荐
开开心心就好12 小时前
批量提取PDF中的图片,直接导出原图
前端·javascript·支持向量机·智能手机·pdf·html·启发式算法
默_笙16 小时前
🏛 给 AI 配一间办公室:Harness Engineering 六大模块与它的实现
前端·javascript
linux_cfan18 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
天若有情67320 小时前
【纯前端小工具】公历生日转农历,批量查询每年农历生日对应的公历日期(GitHub Pages在线直接用)
前端·javascript·github pages·农历转换·lunisolar·网页小工具
林语琛21 小时前
我写的 switch…break 被 Babel 偷偷吞了
前端·javascript·babel
liuchangng21 小时前
Jev 模型研究:从生成式大模型到决策式模型——System One、RLCD 校准与采用边界
java·javascript·人工智能·python·深度学习
我命由我123451 天前
CSS - CSS 媒体查询 orientation
前端·javascript·css·html·css3·html5·js
志尊宝1 天前
Vue3 零基础每日笔记(048):嵌套路由与命名视图——后台管理系统布局雏形
前端·javascript·vue.js·笔记·html5
@tangguo1231 天前
npm 和 yarn 配置说明
前端·javascript·npm·node.js·yarn
志尊宝1 天前
Vue3 零基础每日笔记(052):路由常见坑一次排雷——404、刷新丢参数、部署白屏
前端·javascript·vue.js·笔记·html5