vue3 相對于 vue2 的優(yōu)化

緩存架構(gòu)

今天所說的緩存是針對于api數(shù)據(jù)的緩存。緩存實(shí)際上有兩個(gè)方面的緩存:
1、api數(shù)據(jù)的緩存
2、資源的緩存:前端的話無需要太多關(guān)心的,因?yàn)閔tml+css+js在沒有設(shè)置特殊請求頭的情況下,瀏覽器是默認(rèn)緩存的

優(yōu)化三字經(jīng):快、小、省

1、選擇更快的api
2、算法層面--盡量減少自己的操作步驟

小--說的其實(shí)是請求資源

1、通過webpack壓縮,例如:tree-shaking----(治標(biāo)不治本)
2、盡量不要去寫無用(重復(fù))的代碼----(治本)

從vue3層面談一下快和小

快方面:

1、api方面:vue3把完成響應(yīng)式的方案defineProty轉(zhuǎn)變成proxy
說明defineProty是針對于對象的api,針對于一個(gè)對象的屬性去更改權(quán)限標(biāo)簽,要想將data里面定義的數(shù)據(jù)觸發(fā)響應(yīng)式的,就得為data里面所有的數(shù)據(jù)通過defineProty去定義get和set,必須去for in data去遍歷,如果data的數(shù)據(jù)特別多的話,會非常耗時(shí)的;
proxy是代理整個(gè)對象,所以沒必要去查找data里面的每個(gè)對象,直接把data代理就好,不需要for...in循環(huán);
proxy是不會改變原對象的,defineProty是改變原對象的
2、算法方面:Diff算法
Diff算法是vue一個(gè)很重要的東西(核心),用來對比新老Dom,從而產(chǎn)生更新;
在vue2里面,每個(gè)dom是逐層逐個(gè)比對的
例如:

<div>
    <h1>123</h1>
    <p>{{msg}}</p>
</div>

在vue2中,比對順序是,先比對div,然后比對h1,再比對p,實(shí)際上,h1是沒必要去比對的,它永遠(yuǎn)不會改變的,只有寫了vue指令的p會發(fā)生變化的;
在vue3中,會首先分析出那些是綁定了vue指令的(會發(fā)生變化),只會去比對這些綁定了動態(tài)指令的,減少了需要去比對的數(shù)量,從而減少了運(yùn)行/編碼耗時(shí),速度會變快很多;

小方面:

vue3擁抱了tree-shaking
vue2是把所有的屬性(mounted,methods)都是掛載在原型鏈上的,在開發(fā)的過程中,我們實(shí)際上用的api是40%-50%的,但是會把其余沒有用到的api打包到我們的代碼中。
vue3是函數(shù)式編程,我們在打包時(shí),利用webpack的tree-shaking,將我們沒用到的api刪除,不會打包到我們的代碼中,大大減少了打包后的代碼體積。

省方面(減少請求等)

請求緩存思路

image

注意:
1、緩存架構(gòu)要保障單一性(單一性,就像在vue實(shí)例中,保證只有一個(gè)vuex)

if(!window.mycache){
    window.mycache=xxx
}

判斷window上是否已經(jīng)掛載了我們定義的緩存架構(gòu),如果掛載了,將不再去掛載,否則的話就會掛載我們的緩存架構(gòu)。
2、緩存區(qū)域的權(quán)限問題(外界區(qū)域不能操作緩存區(qū)域里面的內(nèi)容)
1>寫在匿名自調(diào)用函數(shù)里面

if(!window.mycache){
  window.mycache=(function(){
      ...
  })()
}

2>那怎樣讓其拿到or修改緩存區(qū)域里面的值呢?
為了解決這個(gè)問題,緩存區(qū)域利用閉包的原理;將緩存區(qū)域作為私有變量,存在匿名函數(shù)里面

if(!window.mycache){
    window.mycache=(function(){
        // 解決怎樣讓其拿到or修改緩存區(qū)域里面的值
        var cache = {}
        // return一些方法,去拿到or編輯緩存區(qū)域的數(shù)據(jù)
        return {
          get:function(){},
          set:function(){},
          ....
        }
    })()
}

