Electron 文件系统与数据存储

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');
  const path = require('path');
  const fs = require('fs');

  const dataPath = path.join(app.getPath('userData'), 'config.json');

  // 写入
  fs.writeFileSync(dataPath, JSON.stringify({ key: 'value' }));

  // 读取
  let data = {};
  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
其他嵌入式 DBNoSQL 或复杂查询高性能学习曲线NeDB、PouchDB、RxDB
  • 推荐首选:electron-store
    它基于 JSON 文件存储在 userData 目录,API 简洁,支持嵌套属性、默认值和模式验证。
  const Store = require('electron-store');
  const store = new Store();

  store.set('unicorn', '🦄');
  console.log(store.get('unicorn')); // 🦄

  // 支持嵌套
  store.set('foo.bar', true);
  console.log(store.get('foo')); // { bar: true }

3. 安全性与最佳实践

  • 上下文隔离:启用 contextIsolation: true,通过 ipcMain/ipcRenderercontextBridge 通信,避免直接暴露 Node.js 到渲染进程。
  • 加密敏感数据:使用 safeStorage 模块(OS 级加密)。
  • 跨平台兼容:始终用 app.getPath 获取路径,避免硬编码。
  • 打包考虑:使用 electron-builder 等工具,确保 userData 目录不受影响。
  • 大型数据:避免污染 userData(如大缓存),可自定义 sessionData 路径。

这些方式让 Electron 应用能高效处理本地文件和数据。如果需要具体代码示例或某个场景的实现,可以提供更多细节!

文章已创建 3420

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部