<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          React 與 Vue 框架的設(shè)計思路大 PK

          共 4057字,需瀏覽 9分鐘

           ·

          2021-03-31 10:31

          正文如下

          本文是第十七屆 - 前端早早聊框架專場,也是早早聊第 122 場,來自開課吧 - 大圣 的分享

          關(guān)于我

          大家好我是花果山的大圣,今天很榮幸,有機(jī)會跟大家分享一下很多年輕人感興趣的話題《 Vue 和 React 設(shè)計思想 PK》,個人水平有限,如果有理解不到位的請傾盆,大家看完后并且再去 Vue 和 React 源碼里探索一番,一定會有所收獲, 如果沒時間的話,還可以跟我一起早起學(xué)習(xí)

          1. Github
          2. B站
          3. 掘金

          框架總覽

          前端框架繁多,在學(xué)習(xí)的時候也會陷入困惑,我們應(yīng)該抓住最主流的內(nèi)容 Vue/React,深入底層,嘗試揣摩框架作者的設(shè)計思路,開闊自己的視野,大家也不要把自己限制在框架之中,認(rèn)為工作中用到 Vue,就覺得 React 學(xué)起來沒用,有些時候我們學(xué)習(xí)競品的框架,是為了更好的認(rèn)識自己在用的框架,廢話不多說,由于 Vue 本身是個中庸的框架,再揪出設(shè)計思路理念比較極致的 Angular 和 Svelte,我們先從視圖層最火的四大框架看一下

          下載量

          對比維度

          我們從多個維度去對比前端的框架,就能看清楚現(xiàn)在各個框架的現(xiàn)狀,我們學(xué)習(xí)每個框架的設(shè)計范式,并且嘗試打破局限,就像豬八戒一樣,出了高老莊,一路好風(fēng)光

          框架發(fā)展

          字符串模板

          想看清現(xiàn)在視圖層的現(xiàn)狀,要簡單的看下之前框架的發(fā)展路線,JQuery 時代的渲染層,大部分都是基于字符串的模板,典型的框架就是 Underscore,baiduTemplate。大致的原理就是把 template 解析成一個函數(shù),缺點也很明顯,就是每次數(shù)據(jù)變化,模板內(nèi)部要全部重新渲染

          然后剛才我說的四個框架占領(lǐng)了現(xiàn)在的 Web 領(lǐng)域,核心的目標(biāo)都是一樣的,為了做出性能更好的 Web 應(yīng)用,為此各路大神八仙過海,各顯神通有這么幾個宏觀的維度

          原生 VS 抽象

          原生的就是 JavaScript 本身,比如 JQuery 基本沒有太多的抽象,一個 $ 打天下,React 抽象程度稍微復(fù)雜一些,需要理解 Component, State, Hooks, JSX 等概念就可以上手了,抽象比較多的就是 Angular,上手就需要了解十幾個概念,學(xué)習(xí)曲線很陡峭, Vue 就處在 React 和 Angular 中間,了解完 data,methods,單文件組建后就可以上手了

          運行時 VS 預(yù)編譯

          另外一個維度就是運行時和預(yù)編譯這個維度,所謂運行時,在瀏覽器內(nèi)存里進(jìn)行的任務(wù),React 的 Runtime 比較重一些,數(shù)據(jù)發(fā)生變化后,并沒有直接去操作 dom,而是生成一個新的虛擬 dom,并且通過 diff 算法得出最小的操作行為,全部都是在運行時來做的

          這個維度的另外一個極端,也就是重編譯的框架,在上線之前經(jīng)過通過工程化的方式做了預(yù)處理,典型代表就是Svelte,基本上是一個 Compiler Framework,寫的是模板和數(shù)據(jù),經(jīng)過處理后,基本解析成了原生的 dom 操作,Svelte 的性能也是最接近原生 js 的

          Vue 依然處于比較中庸的地位,在運行時和預(yù)編譯取了一個很好地權(quán)衡,保留了虛擬 dom,通過響應(yīng)式控制虛擬 dom 的顆粒度,在預(yù)編譯里又做了足夠多的性能優(yōu)化,做到了按需更新,這個一會再細(xì)聊

          框架設(shè)計的維度

          Vue 和 React

          然后我們揪出來 Vue 和 React,有一些更細(xì)化維度

          可變數(shù)據(jù) VS 不可變數(shù)據(jù)

          Vue1 就是把響應(yīng)式數(shù)據(jù)玩出了花,通過攔截操作,修改一個數(shù)據(jù)的同時收集依賴,然后數(shù)據(jù)修改的時候去通知更新 dom,體驗很是舒爽,我們修改了一個 JavaScript 的對象,視圖層就修改好了, 這是 Vue 的黑魔法,React 的虛擬 Dom 創(chuàng)建之日期,就是通過計算新老數(shù)據(jù)的 diff,去決定操作那些 dom,所以每次修改數(shù)據(jù),需要生成一份新的數(shù)據(jù),說不上優(yōu)劣之分,只不過路線不同

          這大概就是 Vue 和 React 修改數(shù)據(jù)的代碼對比

          權(quán)衡

          隨著應(yīng)用越來越復(fù)雜,React15 架構(gòu)中,dom diff 的時間超過 16.6ms,就可能會讓頁面卡頓,Vue1 中的監(jiān)聽器過多,也會讓性能雪崩,為了解決這個問題,Vue 選擇了權(quán)衡,以組件作為顆粒度,組件層面用響應(yīng)式通知,組件內(nèi)部通過 dom diff 計算 ,既控制了應(yīng)用內(nèi)部 Watcher 的數(shù)量,也控制了 dom diff 的量級??吹竭@段實現(xiàn)的時候,不僅高呼,真是妙啊

            registerComponentHook(componentId, 'lifecycle''attach', () => {
              callHook(vm, 'beforeMount')

              const updateComponent = () => {
                vm._update(vm._vnode, false)
              }
              new Watcher(vm, updateComponent, noop, nulltrue)

              vm._isMounted = true
              callHook(vm, 'mounted')
            })

          預(yù)編譯和運行時

          相關(guān)概念剛才已經(jīng)科普了,在 Vue 和 React 中的體現(xiàn),主要體現(xiàn)在 JSX 和 template 的區(qū)別上,React 是完全的 JSX,可以 JSX 在里面寫 JavaScipt,所以特點就是足夠的動態(tài),與之對應(yīng)的就是 Vue 的 template,template 的特點是語法受限,可以執(zhí)行的語法技術(shù) v-if v-for 等指定的語法,雖然不夠動態(tài),但是由于語法是可便利的,所以可以再預(yù)編譯層面做更多的預(yù)判,讓 Vue 在運行時有更好的性能

          順便放兩張尤大的 ppt 的圖,Vue3 通過在預(yù)編譯階階段做靜態(tài)標(biāo)記的優(yōu)化,做到了按需更新

          1. 純靜態(tài)的元素標(biāo)記,直接越過 diff 階段  比如 <p>hello</p>
          2. 靜態(tài)的屬性也會標(biāo)記,在 diff 的時候越過這個屬性的判斷
          3. 事件函數(shù)傳遞的時候回加上緩存
          4. v-ifv-for 內(nèi)部通過 block+ 數(shù)組的方式維護(hù)動態(tài)元素

          時間切片

          Vue3 通過靜態(tài)標(biāo)記 + 響應(yīng)式 + 虛擬 dom 的方式,控制了 diff 的顆粒度,讓 diff 的時間不會超過 16ms,但是 React 自上而下的 diff 過程,項目大了之后,一旦 diff 的時間超過 16.6ms,就會造成卡頓,對此 React 交出的解決方案就是時間切片

          簡單的來說就是把 diff 的任務(wù)按照元素拆開,利用瀏覽器的空閑時間去算 diff,React 把各種優(yōu)化的策略都留給了開發(fā)者,Vue 則是幫開發(fā)者做了很多優(yōu)化的工作

          設(shè)計思想演進(jìn)

          組合優(yōu)于集成

          這個思想設(shè)計模式里面就有定論,也是現(xiàn)在 hooks 和 composition 大行其道的原因,代碼寫出來也會更加易于維護(hù),這個圖可以很好地體現(xiàn)出可維護(hù)性上的變化

          跨端

          剛才我們講了 Svelte 可以做到直接編譯成 JavaScript,性能接近原生,這么優(yōu)秀的思想,為什么 Vue 還要保留虛擬 dom 這個額外的 runtime 損耗呢,我覺得比較重要的一個答案就是跨端

          虛擬 dom 除了可以用來計算最小的 diff 之外,另外一個重要的功能就是可以用 JavaScript 的對象來去描述一個 dom,這就是一個普通的對象,在跨端領(lǐng)域意義重大,視圖層返回的是一個對象,渲染層可以調(diào)用不同平臺的渲染 api 去繪制即可

          復(fù)習(xí)

          如上所述,請認(rèn)真學(xué)習(xí)框架,并不只是為了面試,而是框架里的優(yōu)秀思想和設(shè)計模式,匯集了頂尖開發(fā)者團(tuán)隊最優(yōu)秀的思想, 多學(xué)習(xí)別人優(yōu)秀的代碼,開闊自己的視野, 閉門造車你會發(fā)現(xiàn),很多自己的頓悟只是別人的基礎(chǔ)

          推薦書

          最后推薦一本對我漲薪幫助最大的書《算法》第四版

          算法和數(shù)據(jù)結(jié)構(gòu)一直都是前端工程師進(jìn)階的攔路虎之一,這塊內(nèi)容比較成體系,JavaScript 相關(guān)的算法書過于簡單,只能入門,不能幫你學(xué)會算法, 教材《算法導(dǎo)論》從數(shù)學(xué)的角度去推導(dǎo)算法,又太難,所以我推薦這本《算法》第四版,內(nèi)容詳實有插畫,幫助系統(tǒng)的構(gòu)架算法知識體系,書里用的是 Java,學(xué)習(xí)的時候正好用 JavaScript 實現(xiàn)一遍書里的例子,學(xué)完絕對是一個新的段位

          當(dāng)然,我最大的愛好除了王者,就是看書了,其實有很多書可以推薦,比如

          1. JavaScript 進(jìn)階的紅黃綠三套書
          2. 怎么和 HR 談錢的《談判是什么》和《優(yōu)勢談判》
          3. 和產(chǎn)品經(jīng)理吹牛逼必備壇子 《浪潮之巔》《硅谷之謎》
          4. 《軟技能2》
          5. 。。。。

          以后有機(jī)會再給大家推薦,感謝大家的支持 ,我是大圣, 下期再見

          最后

          歡迎關(guān)注【前端瓶子君】??ヽ(°▽°)ノ?
          回復(fù)「算法」,加入前端算法源碼編程群,每日一刷(工作日),每題瓶子君都會很認(rèn)真的解答喲!
          回復(fù)「交流」,吹吹水、聊聊技術(shù)、吐吐槽!
          回復(fù)「閱讀」,每日刷刷高質(zhì)量好文!
          如果這篇文章對你有幫助,在看」是最大的支持
          》》面試官也在看的算法資料《《
          “在看和轉(zhuǎn)發(fā)”就是最大的支持
          瀏覽 57
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  69爱爱视频 | 蜜芽欧美成人 | 日屄视频在线观看 | 日韩综合天堂视频 | 电影一级黄色级网站 |