自己在線制作logo免費(fèi)頭像大連網(wǎng)絡(luò)營(yíng)銷(xiāo)seo
現(xiàn)象:
?這個(gè)問(wèn)題是直接指向了我使用的第三方庫(kù)good-storage,這是一個(gè)對(duì)localStorage/sessionStorage做了簡(jiǎn)單封裝的庫(kù),因?yàn)轫?xiàng)目代碼有一個(gè)緩存cache.ts有用到
?原因分析: 從表象上看是storage對(duì)象找不到getItem方法,
但實(shí)際上是ssr環(huán)境中找不到windows.localStorage對(duì)象
從這里看看good-storage源碼就能分析到這一點(diǎn):
?
var isServer = typeof window === 'undefined';var store = {/* eslint-disable no-undef */version: '1.1.1',storage: !isServer ? window.localStorage : null,session: {storage: !isServer ? window.sessionStorage : null}};
但這個(gè)代碼是有漏洞的!它在csr客戶端渲染環(huán)境中是沒(méi)有問(wèn)題的,但是在ssr環(huán)境中就一定有問(wèn)題。
因?yàn)橛袀€(gè)關(guān)鍵點(diǎn): 環(huán)境中有window對(duì)象,并不一定就會(huì)有window.localstorage對(duì)象!
?因?yàn)槲覟榱私鉀Qdocument not defined問(wèn)題,用jsdom給ssr環(huán)境做了瀏覽器環(huán)境全局模擬!
?這意味window對(duì)象是一定存在的!
所以用typeof window === 'undefined'來(lái)判斷瀏覽器環(huán)境是不準(zhǔn)確的
因?yàn)榇藭r(shí)window對(duì)象明顯是假的,它底下不可能真正有l(wèi)ocalstorage屬性!
那么就必須使用window對(duì)象和window.localStorage對(duì)象同時(shí)存在的這種雙重判斷,
才能準(zhǔn)確判斷出真實(shí)的瀏覽器環(huán)境
var isBrowser = typeof window == "object" && ( window.localStorage != undefined );var store = {/* eslint-disable no-undef */version: '1.1.1',storage: isBrowser ? window.localStorage : undefined,session: {storage: isBrowser ? window.sessionStorage : undefined}};
同時(shí)在storage對(duì)象的get方法上也加上這個(gè)判斷,這樣才能真正生效,避免反序列化失敗。
var val = isBrowser ? deserialize(this.storage.getItem(key)) : undefined;
?以上修改node_modules\good-storage\dist\storage.js源碼,然后問(wèn)題解決.