stokado:一个零依赖的浏览器 storage 代理库,帮 localStorage 保留类型并支持响应式订阅

6 月 25 日
 weekidjoker

最近完善了 stokado ,用来解决 localStorage / sessionStorage 用起来的几个老问题,分享给大家看看。

它本质是给任意 storage 对象套一层 Proxy ,主要做了这几件事:

  1. 类型保留序列化 —— 存 number 取出还是 number,存 Date 取出还是 Date,不用每次手动 JSON.parse 再转类型。
  2. 同标签页响应式订阅 —— 直接 on/once/off 监听某个 key 的变化,不用自己写 addEventListener('storage')(原生那个还监听不到本标签页)。
  3. 过期与一次性值 —— setItem(k, v, { expires }) 自动过期,{ disposable: true } 读一次就失效。
  4. 跨标签页同步 —— 基于 BroadcastChannel 。
  5. 配额告警 —— 接近容量上限时回调通知。
  6. 内置 7 个平台预设:cookie / 微信 / 抖音 / 支付宝 / uni-app / react-native / node 。
  7. 零依赖、框架无关、TypeScript 友好。

安装:

npm install stokado

最小示例:

import { createProxyStorage } from 'stokado'

const storage = createProxyStorage(localStorage)

// 类型保留:取出来还是 number / Date ,不是字符串
storage.count = 0
storage.count === 0 // true

storage.createdAt = new Date('2024-01-01')
storage.createdAt.getTime() // 正常可用

// 同标签页响应式订阅
storage.on('token', (newVal, oldVal) => {
  console.log('token changed:', oldVal, '->', newVal)
})

// 过期 & 一次性值
storage.setItem('token', 'abc', { expires: Date.now() + 3600_000 })
storage.setItem('flash', 'data', { disposable: true })
storage.flash // 'data'
storage.flash // undefined (读过一次即失效)

仓库: https://github.com/KID-joker/stokado

812 次点击
所在节点    分享创造
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1222920

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX