React 與 Vue 框架的設計思路大 PK

大家好,我是若川。今天分享一篇框架設計思路的好文。


關于我

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

  1. Github

  2. B站

  3. 掘金

框架總覽

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

下載量

對比維度

我們從多個維度去對比前端的框架,就能看清楚現在各個框架的現狀,我們學習每個框架的設計范式,并且嘗試打破局限,就像豬八戒一樣,出了高老莊,一路好風光

框架發展

字符串模板

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

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

原生 VS 抽象

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

運行時 VS 預編譯

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

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

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

框架設計的維度

Vue 和 React

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

可變數據 VS 不可變數據

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

這大概就是 Vue 和 React 修改數據的代碼對比

權衡

隨著應用越來越復雜,React15 架構中,dom diff 的時間超過 16.6ms,就可能會讓頁面卡頓,Vue1 中的監聽器過多,也會讓性能雪崩,為了解決這個問題,Vue 選擇了權衡,以組件作為顆粒度,組件層面用響應式通知,組件內部通過 dom diff 計算 ,既控制了應用內部 Watcher 的數量,也控制了 dom diff 的量級。看到這段實現的時候,不僅高呼,真是妙啊

??registerComponentHook(componentId,?'lifecycle',?'attach',?()?=>?{callHook(vm,?'beforeMount')const?updateComponent?=?()?=>?{vm._update(vm._vnode,?false)}new?Watcher(vm,?updateComponent,?noop,?null,?true)vm._isMounted?=?truecallHook(vm,?'mounted')})

預編譯和運行時

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

順便放兩張尤大的 ppt 的圖,Vue3 通過在預編譯階階段做靜態標記的優化,做到了按需更新

  1. 純靜態的元素標記,直接越過 diff 階段 ?比如 <p>hello</p>

  2. 靜態的屬性也會標記,在 diff 的時候越過這個屬性的判斷

  3. 事件函數傳遞的時候回加上緩存

  4. v-ifv-for 內部通過 block+ 數組的方式維護動態元素

時間切片

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

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

設計思想演進

組合優于集成

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

跨端

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

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

復習

如上所述,請認真學習框架,并不只是為了面試,而是框架里的優秀思想和設計模式,匯集了頂尖開發者團隊最優秀的思想, 多學習別人優秀的代碼,開闊自己的視野, 閉門造車你會發現,很多自己的頓悟只是別人的基礎

推薦書

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

算法和數據結構一直都是前端工程師進階的攔路虎之一,這塊內容比較成體系,JavaScript 相關的算法書過于簡單,只能入門,不能幫你學會算法, 教材《算法導論》從數學的角度去推導算法,又太難,所以我推薦這本《算法》第四版,內容詳實有插畫,幫助系統的構架算法知識體系,書里用的是 Java,學習的時候正好用 JavaScript 實現一遍書里的例子,學完絕對是一個新的段位

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

  1. JavaScript 進階的紅黃綠三套書

  2. 怎么和 HR 談錢的《談判是什么》和《優勢談判》

  3. 和產品經理吹牛逼必備壇子 《浪潮之巔》《硅谷之謎》

  4. 《軟技能2》

  5. 。。。。

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


常駐推薦閱讀

若川知乎高贊:有哪些必看的 JS庫?
我在阿里招前端,我該怎么幫你?(現在還可以加模擬面試群)
如何拿下阿里巴巴 P6 的前端 Offer
如何準備阿里P6/P7前端面試--項目經歷準備篇
大廠面試官常問的亮點,該如何做出?
如何從初級到專家(P4-P7)打破成長瓶頸和有效突破
若川知乎問答:2年前端經驗,做的項目沒什么技術含量,怎么辦?

常駐末尾

你好,我是若川,江西人~(點擊藍字了解我)歷時一年只寫了一個學習源碼整體架構系列?有哪些必看的JS庫:jQuery、underscore、lodash、sentry、vuex、axios、koa、redux

  1. 關注若川視野,回復"pdf" 領取優質前端書籍pdf,回復"1",可加群長期交流學習

  2. 我的博客地址:https://lxchuan12.gitee.io?歡迎收藏

  3. 覺得文章不錯,可以?分享、點贊、在看?呀^_^另外歡迎留言交流~

小提醒:若川視野公眾號面試、源碼等文章合集在菜單欄中間【源碼精選】按鈕,歡迎點擊閱讀,也可以星標我的公眾號,便于查找

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276120.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276120.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276120.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php foreach id是否存在數組_請糾正這 5 個 PHP 編碼小陋習

在做過大量的代碼審查后&#xff0c;我經常看到一些重復的錯誤&#xff0c;以下是糾正這些錯誤的方法。在循環之前測試數組是否為空$items [];// ...if (count($items) > 0) {foreach ($items as $item) {// process on $item ...}}foreach以及數組函數 (array_*) 可以處理…

1161轉進制(C語言)

一&#xff1a;題目 二&#xff1a;思路分析 1.首先該題目讓我們使用遞歸求十進制轉其他進制 2.其次&#xff0c;我們要知道十進制轉換為其他進制怎么轉換&#xff0c;以例題所給的數據為例 由此圖可以看出&#xff0c;十進制轉換為其他進制&#xff0c;是輾轉相除法&#xf…

PHP異常處理

轉載鏈接&#xff1a;http://www.blogdaren.com/post-2030.html 版權聲明&#xff1a;除非注明&#xff0c;本文由( manon )原創&#xff0c;轉載請保留文章出處 本文鏈接&#xff1a;PHP register_shutdown_function函數詳解 腳本時常死掉,而且并不總是那么好看. 我們可不想…

應對無協議脫歐 葡萄牙機場將為英籍旅客設快速通道

中新網1月18日電 據臺灣《聯合報》援引英媒報道&#xff0c;英國首相特蕾莎?梅的脫歐協議遭下院否決后&#xff0c;英國無協議脫歐的可能性變大。葡萄牙總理科斯塔17日表示&#xff0c;里斯本當局正對機場開設特殊通道進行規劃&#xff0c;使英國旅客無論英國最后如何脫歐&…

javascript 日期控件

http://www.my97.net/dp/index.asp轉載于:https://www.cnblogs.com/Ken-Cai/archive/2010/04/08/1707080.html

6輪字節前端校招面試經驗分享

大家好&#xff0c;我是若川。最近金三銀四&#xff0c;今天分享一篇字節前端校招面試經驗的輕松好文&#xff0c;相信看完會有所收獲。也歡迎點擊下方卡片關注或者星標我的公眾號若川視野因為我錯過了2020年的秋招&#xff08;ps: 那時候連數據結構與算法都還沒學完&#xff0…

redis存opc_Redis集群的三種模式

一、主從模式通過持久化功能&#xff0c;Redis保證了即使在服務器重啟的情況下也不會損失(或少量損失)數據&#xff0c;因為持久化會把內存中數據保存到硬盤上&#xff0c;重啟會從硬盤上加載數據。但是由于數據是存儲在一臺服務器上的&#xff0c;如果這臺服務器出現硬盤故障等…

斥資近1億港元,小米二次回購

1月21日消息&#xff0c;小米集團發布公告稱&#xff0c;公司于1月18日回購了984.96萬股B類普通股股票&#xff0c;占已發行股份0.041%&#xff0c;平均價為每股B類股10.1527港元&#xff0c;總計斥資近1億港元。 這也是繼1月17日首次回購后&#xff0c;小米集團連續兩日出手進…

MySQL日期數據類型、時間類型使用總結

轉載鏈接&#xff1a;http://www.jb51.net/article/23966.htm MySQL 日期類型&#xff1a;日期格式、所占存儲空間、日期范圍 比較。 日期類型 存儲空間 日期格式 日期范圍 ------------ --------- --------------------- -------------------------------…

