import pkg from '../../package.json'; // 默认缓存期限为7天 const DEFAULT_CACHE_TIME = 60 * 60 * 24 * 7; const getKey = (key: string) => `${pkg.name}-${key}`.toUpperCase(); /** * 本地缓存类 * @class Storage */ class _Storage { readonly length = 0 storage: Storage = null /** * 初始化 */ constructor(storage: Storage) { this.storage = storage; } /** * 获取存储中的第 n 个键名 */ key(index: number) { return this.storage.key(index); } /** * 获取缓存 */ getItem(key: string) { return this.storage.getItem(getKey(key)); } /** * 设置缓存 */ setItem(key: string, value: any) { return this.storage.setItem(getKey(key), value); } /** * 删除缓存 */ removeItem(key: string) { this.storage.removeItem(getKey(key)); } /** * 设置缓存 */ set(key: string, value: any, expire: number = DEFAULT_CACHE_TIME) { const json = JSON.stringify({ value, expire: expire !== null ? new Date().getTime() + expire * 1000 : null }); this.setItem(key, json); } /** * 读取缓存 */ get(key: string, def: any = null) { const item = this.getItem(key); if (item) { try { const data = JSON.parse(item); const { value, expire } = data; // 在有效期内直接返回 if (expire === null || expire >= Date.now()) { return value; } this.remove(key); } catch (e) { return def; } } return def; } /** * 从缓存删除某项 */ remove(key: string) { this.removeItem(key); } /** * 清空所有缓存 */ clear() { this.storage.clear(); } } export const local = new Proxy(new _Storage(localStorage), { get(target: _Storage, key) { if (key === 'length') { return localStorage.length } return target[key] } }); export const session = new Proxy(new _Storage(sessionStorage), { get(target: _Storage, key) { if (key === 'length') { return localStorage.length } return target[key] } });