Vue 3是一個錯誤,我們不應(yīng)該再犯
文本是翻譯的,作者Fotis Adamakis, 他是 Vue.js雅典會議的共同組織者,文中的第一人稱指的是該大佬。
從最初引入Vue 3開始,已經(jīng)過去了4年多。經(jīng)過多次RFC的討論,以及其他現(xiàn)代框架(包括React和Svelte)的影響,Vue 可能已經(jīng)成為最強(qiáng)大和最全面的框架,能夠逐步支持任何規(guī)模和架構(gòu)的應(yīng)用。
聽起來很刺激,對嗎?嗯,事實遠(yuǎn)非如此。從那時起,就發(fā)生了很多延遲和降級的情況。盡管Vue 3最近成為了新的默認(rèn)版本,但很多重要的支持庫還沒有準(zhǔn)備好,甚至沒有計劃與兩個版本兼容。這說明很多代碼庫還停留在Vue 2上,遷移到版本3的路徑并不容易。
請不要誤解我,Vue 3非常棒。它可能是目前最好的框架了。但事實上,從第二版開始沒有簡單的遷移路徑,這是一個錯誤,我們不應(yīng)該在未來重復(fù)。
Vue 2的問題
Vue一直被認(rèn)為是一個進(jìn)步的框架。選項API很容易理解,我們可以學(xué)習(xí)并在需要時引入更復(fù)雜的模式和庫。小的學(xué)習(xí)曲線和良好的文檔是大家喜歡它的原因。
另一方面,在將通用邏輯抽象為mixin時,使用繼承而不是組合的體系結(jié)構(gòu)缺陷造成了許多可伸縮性問題,并破壞了干凈組件聲明的許多原則。Vue3 引入組合API 作為一種解決方案。
另一個重要的問題是對typecript的支持。當(dāng)然,在Vue組件中編寫typescript就像在script標(biāo)簽中添加type="ts"一樣容易。但在模板和 store 里,支持是有問題的。
vue3 解決方案
完全重寫是一個改善框架內(nèi)部結(jié)構(gòu)的機(jī)會。Vue3 廣泛地使用了Typescript,包括響應(yīng)性機(jī)制在內(nèi)的許多方面都從頭開始。這使得Vue 3在數(shù)據(jù)包大小、初始渲染、更新和內(nèi)存使用方面的性能得到了明顯的改善。
此外,還增加了很多新的功能。
- Composition API
- 語法糖<script setup>
- Fragments
- Emits Component Option
- 來自@vue/runtime-core的createRenderer API可以創(chuàng)建自定義渲染器
- style 里面可以綁定變量
- SFC的<style scoped>現(xiàn)在可以包括全局規(guī)則或只針對插槽內(nèi)容的規(guī)則
- Suspense
新功能改善了整體的開發(fā)體驗,歡迎很多開發(fā)都的追捧。爭論的焦點是,其中大部分功能,包括組合API、teleport、 suspense 等,在Vue 2中已經(jīng)都能用了,所以它們不能真正算作框架的改進(jìn)。
真正的問題
破壞的性變化,有很多。其中一些很簡單,比如Events API。Vue實例不能再用作事件總線,但有即插即用的解決方案,如 mitt 或 tiny-emitter,可以用作直接替代。這需要有一定工作時間,但可以及時完成,沒有太多風(fēng)險。
另一方面,有些變化不能安全地進(jìn)行,也不能不進(jìn)行小規(guī)模或大規(guī)模的重構(gòu)。在一個用Vue 2構(gòu)建的現(xiàn)有大型應(yīng)用中,你可能會使用一些被廢棄或改變的API。
遷移構(gòu)建應(yīng)該是兩個版本之間的橋梁,但由于有這么多被廢棄的功能,它對大型項目并不適用。此外,官方對一些基本的支持庫的建議是遷移到另一個不同的庫,這進(jìn)一步增加了復(fù)雜性。由于有這么多的移動組件,即使遷移構(gòu)建成功,也需要大量的工作,這對大項目來需要有更多的時間用來解決技術(shù)債務(wù)。
不需要的東西
Vue始終是一個有意義的框架。你可以試著猜測一個API應(yīng)該如何工作,你很可能是對的。Vue 3不再是這種情況。
一個例子是關(guān)于新的基于函數(shù)的Vue組件編寫方式的意見征集,有大量的回應(yīng),包括正面和負(fù)面的。不管你在這場爭論中的立場如何,將社區(qū)分成兩半絕不是一個好兆頭。
文檔
在開發(fā)過程中,特別是在一個新的框架中,谷歌和StackOverflow是你最好的朋友。目前,Vue 2的答案占據(jù)了壓倒性的優(yōu)勢,但在Vue 3中,很多API實現(xiàn)的原理都不一樣了,因此可能會造成一定的混亂。
生態(tài)
一個框架有多強(qiáng)大,它的生態(tài)系統(tǒng)就有多強(qiáng)大。有爭議的決定和不負(fù)責(zé)任的廢棄功能驅(qū)使許多貢獻(xiàn)者離開,導(dǎo)致許多庫被放棄。但是,當(dāng)你沒有給開源庫一個可行的方法來支持兩個版本的時候,就指責(zé)他們沒跟上你的版本時,這表明你缺乏同情心和對大局的理解。
一個框架的真正力量來自于它周圍的社區(qū)和生態(tài)系統(tǒng)。
過去
如果你有幸在2015年前后寫代碼,你有可能會使用當(dāng)時最主流的框架AngularJS。
轉(zhuǎn)到 Vue 3的看起來很像從 AngularJS 到 Angular(版本1?2)的過渡。大量的破壞性的變化導(dǎo)致了挫敗感,最終Angular失去了對React和Vue的吸引力。
如果你是一個全棧工程師,你可能熟悉大約10年前在Python生態(tài)系統(tǒng)中發(fā)生的同樣情況。在大約十年的時間里,許多項目無法升級,因為許多核心庫沒有增加對Python 3的支持,而出現(xiàn)的新庫只支持Python 3。當(dāng)然,后來的Python版本開始只在版本3上添加新的和閃亮的功能,這種混亂的情況還沒有真正結(jié)束。
未來--這種情況會再次發(fā)生嗎?
看起來前進(jìn)的方向是向后退,把所有的東西都移植到遷移構(gòu)建中,但是損害已經(jīng)造成了,開發(fā)滿意度看起來并不樂觀,不能忽視。有遠(yuǎn)見地讓框架參與進(jìn)來是合理的,但開發(fā)經(jīng)驗是框架的核心職責(zé)之一。Vue 4應(yīng)該考慮到整個生態(tài)系統(tǒng),并提供一個遷移路徑,否則它將成為沒有人愿意使用的最佳框架。
到目前為止,你對Vue 3的遷移有什么經(jīng)驗?請在評論中分享你的想法和建議。
作者:Chris 譯者:小智 來源:medium 原文:https://fadamais.medium.com/vue-3-was-a-mitake-that-we-should-not-repeat-81cc65484954