if(!window.mycache){
    window.mycache=(function(){
        // 解決怎樣讓其拿到or修改緩存區(qū)域里面的值
        var cache = {}
        // return一些方法,去拿到or編輯緩存區(qū)域的數(shù)據(jù)
        return {
            get:function(api){
                // 如果有緩存,我們是個(gè)同步請求,但是如果沒有請求,是個(gè)異步操作,那怎樣解決這種情況呢?如果是異步,我們在接受時(shí)
                // 如果這樣寫:
                // res = window.mycache.get('api')
                // console.log(res) // 異步情況下,res是獲取不到值得,會報(bào)錯,我們將下面代碼寫在pormise中可解決
                // if(cache[api]){
                //     // 同步操作
                //     return cache[api]
                // }else{
                //     // 異步操作
                //     this.set(api).then(res=>{
                //         cache[api] = res
                //         return res
                //     })
                // }
                return new Promise((resolve,reject)=>{
                    if(cache[api]){
                        // 同步操作
                        resolve(cache[api])
                    }else{
                        // 異步操作
                        this.set(api).then(res=>{
                            cache[api] = res
                            resolve(res)
                        })
                    }
                })
                ///寫成Promise后,我們接受返回結(jié)果時(shí),只需要像下面這樣去接受數(shù)據(jù)
                // window.mycache.get('api').then(res)=>{
                        // todo
                // }

            },
            set:function(api){

            },
            remove:function(){

            }
        }
    })()
}

3>緩存得問題:
a:緩存更新的問題
如果是本地緩存,像localStorage,cookies等,里面的數(shù)據(jù)不會輕易改變,但是要是變了呢?怎樣更新呢?
方法1):webscoket,但是這種成本太大
方法2):輪詢的方式
像我們上面的例子,緩存是存于內(nèi)存的,v8引擎,64位允許存1.4G,32位允許存700MB,所以要考慮溢出的情況。

if(!window.mycache){
    window.mycache=(function(){
        // 解決
        var cache = {}
        var cacheArr = []
        // return一些方法,去拿到or編輯緩存區(qū)域的數(shù)據(jù)
        return {
            get:function(api){
                // 如果有緩存,我們是個(gè)同步請求,但是如果沒有請求,是個(gè)異步操作,那怎樣解決這種情況呢?如果是異步,我們在接受時(shí)
                // 如果這樣寫:
                // res = window.mycache.get('api')
                // console.log(res) // 異步情況下,res是獲取不到值得,會報(bào)錯,我們將下面代碼寫在pormise中可解決
                // if(cache[api]){
                //     // 同步操作
                //     return cache[api]
                // }else{
                //     // 異步操作
                //     this.set(api).then(res=>{
                //         cache[api] = res
                //         return res
                //     })
                // }
                return new Promise((resolve,reject)=>{
                    if(cache[api]){
                        // 同步操作
                        resolve(cache[api])
                    }else{
                        // 異步操作
                        this.set(api).then(res=>{
                            // 解決緩存超出內(nèi)存的問題 start
                            if(cacheArr.length > 10){
                                var _api = cacheArr.shift()
                                this.remove(_api)
                            }
                            // 解決緩存超出內(nèi)存的問題 end
                            cache[api] = res
                            cacheArr.push(api)
                            resolve(res)
                        })
                    }
                })
                //寫成Promise后,我們接受返回結(jié)果時(shí),只需要像下面這樣去接受數(shù)據(jù)
                // window.mycache.get('api').then(res)=>{
                        // ...
                // }
            },
            set:function(api){

            },
            remove:function(){

            }
        }
    })()
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,800評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內(nèi)容

  • 緩存架構(gòu) 今天所說的緩存是針對于api數(shù)據(jù)的緩存。緩存實(shí)際上有兩個(gè)方面的緩存:1、api數(shù)據(jù)的緩存2、資源的緩存:...
    彼岸歸夢閱讀 381評論 0 0
  • 回答面試題的套路 1?先說這個(gè)點(diǎn)的明確定義,或者是特性; 2?再說具體的應(yīng)用場景; 3?說說自己的看法、觀點(diǎn); 4...
    Amanda妍閱讀 58,368評論 16 137
  • 完整版推薦在線閱讀 https://interview2.poetries.top/[https://interv...
    前端進(jìn)階之旅閱讀 3,472評論 2 20
  • vue.jsjavascript 看看面試題,只是為了查漏補(bǔ)缺,看看自己那些方面還不懂。切記不要以為背了面試題,就...
    Leson17閱讀 2,829評論 0 13
  • 推薦指數(shù): 6.0 書籍主旨關(guān)鍵詞:特權(quán)、焦點(diǎn)、注意力、語言聯(lián)想、情景聯(lián)想 觀點(diǎn): 1.統(tǒng)計(jì)學(xué)現(xiàn)在叫數(shù)據(jù)分析,社會...
    Jenaral閱讀 5,734評論 0 5