为什么Vue在国际上越来越没影响力?
近日突然看到“為什么Vue在國際上越來越沒影響力”這樣一個問題
我來回答一下
如果Vue 單純看 star 數量的話,確實比 React 多啊
說實話,Vue 實際上策略是緊跟 React,我們組內部討論的時候,一般把 Vue 看作是全工具鏈的 React 框架,無論是老版本還是新版本
Vue 和 React 的原理性差異幾乎沒有,這點和 ng 不同,因為在開發 ng 的時候,編程思維都需要徹底轉變才能進行
所以,你對 Vue 和 React 的比較,可能完全沒有意義,因為絕大多數有能力的開發者,Vue React 雙修基本沒有太多額外成本,但是如果加入 ng,那成本就指數上升了
在響應式方面,Vue 和 React 都是數據驅動,簡而言之就是,渲染的發生總是因為我修改了某個數據,細節差異你直接看 mobx 文檔就能知道(數據變化應該自發地傳遞),也就是 Vue 加入 defineProperty 或者 proxy 的原因,實際上是對 React 在詞法邏輯表達能力的優化,增強 React 的架構能力
這部分差異體現在使用上,也就是你在變量綁定時,是傳 value onChange 兩個參數,還是 v-model 一個參數,是定義 getter setter 綁定兩個 state,還是 computed 傳入 getter setter 綁定,在功能上是沒有一點點差異的,也就可讀性和命名負擔以及純度(質量控制)上有些許差異
這點和 ng 區別特別大,ng 渲染發生(或者臟檢發生),不是因為你修改了某個數據,而是因為有異步發生,這個根本性不同,會導致編程思維根本性變化,比如,事件不需要你去做 batchUpdate,響應式也不需要考慮,反正視圖總會響應,但是檢查次數需要你去做限制,否則檢查次數太過頻繁,同時hmr將變得非常拉跨,補償是邏輯組織能力非常強,意味著測試比調試容易
常用的分布式計算模型就兩個,CSP 和 Actor,React 占了 CSP(用過 reducer 沒?),ng 占了 Actor(別再問為啥 ng 沒有狀態管理了),所以沒有多余的坑位給 Vue
雖然,React 選擇社區最優第三方,其實是能夠比 Vue 開發體驗更好:
styled-components 比 Vue <style scoped/> + css module 效率更高
react-router 比 vue-router 靈活性更強(路由作為組件更方便掛載上下文,同時不會引入更多概念)
原生集成 csp useReducer 比引入 vuex 效率更高(一般來說我還是不喜歡外掛 csp)
但是,如果從統一語言的角度,React 是失敗的,因為更多的社區選擇意味著更多的可能應用形態,語言更加不統一,團隊協作更加困難
這里也可以順帶解釋 Vue 和 React 難易程度之爭,單純看 Vue 和 React,React 更簡單,React 核心 api 就那么 6 個,useState,useMemo,useRef,useCallback,useEffect,useLayoutEffect,一個網頁翻個 4,5 次就能看完,學會也就幾個小時的事情。但是如果是問能干活的情況,React 和 一眾層次不齊各種思想的庫,和 Vue 比就難到天上去了,甚至我們使用 React 的時候,原則都是盡量不用庫,用了也要想辦法替代,比如進出動畫,React 原生實現起來不要太簡單,也不知道為何有那么多動畫庫同時,雖然更細劃分的 csp 靈活性更強,但是總是需要傳入的依賴數組也需要進行專門的學習和練習,就算現在,很多第三方 hooks 都沒有強制傳入 useCallback 吧?
所以,這就給 Vue 帶來了機會,可以這么說,如果沒有 Vue,React 生態也會自發出現一個類似 Vue 的 React “框架”,而且肯定比 Vue 拉跨
不過,Vue 的上一次跟進 Vue2 是成功的,原因是 React 16.8 以前的版本,實在是太屎了(不想回憶,此處省略 1000 字)
但是新版本 Vue3 的跟進還有待商榷,原因有以下幾點:
這個問題其實一直存在,甚至很多沒用過 ng 的朋友,還會爭論 template 和 jsx 誰更強,實際上你用過 ng html+ 就知道,html 里寫 js 和 js 里面寫 html 表達能力是一樣的,之所以有這個爭論,原因就是 vue template 限制太大
比如 renderProps,實際上是可以寫在 template 里的,比如 ng 模板引用變量:
<some-compo [someTemplate]="templateRef"></some-compo> <!-- 動態 template 想寫在哪里都可以,不同組件甚至不同module --> <ng-template #templateRef><div>this is render</div> </ng-template>而 Vue 這部分能力還需要用 jsx,這就很坑人,也會導致很多社區生態直接全部采用 jsx 開發,相當于把開發者往 React 社區推,因為如果全局使用 jsx,Vue 相對于 React 的優勢將蕩然無存
還有 Vue 的 template 中無法隨心所欲寫 js/ts ,不過這個也說不清是優勢還是劣勢
不過好在現在終于有 ts 支持了
2. 調度拆分不夠細
如果同步修改兩個 ref/reactive ,watch 這兩個 ref/reactive,只能獲得一次變更
const a = ref(0) const b = ref(0) setTimeout(()=>{a.value = 1b.value = 1 },0) watch(()=>[a,b], console.log) // 只變化一次這個問題其實挺嚴重的,因為如果你在中間修改了某個非響應式數據:
a.value = 1 someValue = true b.value = 1這個 someValue 的變化,你無法在 watch 中捕獲
再更進一步,這個 a,b 兩個響應式變量的拆分,變的沒有意義了,或許默認只有一個響應式變量更好一些?還能解決 ref/reactive 心智負擔問題?畢竟拆分根本沒有作用,他們并不是兩個獨立的響應式數據源
不過 Vue 還在演化階段,不像 React 18 基本定型
3. Vue 沒有 batchUpdate
這個其實更加讓人疑惑,因為 batchUpdate 這個問題,出現在 Vue 比 出現在 React 更加讓人恐慌
比如就拿上面的例子:
setTimeout(()=>{a.value = 1b.value = 1 },0) // watch 調用一次 setTimeout(()=>{a.value = 1 },0) setTimeout(()=>{b.value = 1 },0) // watch 調用兩次同一個事件循環,拆開成兩個任務,就變化,一個任務,就不變,可能會造成雙倍困惑,因為很多時候,開發時考慮事件循環就夠了,沒必要深入討論到任務先后順序上去,因為任務調度很多時候是不確定的,而事件循環是確定的,同時更抽象一層
4. 保留生命周期,兼容老版本
Vue 是框架,與 React 定位不同,這也是 Vue 的市場立足之本,開發過程是不會輕易更換或升級框架的,React 作為一個庫,提供不同的 api,我只要不用歷史 api,就能和老版本劃清界限(比如,現在的 react 文檔,只看 hooks 和部分 jsx ,你會覺得這是個簡單到爆炸的庫,反而你一看老版本的 屎化 react,你會被卷成卷心菜,比如最近好多人都在討論 memo() , 也不知道在討論寫什么,還在糾結性能優化,直接讓人黑人問號。不過新人沒有負擔,實際上新 React,新人比老人更容易上手)
但是 Vue 作為一個框架,應該和老版本徹底劃清界限,生命周期刪除掉,老版本 api 全部刪除,別給老代碼提供機會,社區生態會有更好保障(框架 api 和庫不同,他不會直接做陳列,很多 api 隱藏很深,同時面積也會大得多)
生命周期對于跨組件邏輯來說是炸彈,watch flush 覆蓋生命周期功能,同時只會依賴具體數據,而不是依賴外部環境這次大版本更新有內置 csp,依賴注入(老版本依賴注入無類型推斷支持,無完全編程能力),實際上架構是有翻天覆地變化的,ng 15年的版本更新也是因為這個原因,直接斷代更新
如果 Vue 不這么做,未來生態狀況會很讓人擔憂,如果生態和 React 一樣亂,代碼質量甚至比 React 還要難以控制,是否會丟失核心競爭力?
不過好在,有 script setup 作為補償,目前看趨勢是很好的
5. class 支持不全
如果 Vue 的響應式變量調度無法拆分,那么直接給 class 會不會更好?作為對 React 詞法邏輯能力的增強,不上 class 總歸有點奇怪,因為面向對象就是詞法邏輯發力的地方,自動生成文檔,自動生成 uml,自動分析,測試友好性,架構友好性也更強
比如公共屬性默認 reactive,getter setter 默認 computed,帶裝飾器方法作為 watch,我試過很多次對 Vue 進行 class 改造,但是無論是實例化加 reactive,還是裝飾器進行處理,后果都是必須跳過 constructor 才能有初始化能力,如果真需要支持,還是得框架本身來進行支持
如果本身有響應式傳遞,卻把 ref value,watch 響應式斷裂 等問題引入進來,為什么不直接上 class 呢?
不然為了架構能力,人們選 ng ,為了 csp 和靈活性,人們選 react,那么選 Vue 的意義又是什么?
但是 Vue 還是會比 React 更加熱門
哈哈,因為 Vite
由于 React 和 Vue 的用戶高度重疊,其實真正的競爭根本不在 RV 內部,由于 Vite 直接帶來的純粹的性能提升,我們以及現在越來越多的 React 或者 多個框架使用者,都直接采用了 Vite
事情變得有趣起來
或許 Vue3 并沒有那么令人滿意,但是框架是可以慢慢優化的,構建工具卻是一旦選擇就會長期霸占市場
所以其實 React 并沒有贏,因為前端框架其實并非核心競爭力,只是前端程序員內卷的平臺,構建工具才是關鍵
一個聰明的開發者,現在都是寫著 react,然后沒事 create @vitejs/app 看一下,Vue 好用了,呵呵,二話不說就轉過來了
都沒啥根本性差異,糾結那些細節有啥意義?相當于影院都是 Vue 家的,我們糾結哪部電影好看,也就只是閑聊罷了?
支付寶智慧前端學習交流群
總結
以上是生活随笔為你收集整理的为什么Vue在国际上越来越没影响力?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拓嘉辰丰:拼多多店铺权重与转化有关系吗
- 下一篇: Angular + ABP 上传图片