English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
1. Several problems exposed in the use of the project
Everyone directly uses the native syntax like localStorage['aaa'] = 'This is a sample string' these, which has a high degree of coupling. If one day we need to change the implementation method or control the storage size, a lot of code needs to be modified
For a large project, the names of keys taken by everyone are bound to repeat, and this will also cause global pollution
Due to the irregular use of localStorage, it has caused waste of storage space and insufficient space
2. Solutions
Encapsulate the usage methods of storage, and handle them uniformly
Standardize the naming rules of storage key values
Standardize the usage specifications of storage
2.1. Encapsulate unified methods
Encapsulating into a method can reduce coupling, facilitate the switch of implementation methods, and control the size of the storage amount
The change of implementation can be realized by configuring different parameters
Edit the project structure as shown in the figure
Code implementation
/* * storage.js */ /* * @Author: 石国庆 * @Desc: Encapsulation of local data storage methods * @Date: 14.11.2017 * @Ref: * https://github.com/WQTeam/web-storage-cache * https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage * @Spiegazione: Per evitare di creare nuovi oggetti, è necessario scrivere più volte * @Esempio: * * 1、Utilizzo di LocalStorage * import storage from '@/utils/storage.js' * storage.setItem('shiguoqing0',[1,2,3,4,5,6]) * storage.setItem('shiguoqing1',{userId:'dfdf',token:11232323}) * storage.setItem('shiguoqing2','dfdfdf') * console.log(storage.getItem('shiguoqing0')) * console.log(storage.getItem('shiguoqing1')) * console.log(storage.getItem('shiguoqing2')) * storage.removeItem('shiguoqing2') * * * 2、Utilizzo di SessionStorage * storage.setItem('shiguoqing0',[1,2,3,4,5,6],{type:'session'}) * * */ // TODO: implementazione di altri metodi // TODO: impostazione del tempo di scadenza /* * Implementazione del metodo * */ import local from './storage/localstorage.js' import session from './storage/session.js' import cookies from './storage/cookies.js' import json from './storage/json.js' /* * Corpo della funzione * */ let storage= { config:{ type:'local',// local,session,cookies,json expires:new Date().getTime() + 100 * 24 * 60 * 60 * 1000 }, getStorage(options){ let config={} if(options){ config=Object.assign({},this.config,options) } else{}} config=this.config } return this.createStorage(config.type) }, createStorage(name){ switch(name){ case 'local':return local;break case 'session':return session;break case 'cookies':return cookies;break case 'json':return json;break } }, getItem(key,options){ let store=this.getStorage(options) return store.getItem(key) }, setItem(key, value,options){ let store=this.getStorage(options) store.setItem(key,value) }, removeItem(key,options){ let store=this.getStorage(options) store.removeItem(key) }, getAll(){}, clear(options){ let store=this.getStorage(options) store.clear() }, key(n){}, lenght(){}, has(key){}, forEach(cb){}, deleteAllExpires(){}, // Ottieni lo spazio di archiviazione massimo: solo LocalStorage e SessionStorage possono utilizzare questo metodo getMaxSpace(options){ let store=this.getStorage(options) store.getMaxSpace() }, // Ottieni lo spazio utilizzato: solo LocalStorage e SessionStorage possono utilizzare questo metodo getUsedSpace(options){ let store=this.getStorage(options) store.getUsedSpace() } } export default storage // https://segmentfault.com/a/1190000002458488 // 5, esplora le chiavi memorizzate in localStorage // .length quantità totale dei dati, ad esempio: localStorage.length // .key(index) ottiene la chiave, ad esempio: var key=localStorage.key(index); // Note: i dati memorizzati in localStorage non possono essere condivisi tra browser diversi, ogni browser può leggere solo i propri dati, con uno spazio di archiviazione di 5M. // impostazione di scadenza // function(st, key, value, expires) { // if (st == 'l') {}} // st = window.localStorage; // expires = expires || 60; // } else { // st = window.sessionStorage; // expires = expires || 5; // } // if (typeof value != 'undefined') { // try { // return st.setItem(key, JSON.stringify({ // data: value, // expires: new Date().getTime() + expires * 1000 * 60 // })); // } catch (e) {} // } else { // var result = JSON.parse(st.getItem(key) || '{}'); // if (result && new Date().getTime() < result.expires) { // return result.data; // } else { // st.removeItem(key); // return null; // } // } // }
/* * localstorage.js * Implementazione di localstorage */ // Questo è un po' strano, il nome del file è local.js non può essere interpretato come file js export default { getItem(key){ let item = localStorage.getItem(key) // 这点要判断是字符串还是对象 let result = /^[{\[].*[}\]]$/g.test(item) if (result) { return JSON.parse(item) } else { return item } }, setItem(key, value){ // 这点要判断是字符串还是对象 if (typeof value == "string") { localStorage.setItem(key, value) } else { let item = JSON.stringify(value) localStorage.setItem(key, item) } }, removeItem(key){ localStorage.removeItem(key) }, getAll(){}, clear(){ localStorage.clear() }, key(n){}, forEach(cb){}, has(key){}, deleteAllExpires(){}, // 获取localstorage最大存储容量 getMaxSpace(){ se (!window.localStorage) { console.log('Il browser attuale non supporta localStorage!') } var test = '0123456789' var add = function (num) { num += num if (num.length == 10240) { test = num return } add(num) } add(test) var sum = test var show = setInterval(function () { sum += test try { window.localStorage.removeItem('test') window.localStorage.setItem('test', sum) console.log(sum.length / 1024 + 'KB') } console.log(sum.length / 1024 + 'KB supera il limite massimo') clearInterval(show) } }, 0.1) }, // Ottieni lo spazio di storage utilizzato da localstorage getUsedSpace(){ se (!window.localStorage) { console.log('浏览器不支持localStorage') } var size = 0 for (item in window.localStorage) { if (window.localStorage.hasOwnProperty(item)) { size += window.localStorage.getItem(item).length } } console.log('当前localStorage使用容量为' + (size / 1024).toFixed(2) + 'KB') } }
/* * session.js * sessionstorage的实现 */ export default { getItem(key){ let item = sessionStorage.getItem(key) // 这点要判断是字符串还是对象 let result = /^[{\[].*[}\]]$/g.test(item) if (result) { return JSON.parse(item) } else { return item } }, setItem(key, value){ // 这点要判断是字符串还是对象 if (typeof value == "string") { sessionStorage.setItem(key, value) } else { let item = JSON.stringify(value) sessionStorage.setItem(key, item) } }, removeItem(key){ sessionStorage.removeItem(key) }, getAll(){}, clear(){ sessionStorage.clear() }, key(n){}, forEach(cb){}, has(key){}, deleteAllExpires(){}, // 获取localstorage最大存储容量 getMaxSpace(){ if (!window.sessionStorage) { console.log('当前浏览器不支持sessionStorage!') } var test = '0123456789' var add = function (num) { num += num if (num.length == 10240) { test = num return } add(num) } add(test) var sum = test var show = setInterval(function () { sum += test try { window.sessionStorage.removeItem('test') window.sessionStorage.setItem('test', sum) console.log(sum.length / 1024 + 'KB') } console.log(sum.length / 1024 + 'KB supera il limite massimo') clearInterval(show) } }, 0.1) }, // Ottieni lo spazio di storage utilizzato da localstorage getUsedSpace(){ if (!window.sessionStorage) { console.log('Il browser non supporta sessionStorage') } var size = 0 for (item in window.sessionStorage) { if (window.sessionStorage.hasOwnProperty(item)) { size += window.sessionStorage.getItem(item).length } } console.log('La capacità di utilizzo attuale di sessionStorage è di' + (size / 1024).toFixed(2) + 'KB') } }
/* * cookies.js * L'implementazione di cooikes, probabilmente non ci sarà mai tempo per realizzarla in questa vita */ export default { getItem(key){}, setItem(key, value){}, removeItem(key){}, getAll(){}, clear(){}, key(n){}, forEach(cb){}, has(key){}, deleteAllExpires(){} }
/* * json.js * L'implementazione di json, probabilmente non ci sarà mai tempo per realizzarla in questa vita */ export default { getItem(key){}, setItem(key, value){}, removeItem(key){}, getAll(){}, clear(){}, key(n){}, forEach(cb){}, has(key){}, deleteAllExpires(){} }
2.2. Utilizzo della规范azione dello spazio dei nomi
Per prevenire la contaminazione dei valori chiave, possiamo utilizzare uno spazio dei nomi in modo ragionevole
Possiamo definire uno spazio dei nomi, ma non possiamo memorizzare molti dati nello stesso oggetto, altrimenti la quantità di operazioni successive sarà troppo grande
ad esempio, il globale sotto global
ad esempio, aggiungere un suffisso di sistema a ciascun sistema funzionale
La规范azione del nome dello spazio dei nomi di un sistema dovrebbe essere progettata in anticipo, altrimenti molte persone non seguiranno le regole durante la sviluppo reale
Le cose utilizzate globalmente devono essere evidenziate nel documento README.md
Esempio
* localStorage['SGQ.global.userAuthor']: informazioni dell'utente di accesso sono qui, menu, organizzazione, gruppo * localStorage['SGQ.global.systemName']: nome del sistema di accesso * localStorage['SGQ.vuex.state']: indirizzo di archiviazione dello stato in vuex, che contiene tutte le cose * localStorage['SGQ.wms.warehouse']: informazioni di magazzino necessarie per wms + localStorage['SGQ.wms.warehouse'].permissionId + localStorage['SGQ.wms.warehouse'].dataResource * localStorage['SGQ.tms.org']: informazioni di rete necessarie per tms + localStorage['SGQ.tms.org'].permissionId + localStorage['SGQ.tms.org'].orgName
2.3. Norme di utilizzo di storage
2.3.1. Causa della generazione del problema
La causa di questo problema è che dobbiamo fare l'accesso con permessi, e durante l'accesso, è stato segnalato che lo spazio di archiviazione non è sufficiente. Dopo aver cercato la causa, è stato scoperto che il backend ha restituito tutti i dati di migliaia di super amministratori, il che non è sufficiente. Successivamente, è stato risolto il problema modificando il contenuto dei dati restituiti dall'interfaccia del backend.
Ma questo evento ci ha portato alcuni pensieri?
La capacità di localStorage e sessionStorage è di circa 5M in diversi browser
Il localStorage e il sessionStorage sono associati al dominio
Il localStorage archiviato sotto boss.hivescm.com è di 5M
Il localStorage archiviato sotto b2b.hivescm.com è anche di 5M
Anche se questo problema è stato risolto, dobbiamo stabilire un piano per sfruttare al massimo gli spazi di 10M di localStorage e sessionStorage sotto un dominio
2.3.2. Piano di utilizzo di storage
Le cose utilizzate globalmente, condivise e archiviate permanentemente devono essere conservate in localStorage
Ricorda di cancellare tempestivamente le cose che non devono essere archiviate permanentemente dopo l'uso
Se la quantità di dati è troppo grande, non archiviare localmente, ma ottenere dinamicamente
Puoi utilizzare Indexeddb con una capacità di archiviazione più grande, ma c'è un problema di compatibilità
Puoi limitare il numero di caratteri degli oggetti da memorizzare nel storage
Utilizza pienamente e logicamente le caratteristiche di H5 di sessionStorage e localStorage
Ad esempio: i dati della lista vengono memorizzati in Vuex e anche in localStorage
Ad esempio: alcuni dati di convalida del modulo utilizzano sessionStorage
3. Altri
3.1. Estensione
Da ciò si può dedurre che per la gestione degli eventi, è necessario pulire gli eventi non utilizzati quando si esce dal componente Vue
Ad esempio: per disinstallare l'evento con this.bus.$off('aa'), usa this.bus.$on('aa')
3.2. Ottieni la lunghezza del carattere
var len = 0 for (var i = 0; i < val.length; i++) { if (val[i].match(/[^\x00-\xff]/ig) != null) //Carattere bilancato len += 2 //Se un campo è di tipo text in MySQL, se l'encoding è impostato su utf-8, un carattere cinese occupa 3 byte, gbk 2 byte else len += 1 //Un carattere semi-bilancato occupa un byte } return len
Questo è tutto il contenuto che ho raccolto sull'uso di localStorage e sessionStorage in Vue, grazie per il tuo supporto al tutorial di urla.
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright spetta agli autori, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene il diritto di proprietà, non è stato editato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a notice#oldtoolbag.com (sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, questo sito rimuoverà immediatamente il contenuto sospetto di violazione del copyright.