Electron 中的文件系统与数据存储
Electron 作为基于 Chromium 和 Node.js 的桌面应用框架,允许开发者直接访问本地文件系统和多种数据持久化方式。这使得 Electron 应用可以像传统桌面软件一样处理文件读写、配置保存和数据管理。下面详细说明常见方式。
1.文件系统操作(使用 Node.js 的 fs 模块)
Electron 的主进程(main process)可以直接使用 Node.js 的fs模块进行文件操作,包括读取、写入、删除、创建目录等。这是最强大的方式,适用于处理任意文件。
关键 API:
const fs = require('fs');或import fs from 'fs';- 常用方法:
fs.readFile(path, 'utf8', callback):读取文件。fs.writeFile(path, data, callback):写入文件。fs.mkdir(path, { recursive: true }, callback):创建目录。fs.existsSync(path):检查文件/目录是否存在。
推荐存储路径:
使用 Electron 的app.getPath(name)获取系统推荐目录,避免跨平台问题和权限限制。app.getPath('userData'):最常用,用于存储应用配置和用户数据(Windows:C:\Users\<user>\AppData\Roaming\<App Name>;macOS:~/Library/Application Support/<App Name>;Linux:~/.config/<App Name>)。- 其他:
'documents'、'desktop'、'temp'等。
示例(主进程中读写 JSON 文件):
const{app}=require('electron');constpath=require('path');constfs=require('fs');constdataPath=path.join(app.getPath('userData'),'config.json');// 写入fs.writeFileSync(dataPath,JSON.stringify({key:'value'}));// 读取letdata={};if(fs.existsSync(dataPath)){data=JSON.parse(fs.readFileSync(dataPath,'utf8'));}渲染进程访问:
渲染进程默认禁用 Node.js(安全考虑),需通过预加载脚本(preload.js)暴露 IPC 接口,或使用contextBridge安全暴露 fs 操作。注意事项:
- 处理错误、路径编码(使用
path.join)。 - 对于敏感数据,可结合
safeStorage模块加密字符串。 - 打包后(ASAR 格式),某些 fs 操作需注意临时提取。
- 处理错误、路径编码(使用
2.数据持久化方式
Electron 支持多种存储方案,根据数据量和复杂度选择:
| 方式 | 适用场景 | 优点 | 缺点 | 示例库/模块 |
|---|---|---|---|---|
| localStorage | 小量键值对(如用户偏好) | 简单,像 Web API | 仅字符串、容量有限、易受 XSS | 直接在渲染进程使用 |
| IndexedDB | 中等结构化数据、Blob 等 | 支持复杂查询、异步 | 浏览器 API、渲染进程为主 | 直接使用或 PouchDB |
| JSON 文件 + fs | 配置、用户设置 | 灵活、可读性好 | 需手动读写、管理并发 | 手动实现 |
| electron-store | 推荐:简单配置、默认值、迁移 | 自动处理路径、支持 schema、加密 | 额外依赖 | npm i electron-store |
| SQLite | 大量关系型数据 | 查询强大、嵌入式 | 需要库(如 better-sqlite3) | better-sqlite3或 RxDB |
| 其他嵌入式 DB | NoSQL 或复杂查询 | 高性能 | 学习曲线 | NeDB、PouchDB、RxDB |
- 推荐首选:electron-store
它基于 JSON 文件存储在userData目录,API 简洁,支持嵌套属性、默认值和模式验证。constStore=require('electron-store');conststore=newStore();store.set('unicorn','🦄');console.log(store.get('unicorn'));// 🦄// 支持嵌套store.set('foo.bar',true);console.log(store.get('foo'));// { bar: true }
3.安全性与最佳实践
- 上下文隔离:启用
contextIsolation: true,通过ipcMain/ipcRenderer或contextBridge通信,避免直接暴露 Node.js 到渲染进程。 - 加密敏感数据:使用
safeStorage模块(OS 级加密)。 - 跨平台兼容:始终用
app.getPath获取路径,避免硬编码。 - 打包考虑:使用 electron-builder 等工具,确保 userData 目录不受影响。
- 大型数据:避免污染 userData(如大缓存),可自定义 sessionData 路径。
这些方式让 Electron 应用能高效处理本地文件和数据。如果需要具体代码示例或某个场景的实现,可以提供更多细节!