ios macos_設計師可以從iOS 14和macOS Big Sur中學到什么?

ios macos重點 (Top highlight)With the introduction of iOS 14 and macOS Big Sur, we are the witness of the next big thing in UI Design. Changes are not so revolutionary like in iOS 7 years before, but they undoubtedly present the trend UI Designers will fol…

Web開發性能優化總結 轉載

1. 使用存儲過程&#xff0c; &#xff08;如果在程序里用exec 存儲過程 參數&#xff0c;這樣執行似乎并沒有快多少&#xff09; 在數據庫里是預編譯的&#xff0c;也不需要在字符串傳輸上花費大量時間。 防sql注入攻擊。 2. 盡量優化數據庫語句&#xff0c;使邏輯盡量…

金三銀四的騰訊、阿里、?字節等大廠前端社招面經

大家好&#xff0c;我是若川。最近金三銀四&#xff0c;今天分享一篇騰訊、阿里、字節等大廠的前端社招面試經驗的好文&#xff0c;相信看完會有所收獲。也歡迎點擊下方卡片關注或者星標我的公眾號若川視野作者面了將近一個月&#xff0c;目前還沒掛過&#xff0c;但由于各種因…

JS中創建函數的幾種方式

使用 "函數聲明" 創建函數 語法&#xff1a;* function 函數名([形參1,形參2...形參N]){* 語句...* } */function fun2(){console.log("這是我的第二個函數~~~");alert("哈哈哈哈哈");document.write("~~~~…

ssm提交post_我用spring mvc做,用post方式提交,后臺獲取不到參數值,用get方式就可以,什么問題...

展開全部因為form表單e68a843231313335323631343130323136353331333365646330的enctype編碼方式不同導致的&#xff1b;enctype 屬性規定在發送到服務器之前應該如何對表單數據進行編碼。默認地&#xff0c;表單數據會編碼為 "application/x-www-form-urlencoded"。就…

網頁設計簡約_簡約網頁設計的主要功能

網頁設計簡約重點 (Top highlight)Minimalism is synonymous with simplicity. Not quite. As the name suggests, minimalism is definitely not about opulent design. But the assumption that minimalism is design-less and plain is also wrong. Minimalism is simple ye…

MySQL_數據庫數據類型(data type)介紹

轉載鏈接&#xff1a;http://www.360sdn.com/mysql/2013/0511/78.html MySQL_數據庫數據類型(data type)介紹 mysql數據庫的數據類型(data type)分以下幾種:數值類型,字符串類型 一、數值類型 MySQL 的數值類型可以大致劃分為兩個類別&#xff0c;一個是整數&#xff0c;另一…

Expo 2010 Japan Pavilion

^_^轉載于:https://www.cnblogs.com/mmmhhhlll/archive/2010/04/16/1713680.html

深度對比學習Vue和React兩大框架

作為國內應用最廣的兩個框架&#xff0c;Vue 和 React 是前端必須掌握的內容&#xff0c;也是面試的重點。但大多數讀者都只擅長其中一個框架&#xff0c;當面試涉及到另一個框架的內容時&#xff0c;就答不好了。比如虛擬dom&#xff0c;兩個框架中都有應用&#xff0c;面試官…

PHP Token(令牌)設計

轉載鏈接&#xff1a;http://www.jb51.net/article/13756.htm PHP Token(令牌)設計 設計目標: 避免重復提交數據. 檢查來路,是否是外部提交 匹配要執行的動作(如果有多個邏輯在同一個頁面實現,比如新增,刪除,修改放到一個PHP文件里操作) 這里所說的token是在頁面顯示的時候,寫到…

java rwd_面向任務的設計-不僅限于Mobile First和RWD

java rwdWe already know that majority of solutions should start with a design for smartphones, we know that all websites should be responsive. Now, it’s time to think about holistic solutions with specific tasks adapted to all kind of devices.我們已經知道…