Skip to content

浏览器本地存储

简介

使用浏览器本地存储,保存离线模式下的小说文本,已经用户自定义设置的阅读器样式,文件夹树结构等。

实现细节

技术选型

使用 localStorage 实现浏览器本地存储。项目中使用第三方库 localforage 封装的 API,存储空间更大,存储数据结构更灵活,不需要直接操作底层的 API。

模块实现

增加存储模块,包括获取和设置存储的函数,存储字段的 keys,代码如下

// src/utils/store.js
import localforage from "localforage";

// 注意 异步函数获取本地存储
async function getLocalValue(key) {
  return await localforage.getItem(key);
}

function setLocalValue(key, value) {
  localforage.setItem(key, value);
}

export const NOVEL_READER_STYLE_SAVE_KEY = "novel-reader-style";
export const LOCAL_NOVELS_SAVE_KEY = "local-novels";
export const FOLDER_TREE_SAVE_KEY = "folder-tree";

export { getLocalValue, setLocalValue };

其中不同存储字段的 key 和对应的 value 含义如下

key 中文含义 value
NOVEL_READER_STYLE_SAVE_KEY 用户设置的页面的样式配置 '{"opacity":0.8,"width":"20px"}'
LOCAL_NOVELS_SAVE_KEY 离线模式下小说的存储 todo
FOLDER_TREE_SAVE_KEY 用户设置的目录结构 todo

接口设计与实现

系统存储模块,对外暴露两个存储函数 getLocalValue, setLocalValue,以及存储字段 keys。

系统功能界面,调用存储函数设置或获取本地存储。

// App.js
import {
  getLocalValue,
  setLocalValue,
  NOVEL_READER_STYLE_SAVE_KEY,
} from "./utils/store";

// 1、界面初始化,从本地存储获取配置;如果没有配置,使用默认配置;
initDataFromLocalStore = () => {
  getLocalValue(NOVEL_READER_STYLE_SAVE_KEY).then((localStyleStr) => {
    if (localStyleStr) {
      this.setState({
        style: JSON.parse(localStyleStr) || DEFAULT_STYLE,
      });
    }
  });
};

// 2、用户实现增删后,保存样式到本地存储
setLocalValue(NOVEL_READER_STYLE_SAVE_KEY, JSON.stringify(style));

单元测试

单元测试,包括对各个模块进行的单元测试和测试结果等。

因为 localStorage 是浏览器中的存储,单元测试基于 node 环境实现,所以暂不支持单元测试。

附:node 环境服务端存储可以考虑 node-localstorage 实现。

版本历史

1.0 版本,支持浏览器原生的 localStorage 存储阅读器样式。

1.3 版本,支持第三方库 localforage 存储阅读器样式。

未来,使用第三方库 localforage 存储本地小说等数据。

参考文献