真的没必要npm搞一堆功能特别多的库,自己简单封装了一个
mod代码
const fs = require('fs');
const path = require('path');
class JsonFileStorage {
constructor(filePath) {
this.filePath = filePath;
let data = '{}';
try {
data = fs.readFileSync(this.filePath, 'utf8');
this.lastModified = fs.statSync(this.filePath).mtime;
} catch (error) {
// 文件不存在或读取失败,初始化空对象。
this.lastModified = 0;
}
this.data = JSON.parse(data);
}
get(key, def = null) {
const currentStat = fs.statSync(this.filePath);
if (currentStat.mtime !== this.lastModified) {
// 文件已被修改,重新加载数据。
this.data = JSON.parse(fs.readFileSync(this.filePath, 'utf8'));
this.lastModified = currentStat.mtime;
}
if (this.data[key]) {
return this.data[key];
}
return def;
}
// 快速获取数据,不检查文件是否被修改。
getQuick(key, def = null) {
if (this.data[key]) {
return this.data[key];
}
return def;
}
set(key, data) {
this.data[key] = data;
this.save();
}
save() {
fs.writeFileSync(this.filePath, JSON.stringify(this.data, null, 2), 'utf8');
this.lastModified = fs.statSync(this.filePath).mtime;
}
}
module.exports = JsonFileStorage;
使用示例
const JsonFileStorage = require('./jsonFileStorage');
const storage = new JsonFileStorage('data.json');
storage.set('testKey', { value: 'testValue' });
console.log(storage.get('testKey'),storage.getQuick('testKey'));
使用说明
1. set(key,data) 是设置内容的,内容可以传递进去任何js基础数据类型
2. get(key) 默认会重新读取一下json,保证最新,但是性能会差一点点(取决于你的磁盘速度,非常一点点)
3. getQuick(key) 直接内存读取参数,非常非常快,对于你不会手动从磁盘编辑的设置项目,可以用getQuick
其他解决方案
如果你需要比较成熟的方案,更多的功能处理配置项,可以考虑:fs-extra,lowdb,configstore