Electron 文件系统与数据存储
在 Electron 中,由于它基于 Node.js,你可以直接访问文件系统、数据库以及本地存储。
这让桌面应用能够像传统软件一样读写文件、保存配置,甚至实现复杂的数据管理。
文件系统操作
Electron 允许你在渲染进程或主进程中使用 Node.js 的内置 fs
模块进行文件操作。
Node.js fs 模块的使用
fs
模块提供了多种文件系统操作,如读取、写入、重命名、删除等。
实例
const fs = require('fs');
const path = require('path');
// 获取当前应用路径
const filePath = path.join(__dirname, 'data.txt');
// 异步读取文件
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) throw err;
console.log('文件内容:', data);
});
// 写入文件(覆盖写入)
fs.writeFile(filePath, 'Hello Electron!', (err) => {
if (err) throw err;
console.log('写入完成');
});
const path = require('path');
// 获取当前应用路径
const filePath = path.join(__dirname, 'data.txt');
// 异步读取文件
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) throw err;
console.log('文件内容:', data);
});
// 写入文件(覆盖写入)
fs.writeFile(filePath, 'Hello Electron!', (err) => {
if (err) throw err;
console.log('写入完成');
});
参数说明:
fs.readFile(path, encoding, callback)
:异步读取文件内容。fs.writeFile(path, data, callback)
:写入文件(若不存在则自动创建)。path.join()
:组合路径,跨平台兼容。
文件监听
可以使用 fs.watch
实时监听文件变化,例如用于检测配置文件或数据文件更新:
fs.watch(filePath, (eventType, filename) => { console.log(`文件变化类型: ${eventType}`); console.log(`变化的文件: ${filename}`); });
应用目录路径
Electron 提供 app.getPath(name)
方法来获取常用系统路径:
const { app } = require('electron'); console.log(app.getPath('home')); // 用户主目录 console.log(app.getPath('desktop')); // 桌面路径 console.log(app.getPath('userData')); // 应用数据目录
这些路径可以用来存放日志、缓存或用户配置文件。
本地数据存储
Electron 应用通常需要保存用户配置、缓存或状态信息。常见的存储方式包括:
localStorage 与 sessionStorage
适用于简单的键值对数据,例如主题设置、窗口状态等:
localStorage.setItem('theme', 'dark'); const theme = localStorage.getItem('theme'); console.log(theme);
区别:
localStorage
:永久存储,关闭应用后仍保留。sessionStorage
:会话级存储,关闭窗口即清除。
IndexedDB 数据库
适合存储结构化数据,适用于离线应用:
实例
const request = indexedDB.open('myDatabase', 1);
request.onupgradeneeded = function () {
const db = request.result;
db.createObjectStore('users', { keyPath: 'id' });
};
request.onsuccess = function () {
const db = request.result;
const tx = db.transaction('users', 'readwrite');
const store = tx.objectStore('users');
store.put({ id: 1, name: 'Alice', age: 25 });
};
request.onupgradeneeded = function () {
const db = request.result;
db.createObjectStore('users', { keyPath: 'id' });
};
request.onsuccess = function () {
const db = request.result;
const tx = db.transaction('users', 'readwrite');
const store = tx.objectStore('users');
store.put({ id: 1, name: 'Alice', age: 25 });
};
electron-store 使用
electron-store
是最方便的配置存储库,基于 JSON 自动持久化。
安装:
npm install electron-store
使用示例:
实例
const Store = require('electron-store');
const store = new Store();
// 保存配置
store.set('user.name', 'Tom');
store.set('theme', 'dark');
// 读取配置
console.log(store.get('user.name')); // Tom
// 删除配置
store.delete('theme');
const store = new Store();
// 保存配置
store.set('user.name', 'Tom');
store.set('theme', 'dark');
// 读取配置
console.log(store.get('user.name')); // Tom
// 删除配置
store.delete('theme');
优点:
- 自动保存到用户数据目录;
- JSON 格式,直观易编辑;
- 适用于小型持久化存储(设置、缓存等)。
数据持久化方案建议
场景 | 推荐方案 |
---|---|
简单键值对 | electron-store |
结构化数据 | IndexedDB |
大型数据文件 | fs + JSON 文件 |
离线应用数据库 | SQLite 或 LevelDB |
数据库集成
当应用需要存储大量或关系型数据时,可以集成数据库。
SQLite 集成
SQLite 是 Electron 应用最常用的嵌入式数据库。
安装依赖:
npm install sqlite3
示例代码:
实例
const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('mydata.db');
// 创建表
db.run("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)");
// 插入数据
db.run("INSERT INTO users (name, age) VALUES (?, ?)", ['Alice', 25]);
// 查询数据
db.all("SELECT * FROM users", [], (err, rows) => {
if (err) throw err;
console.log(rows);
});
const db = new sqlite3.Database('mydata.db');
// 创建表
db.run("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)");
// 插入数据
db.run("INSERT INTO users (name, age) VALUES (?, ?)", ['Alice', 25]);
// 查询数据
db.all("SELECT * FROM users", [], (err, rows) => {
if (err) throw err;
console.log(rows);
});
LevelDB 使用
LevelDB 是键值型数据库,适合缓存与高性能读写。
安装:
npm install level
使用示例:
实例
const level = require('level');
const db = level('./mydb');
// 写入数据
await db.put('username', 'Bob');
// 读取数据
const value = await db.get('username');
console.log(value);
const db = level('./mydb');
// 写入数据
await db.put('username', 'Bob');
// 读取数据
const value = await db.get('username');
console.log(value);
其他数据库选择
类型 | 适用场景 | 推荐库 |
---|---|---|
MongoDB | 云端同步、分布式 | mongoose |
MySQL | 关系型大数据 | mysql2 |
Realm | 移动端同步 | realm-js |
LokiJS | 内存数据库 | lokijs |
综合小结
在 Electron 中,数据存储方案灵活多样:
- 小数据 →
electron-store
; - 大数据 →
SQLite
; - 结构化 →
IndexedDB
; - 高速键值 →
LevelDB
; - 文件型 →
fs + JSON
。
这使 Electron 应用既能轻量运行,也能承载复杂的业务逻辑与数据存储任务。
点我分享笔记