With their 5MB, localStorage and sessionStorage are great places to store data. You can add or remove item, and also decide to save data along the browser/tab session (sessionStorage) or persist them even browser will be closed (localStorage).
They help devs to improve Web Performance:
- Reduce network traffic
- Significantly speed up display times
- Cache data from RPC calls
- Load cached data on startup (faster startup)
- Save temporary state
- Restore state upon app reentry
- Prevent work loss from network disconnects
If you want to learn all about Storage Web API, please read: MDN Storage Web API
However both storages have a great limit: all items must be string. Numbers, Arrays, Objects... must be convert in string!
For this reason work with localStorage/sessionStorage can be frustrated: always need to remember to reconvert to the original item type.
The Rolling Store (trs) gives the opportunity to work with localStorage/sessionStorage as you work with a simple object.
import trs from "/path/to/the-rolling-store"; const session = true; const mystore = trs(session);
session
is a boolean and tells to The Rolling Store which Storage has to use: true
for sessionStorage, false
localStorage. Default: true
.
Now, you can add properties as you prefer
mystore.prop1 = "prop1"; // string mystore.prop2 = 12.99; // number mystore.prop3 = true; // boolean mystore.prop4 = { x: 1, y: "hello, world", z: false }; // object mystore["prop5"] = "prop5";
and reading them:
console.log(mystore.prop1); // prop1 console.log(mystore.prop2); // 12.99 console.log(mystore.prop3); // true console.log(mystore.prop4); /* { x: 1, y: "hello, world", z: false } */ console.log(mystore["prop5"]); // prop5
trs
guarantees the original type.
trs
exposes the following methods: remove
, subscribe
and clear
.
remove
method delete a property:
mystore.remove("prop1"); console.log(mystore.prop1); // null
subscribe
gives the possibility to listen to value changes of a specific property: the callback will be executed every value changing.
const subscription = mystore.subscribe("prop2", (val) => { console.log("prop2", val); }); // To unsubscribe subscription.unsubscribe();
clear
method deletes all properties added into store.
mystore.clear();
Here The Rolling Store source code:
// /path/to/the-rolling-store.js import { BehaviorSubject } from "rxjs"; export default (session = true) => { const storage = session ? sessionStorage : localStorage; const subjects = {}; const getSubject = (prop, value) => { if (!(prop in subjects)) { subjects[prop] = new BehaviorSubject(value); } return subjects[prop]; }; const pubUpdate = (prop, value) => { getSubject(prop).next(value); }; const getSubscription = (prop, callback) => { return getSubject(prop).subscribe((v) => callback(v)); }; const subscribe = new Proxy(getSubscription, { apply(target, thisArg, args) { return target(...args); } }); const remove = new Proxy((prop) => storage.removeItem(prop), { apply(target, thisArg, args) { return target(...args); } }); const clear = new Proxy(storage.clear, { apply(target, thisArg, args) { return target(...args); } }); const key = new Proxy((index) => storage.key(index), { apply: (target, thisArg, args) => { return target(...args); } }); const methodsMap = { subscribe, remove, clear, key }; return new Proxy(storage, { get(store, prop) { if (prop in methodsMap) { return methodsMap[prop]; } return JSON.parse(store.getItem(prop)); }, set(store, prop, value) { store.setItem(prop, JSON.stringify(value)); pubUpdate(prop, value); return true; } }); };
Go to Codesandbox to play with The Rolling Store
Feel free to correct or suggest improvements. It's a starting point... and this is my first tech article in english! 😱
Top comments (0)