@lytjs/plugin-storage 4.2.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +149 -0
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# @lytjs/plugin-storage
|
|
2
|
+
|
|
3
|
+
> Lyt.js 本地存储持久化插件 - 自动保存响应式状态到 localStorage/sessionStorage
|
|
4
|
+
|
|
5
|
+
**版本:** 4.2.0
|
|
6
|
+
|
|
7
|
+
## 安装
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @lytjs/plugin-storage
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 使用
|
|
14
|
+
|
|
15
|
+
### 注册插件
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { createApp } from '@lytjs/core'
|
|
19
|
+
import { createStorage } from '@lytjs/plugin-storage'
|
|
20
|
+
|
|
21
|
+
const storage = createStorage({
|
|
22
|
+
prefix: 'lyt_',
|
|
23
|
+
expire: 24 * 60 * 60 * 1000, // 24 小时过期
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
const app = createApp({})
|
|
27
|
+
app.use(storage)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 基本读写
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
// 设置值
|
|
34
|
+
storage.set('user', { name: 'lyt', age: 18 })
|
|
35
|
+
|
|
36
|
+
// 获取值
|
|
37
|
+
const user = storage.get('user') // { name: 'lyt', age: 18 }
|
|
38
|
+
|
|
39
|
+
// 获取值(带默认值)
|
|
40
|
+
const theme = storage.get('theme', 'light') // 'light'
|
|
41
|
+
|
|
42
|
+
// 检查 key 是否存在
|
|
43
|
+
storage.has('user') // true
|
|
44
|
+
|
|
45
|
+
// 删除值
|
|
46
|
+
storage.remove('user')
|
|
47
|
+
|
|
48
|
+
// 获取所有 key
|
|
49
|
+
storage.keys() // ['theme']
|
|
50
|
+
|
|
51
|
+
// 获取存储项数量
|
|
52
|
+
storage.size() // 1
|
|
53
|
+
|
|
54
|
+
// 清空所有(仅当前前缀的)
|
|
55
|
+
storage.clear()
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 过期时间
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
// 全局过期时间(创建时设置)
|
|
62
|
+
const storage = createStorage({ expire: 3600000 }) // 1 小时
|
|
63
|
+
|
|
64
|
+
// 单个 key 设置过期时间(覆盖全局设置)
|
|
65
|
+
storage.set('token', 'abc123', 30 * 60 * 1000) // 30 分钟过期
|
|
66
|
+
|
|
67
|
+
// 过期后自动返回 null
|
|
68
|
+
storage.get('token') // null(已过期)
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 响应式状态自动保存
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
// 监听响应式对象变化,自动保存
|
|
75
|
+
const state = reactive({ count: 0, name: 'lyt' })
|
|
76
|
+
|
|
77
|
+
const unwatch = storage.watch(state, 'count', {
|
|
78
|
+
immediate: true, // 立即保存一次
|
|
79
|
+
deep: true, // 深度监听
|
|
80
|
+
debounce: 100, // 防抖 100ms
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
// 停止监听
|
|
84
|
+
unwatch()
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 从存储恢复状态
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
const state = reactive({ count: 0, name: 'lyt' })
|
|
91
|
+
|
|
92
|
+
// 从存储恢复值到响应式对象
|
|
93
|
+
storage.restore(state, 'count', 0)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 自定义序列化
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
const storage = createStorage({
|
|
100
|
+
serialize: (value) => btoa(JSON.stringify(value)),
|
|
101
|
+
deserialize: (value) => JSON.parse(atob(value)),
|
|
102
|
+
})
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## API
|
|
106
|
+
|
|
107
|
+
### Options
|
|
108
|
+
|
|
109
|
+
| 选项 | 类型 | 默认值 | 描述 |
|
|
110
|
+
|------|------|--------|------|
|
|
111
|
+
| `prefix` | `string` | `'lyt_'` | key 前缀,避免与其他应用冲突 |
|
|
112
|
+
| `storage` | `Storage` | `localStorage` | 使用的存储对象,可替换为 `sessionStorage` |
|
|
113
|
+
| `expire` | `number` | - | 全局过期时间(毫秒),默认无过期 |
|
|
114
|
+
| `debug` | `boolean` | `false` | 是否开启调试模式 |
|
|
115
|
+
| `serialize` | `(value: any) => string` | `JSON.stringify` | 数据序列化函数 |
|
|
116
|
+
| `deserialize` | `(value: string) => any` | `JSON.parse` | 数据反序列化函数 |
|
|
117
|
+
|
|
118
|
+
### 方法
|
|
119
|
+
|
|
120
|
+
| 方法 | 签名 | 描述 |
|
|
121
|
+
|------|------|------|
|
|
122
|
+
| `set` | `<T>(key: string, value: T, expire?: number) => void` | 设置值,支持单独设置过期时间 |
|
|
123
|
+
| `get` | `<T>(key: string, defaultValue?: T) => T \| null` | 获取值,过期自动返回 null |
|
|
124
|
+
| `remove` | `(key: string) => void` | 删除值 |
|
|
125
|
+
| `clear` | `() => void` | 清空所有当前前缀的存储项 |
|
|
126
|
+
| `has` | `(key: string) => boolean` | 检查 key 是否存在且未过期 |
|
|
127
|
+
| `keys` | `() => string[]` | 获取所有当前前缀的 key |
|
|
128
|
+
| `size` | `() => number` | 获取当前前缀的存储项数量 |
|
|
129
|
+
| `watch` | `(target: any, key: string, options?: WatchOptions) => () => void` | 监听响应式对象变化,自动保存 |
|
|
130
|
+
| `restore` | `<T>(target: any, key: string, defaultValue?: T) => T` | 从存储恢复响应式对象 |
|
|
131
|
+
|
|
132
|
+
### WatchOptions
|
|
133
|
+
|
|
134
|
+
| 选项 | 类型 | 默认值 | 描述 |
|
|
135
|
+
|------|------|--------|------|
|
|
136
|
+
| `immediate` | `boolean` | `true` | 是否立即执行一次保存 |
|
|
137
|
+
| `deep` | `boolean` | `true` | 是否深度监听 |
|
|
138
|
+
| `debounce` | `number` | `100` | 防抖延迟(毫秒) |
|
|
139
|
+
|
|
140
|
+
### 特性
|
|
141
|
+
|
|
142
|
+
- **前缀隔离**:通过 `prefix` 选项隔离不同应用的存储
|
|
143
|
+
- **自动过期**:支持全局和单 key 的过期时间设置
|
|
144
|
+
- **SSR 兼容**:localStorage 不可用时自动降级为内存存储
|
|
145
|
+
- **响应式集成**:支持监听响应式对象自动保存
|
|
146
|
+
|
|
147
|
+
## License
|
|
148
|
+
|
|
149
|
+
MIT
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
"use strict";var S=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var R=(n,t)=>{for(var o in t)S(n,o,{get:t[o],enumerable:!0})},_=(n,t,o,l)=>{if(t&&typeof t=="object"||typeof t=="function")for(let g of J(t))!N.call(n,g)&&g!==o&&S(n,g,{get:()=>t[g],enumerable:!(l=j(t,g))||l.enumerable});return n};var F=n=>_(S({},"__esModule",{value:!0}),n);var B={};R(B,{createStorage:()=>A});module.exports=F(B);function M(){let n={};return{getItem:t=>{var o;return(o=n[t])!=null?o:null},setItem:(t,o)=>{n[t]=String(o)},removeItem:t=>{delete n[t]},clear:()=>{Object.keys(n).forEach(t=>delete n[t])},get length(){return Object.keys(n).length},key:t=>{var o;return(o=Object.keys(n)[t])!=null?o:null}}}function w(n,t){return`${t}${n}`}function q(n,t){return n.startsWith(t)?n.slice(t.length):n}function O(n,t){let o=null;return function(...l){o&&clearTimeout(o),o=setTimeout(()=>n.apply(this,l),t)}}function A(n={}){let{prefix:t="lyt_",storage:o=typeof localStorage!="undefined"?localStorage:M(),expire:l,debug:g=!1,serialize:x=JSON.stringify,deserialize:I=JSON.parse}=n,u=(...r)=>{};function c(r,e,i){try{let s={value:e,timestamp:Date.now()},a=i!=null?i:l;a&&(s.expire=Date.now()+a);let y=w(r,t);o.setItem(y,x(s)),u(`set ${r}`,e)}catch(s){}}function p(r,e){try{let i=w(r,t),s=o.getItem(i);if(!s)return e!=null?e:null;let a=I(s);return a.expire&&Date.now()>a.expire?(u(`${r} expired, removing`),h(r),e!=null?e:null):(u(`get ${r}`,a.value),a.value)}catch(i){return e!=null?e:null}}function h(r){try{let e=w(r,t);o.removeItem(e),u(`removed ${r}`)}catch(e){}}function P(){try{let r=T();for(let e of r)h(e);u("cleared all")}catch(r){}}function $(r){return p(r)!==null}function T(){try{let r=[];for(let e=0;e<o.length;e++){let i=o.key(e);i&&i.startsWith(t)&&r.push(q(i,t))}return r}catch(r){return[]}}function z(){return T().length}function W(r,e,i={}){let{immediate:s=!0,deep:a=!0,debounce:y=100}=i;if(typeof r.$watch=="function")return r.$watch(e,y>0?O(m=>{c(e,m)},y):m=>{c(e,m)},{immediate:s,deep:a});if(typeof globalThis.watch=="function"){let f=globalThis.watch;return f(()=>r[e],y>0?O(v=>{c(e,v)},y):v=>{c(e,v)},{immediate:s,deep:a})}let d=r[e],D=setInterval(()=>{let f=r[e];f!==d&&(d=f,c(e,f))},200);return s&&c(e,d),()=>clearInterval(D)}function K(r,e,i){let s=p(e,i);return s!==null&&(r[e]=s,u(`restored ${e}`,s)),r[e]}let b={install(r,e){r.config=r.config||{},r.config.globalProperties=r.config.globalProperties||{},r.config.globalProperties.$storage=b,typeof r.provide=="function"&&r.provide("storage",b)},set:c,get:p,remove:h,clear:P,has:$,keys:T,size:z,watch:W,restore:K,get storage(){return o}};return b}
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function D(){let o={};return{getItem:t=>{var n;return(n=o[t])!=null?n:null},setItem:(t,n)=>{o[t]=String(n)},removeItem:t=>{delete o[t]},clear:()=>{Object.keys(o).forEach(t=>delete o[t])},get length(){return Object.keys(o).length},key:t=>{var n;return(n=Object.keys(o)[t])!=null?n:null}}}function v(o,t){return`${t}${o}`}function j(o,t){return o.startsWith(t)?o.slice(t.length):o}function S(o,t){let n=null;return function(...f){n&&clearTimeout(n),n=setTimeout(()=>o.apply(this,f),t)}}function J(o={}){let{prefix:t="lyt_",storage:n=typeof localStorage!="undefined"?localStorage:D(),expire:f,debug:w=!1,serialize:O=JSON.stringify,deserialize:x=JSON.parse}=o,c=(...r)=>{};function g(r,e,i){try{let s={value:e,timestamp:Date.now()},a=i!=null?i:f;a&&(s.expire=Date.now()+a);let l=v(r,t);n.setItem(l,O(s)),c(`set ${r}`,e)}catch(s){}}function m(r,e){try{let i=v(r,t),s=n.getItem(i);if(!s)return e!=null?e:null;let a=x(s);return a.expire&&Date.now()>a.expire?(c(`${r} expired, removing`),p(r),e!=null?e:null):(c(`get ${r}`,a.value),a.value)}catch(i){return e!=null?e:null}}function p(r){try{let e=v(r,t);n.removeItem(e),c(`removed ${r}`)}catch(e){}}function I(){try{let r=h();for(let e of r)p(e);c("cleared all")}catch(r){}}function P(r){return m(r)!==null}function h(){try{let r=[];for(let e=0;e<n.length;e++){let i=n.key(e);i&&i.startsWith(t)&&r.push(j(i,t))}return r}catch(r){return[]}}function $(){return h().length}function z(r,e,i={}){let{immediate:s=!0,deep:a=!0,debounce:l=100}=i;if(typeof r.$watch=="function")return r.$watch(e,l>0?S(y=>{g(e,y)},l):y=>{g(e,y)},{immediate:s,deep:a});if(typeof globalThis.watch=="function"){let u=globalThis.watch;return u(()=>r[e],l>0?S(d=>{g(e,d)},l):d=>{g(e,d)},{immediate:s,deep:a})}let b=r[e],K=setInterval(()=>{let u=r[e];u!==b&&(b=u,g(e,u))},200);return s&&g(e,b),()=>clearInterval(K)}function W(r,e,i){let s=m(e,i);return s!==null&&(r[e]=s,c(`restored ${e}`,s)),r[e]}let T={install(r,e){r.config=r.config||{},r.config.globalProperties=r.config.globalProperties||{},r.config.globalProperties.$storage=T,typeof r.provide=="function"&&r.provide("storage",T)},set:g,get:m,remove:p,clear:I,has:P,keys:h,size:$,watch:z,restore:W,get storage(){return n}};return T}export{J as createStorage};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAeA,WAAW;AACX,KAAK,WAAW,GAAG,OAAO,GAAG,SAAS,CAAA;AAEtC,aAAa;AACb,UAAU,cAAc;IACtB,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,8BAA8B;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,qBAAqB;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,gCAAgC;IAChC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,CAAA;IAClC,6BAA6B;IAC7B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,GAAG,CAAA;CACrC;AAYD,aAAa;AACb,UAAU,aAAa;IACrB,iBAAiB;IACjB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;IAC1C,UAAU;IACV,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1D,UAAU;IACV,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IACrD,UAAU;IACV,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,mBAAmB;IACnB,KAAK,IAAI,IAAI,CAAA;IACb,kBAAkB;IAClB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;IACzB,uBAAuB;IACvB,IAAI,IAAI,MAAM,EAAE,CAAA;IAChB,eAAe;IACf,IAAI,IAAI,MAAM,CAAA;IACd,qBAAqB;IACrB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,IAAI,CAAA;IACnE,iBAAiB;IACjB,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IAC/D,aAAa;IACb,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAED,iBAAiB;AACjB,UAAU,YAAY;IACpB,iBAAiB;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW;IACX,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAeA,WAAW;AACX,KAAK,WAAW,GAAG,OAAO,GAAG,SAAS,CAAA;AAEtC,aAAa;AACb,UAAU,cAAc;IACtB,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,8BAA8B;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,qBAAqB;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,gCAAgC;IAChC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,CAAA;IAClC,6BAA6B;IAC7B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,GAAG,CAAA;CACrC;AAYD,aAAa;AACb,UAAU,aAAa;IACrB,iBAAiB;IACjB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;IAC1C,UAAU;IACV,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1D,UAAU;IACV,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IACrD,UAAU;IACV,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,mBAAmB;IACnB,KAAK,IAAI,IAAI,CAAA;IACb,kBAAkB;IAClB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;IACzB,uBAAuB;IACvB,IAAI,IAAI,MAAM,EAAE,CAAA;IAChB,eAAe;IACf,IAAI,IAAI,MAAM,CAAA;IACd,qBAAqB;IACrB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,IAAI,CAAA;IACnE,iBAAiB;IACjB,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IAC/D,aAAa;IACb,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAED,iBAAiB;AACjB,UAAU,YAAY;IACpB,iBAAiB;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW;IACX,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAoDD;;;;GAIG;AACH,iBAAS,aAAa,CAAC,OAAO,GAAE,cAAmB,GAAG,aAAa,CAgPlE;AAED,OAAO,EAAE,aAAa,EAAE,CAAA;AACxB,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,CAAA"}
|