一、從以下方面了解 Vue 3 新特性
1.RFC機制
Vue 3 的第一個新特性和代碼無關,而是 Vue 團隊開發的工作方式。關於 Vue 的新語法或者新功能的討論,都會先在 GitHub 上公開征求意見,邀請社區所有的人一起討論, 你隨時可以打開這個項目,我把鏈接放在這里https://github.com/vuejs/rfcs。Vue 3 正在討論中的新需求,任何人都可以圍觀、參與討論和嘗試實現。這個改變讓 Vue 社區更加有活力。
2.響應是系統
Vue 2 的響應式機制是基於 Object.defineProperty() 這個 API 實現的,此外,Vue 還使用了 Proxy,這兩者看起來都像是對數據的讀寫進行攔截,但是 defineProperty 是攔截具體某個屬性,Proxy 才是真正的“代理”。更重要的是,我覺得 Proxy 代表一種方向,就是框架會越來越多的擁抱瀏覽器的新特性。在 Proxy 普及之前,我們是沒有辦法完整的監聽一個 JavaScript 對象的變化,只能使用 Object.defineProperty() 去實現一部分功能。前端框架利用瀏覽器的新特性來完善自己,才會讓前端這個生態更繁榮,拋棄舊的瀏覽器是早晚的事。
3.全部模塊使用 TypeScript 重構
之前只是用 JavaScript 來構建他的前端項目,而 JavaScript 是弱類型的語言。類型系統帶來的好處以后我再跟他細說,現在只是籠統地告訴他,類型系統帶來了更方便的提示,並且讓我們的代碼能夠更健壯。
4.Composition API 組合語法
使用 Composition API 后,代碼看起來很煩瑣,沒有 Vue 2 中 Options API 的寫法簡單好懂,但 Options API 的寫法也有幾個很嚴重的問題:由於所有數據都掛載在 this 之上,因而 Options API 的寫法對 TypeScript 的類型推導很不友好,並且這樣也不好做 Tree-shaking 清理代碼。新增功能基本都得修改 data、method 等配置,並且代碼上 300 行之后,會經常上下反復橫跳,開發很痛苦。代碼不好復用,Vue 2 的組件很難抽離通用邏輯,只能使用 mixin,還會帶來命名沖突的問題。我們使用 Composition API 后,雖然看起來煩瑣了一些,但是帶來了諸多好處:所有 API 都是 import 引入的(現在我們的例子還沒有工程化,后續會加入)。用到的功能都 import 進來,對 Tree-shaking 很友好,我的例子里沒用到功能,打包的時候會被清理掉 ,減小包的大小。不再上下反復橫跳,我們可以把一個功能模塊的 methods、data 都放在一起書寫,維護更輕松。代碼方便復用,可以把一個功能所有的 methods、data 封裝在一個獨立的函數里,復用代碼非常容易。Composotion API 新增的 return 等語句,在實際項目中使用 <script setup> 特性可以清除, 我們后續項目中都會用到這樣的操作。
5.新的組件
Vue 3 還內置了 Fragment、Teleport 和 Suspense 三個新組件。這個倒不難,項目中用到的時候會詳細剖析,現在你只需要這仨是啥就行,以及它們的用途即可:Fragment: Vue 3 組件不再要求有一個唯一的根節點,清除了很多無用的占位 div。Teleport: 允許組件渲染在別的元素內,主要開發彈窗組件的時候特別有用。Suspense: 異步組件,更方便開發有異步請求的組件。
6.新一代工程化vite
Vite 不在 Vue 3 的代碼包內,和 Vue 也不是強綁定,Vite 的競品是 Webpack,而且按照現在的趨勢看,使用率超過 Webpack 也是早晚的事。Vite 主要提升的是開發的體驗,Webpack 等工程化工具的原理,就是根據你的 import 依賴邏輯,形成一個依賴圖,然后調用對應的處理工具,把整個項目打包后,放在內存里再啟動調試。由於要預打包,所以復雜項目的開發,啟動調試環境需要 3 分鍾都很常見,Vite 就是為了解決這個時間資源的消耗問題出現的。你可能不知道,現代瀏覽器已經默認支持了 ES6 的 import 語法,Vite 就是基於這個原理來實現的。具體來說,在調試環境下,我們不需要全部預打包,只是把你首頁依賴的文件,依次通過網絡請求去獲取,整個開發體驗得到巨大提升,做到了復雜項目的秒級調試和熱更新。
總結
新的 RFC 機制也讓我們所有人都可以參與 Vue 新語法的討論。工程化工具 Vite 帶來了更絲滑的調試體驗。對於產品的最終效果來看,Vue 3 性能更高,體積更小。對於普通開發者來說,Composition API 組合語法帶來了更好的組織代碼的形式。全新的響應式系統基於 Proxy,也可以獨立使用。Vue 3 內置了新的 Fragment、Teleport 和 Suspense 等組件。對於 Vue 的二次開發來說,自定義渲染器讓我們開發跨端應用時更加得心應手。對於 Vue 的源碼維護者,全部的模塊使用 TypeScript 重構,能夠帶來更好的可維護性。
二、vue2升級vue3
首先,我帶你明確了什么時候該升級 Vue 3,什么時候該繼續使用 Vue 2 的兼容版本。現在,Vue 3 的官方生態在整體都比較穩定,新的項目完全可以直接選擇 Vue 3。並且,對於那些需要長期維護的項目,其實也很有必要進行升級。不過,Vue 2 很快會停止更新,如果你的項目需要兼容 IE11,那就需要繼續使用 Vue 2.7。這樣,在保持好項目的兼容性的前提下,還可以體驗到 Composition API 帶來的便利。
然后,在升級 Vue 的過程中,我們可以利用官方和社區的工具,幫助我們高效地升級。我們可以使用 compat 來給出提醒,項目中設置 @vue/compat 作為 vue 的別名,這樣內部就會把所有和 Vue 2 的語法相關的升級信息提示出來,逐個替換即可,或者直接使用 gogocode 進行自動化批量替換。
最后,我想說的是,全面擁抱 Vue 3 也算是一次離開舒適圈的挑戰,這帶來的不只是新框架的體驗,同時也可能是更好的潛力與更好的待遇。
