天天看點

Vue3 + Vite2 項目實戰複盤總結(幹貨!)

内容概要

•背景•vue3 項目開發 get 到的知識•讓我驚訝的 vite•項目中遇到的困難•總結•項目技術棧•資料推薦

背景

有一個新項目啟動,移動端項目相容安卓 6+,沒有曆史包袱,技術選型可以自由發揮。考慮到項目周期/團隊技術/學習成本,最後選取還算比較新的 vue3。

不過等我的項目上線到寫完這篇,有些東西已經不是最新的啦,Vue 3.1.0 的 beta 版釋出了不得不感慨前端技術日新月異,變化的速度之快,我學不動了。

vue3 項目開發 get 到的知識

剛開始用的時候,可懷念 vue2 了,我始終 get 不到 vue3 的精華,也了解不了網上說的組合式API 有多好。vue2 我是輕車熟路,vue3 我是面向文檔開發。選擇了用 vue3,就要去 get 他的精華,用着用着我發現真香,vue3 和 vite2 結合的項目驚訝到我了。

組合式 API 解決了什麼問題?

在開始寫項目的時候,我一直沒有 get 到組合 API 的有優點,還沒有了全局的 this,我就有點不開心了,但是随着項目越來越複雜,頁面越來越大的時候我就發現組合 API 真香。特别喜歡。

vue2 資料定義在 data,方法在 method,中間可能還有 watch,computed 等等别的東西,資料定義和方法處理邏輯之間差了十萬八千裡,當邏輯複雜達到一定長度的時候,追蹤一個變量的變化是一件非常頭痛的事情,滑鼠需要來復原動。

Vue3 + Vite2 項目實戰複盤總結(幹貨!)

有了組合 API,這個問題就解決了。所有相關的都可以寫在一塊。真好,它帶來了一種全新的開發方式。如果你是 React 開發使用者或者熟悉 React,那麼 vue3 上手很快,你甚至都可以在頁面中使用 hooks 的方式開發。由于這個項目使用場景比較小,是以在項目中并沒有進行采用 hooks 的方式,後續有需要的時候可以考慮使用。了解更多關于組合式 API 請參考文檔什麼是組合式 API?[1]

API的變化

Vue3 + Vite2 項目實戰複盤總結(幹貨!)

由于在執行 setup 時,元件執行個體尚未被建立,是以在 setup 選項中沒有 this。這意味着,除了 props 之外,你将無法通路元件中聲明的任何屬性——本地狀态、計算屬性或方法。setup 選項應該是一個接受 props 和 context 的函數。

因為 props 是響應式的,你不能使用 ES6 解構,因為它會消除 prop 的響應性。如果需要解構需要用 toRefs。

執行 setup 時,元件執行個體尚未被建立。是以,你隻能通路以下 property:

props
attrs
slots
emit           

複制

換句話說,你将無法通路以下元件選項:

data
computed
methods           

複制

整個項目下來與 vue2 隻有文法的差别,思想啥的變化不大,不難。面向文檔開發基本可以滿足你的需求。

一個元件的思考

如何寫好一個元件,元件的規劃/使用/維護,始終是一個值得深入思考的問題。Composition API 帶了了一種全新的開發方式,甚至可以使用 hooks 的方式開發。每個子產品各司其職,各自有自己的内部資料,公共的使用函數或者 hooks 抽象出來,整體上非常清爽,工程化越來越強,在項目中開發是否全部要使用 .vue 建立元件呢?

以前我覺得既然我選了 vue,就要用 .vue 的形式,但是在這次的項目開發過程中,我看到了我的小夥伴使用了原生 js 建立元件,我眼前一亮,在某些情況下用原生的 js 建立元件是一個非常不錯的選擇,那一刻我明白了,适合自己實際需求的才是最好的,混合式元件開發可以取長補短。

比如接口請求過程中,使用者突然斷網了,前端提示使用者斷網的頁面,這代碼就很簡潔了。

Vue3 + Vite2 項目實戰複盤總結(幹貨!)

還有用 jsx 方式建立的元件,可定制化。

Vue3 + Vite2 項目實戰複盤總結(幹貨!)

适當的邏輯點分離: 埋點邏輯和業務邏輯分離更加有益于項目後期的維護(自定義指令實作聲明式埋點)。

Vue3 + Vite2 項目實戰複盤總結(幹貨!)

路由邏輯的處理

Vue3 + Vite2 項目實戰複盤總結(幹貨!)

視野中出現了焦點,也就出現了盲點。路由邏輯處理這塊,我就坑到自己了,我焦點都在組合式API,在組合式 API 文檔我找不到進入路由時候的生命周期函數。結果就導緻我部分頁面邏輯寫在了 router.js 裡面。

// 路由檔案
{
  path: '/index',
  component: HOME,
  beforeEnter: (to, from) => {
    if (from.path === "/read") {
      to.meta = {
        updateHistory: 'read',
      }
    }
  }
};
// 頁面檔案
watch(() => route.meta,(val) => {
  if (val.updateHistory) {
    getHistoryHandler()
  }
});           

複制

這是一個非常非常不好的寫法,頁面邏輯和路由邏輯耦合在一起,後期維護帶來了很大的問題,後來同僚指點,糾正了這個問題。我竟然忽略了它原來的文法,去執着與他的新文法。

Vue3 + Vite2 項目實戰複盤總結(幹貨!)

所有頁面需要統一的動态的一級路由字首,即路由的一級域名不是由前端控制的,但是在實際開發中,前端路由規則是要關注一級路由的。按照一貫的邏輯是所有的路由配置動态路由即

path: '/:flag/index', path: '/:flag/listen'....

隻要是有路由就需要在前面加上

/:flag

,某些情況下還需要處理在業務邏輯裡面單獨處理,這個邏輯混在比較多,不利于後期的維護。

想偷懶,思考有沒有簡單的解決方法,同僚一番研究花了不少時間,不斷試錯不斷研究,終于發現可在路由上面做文章,一句代碼解決了大量重複的勞力。簡直開心的不能再開心,分分鐘搞定了createWebHistory 支援設定base檔案目錄[2]

createWebHistory(location.pathname.split('/')[1])

Vue3 + Vite2 項目實戰複盤總結(幹貨!)

原來打包的時候還能動态的指定路由方式,真棒。

讓我驚訝的 vite

開發體驗對比

項目啟動&&項目打包&&項目體積

Vue3 + Vite2 項目實戰複盤總結(幹貨!)
Vue3 + Vite2 項目實戰複盤總結(幹貨!)
ps:由于 vue-cli 和 vite 的環境變量讀取方式和某一些 css 的引入方式不一樣,在 vue-cli 裡面我就注釋了相關的代碼。確定項目能夠跑去來。除此之外别的幾乎是一模一樣

通過資料對比可見:

vite 建立的項目,在項目啟動和打包後的體積方面都遠遠勝過 vue-cli 建立的項目。

vue-cli 建立的項目,打包速度優于vite一點,但是在我們開發過程中,經常打包頻率并不高,而且慢的也沒有很誇張離譜。

就我個人而言,我更加傾向于 vite 去搭建項目。

vite 是如何吸引我的?

1.無邊界 => 純 html 項目,react 項目都可以,項目中可以使用較新的文法,相容性交給工具。

Vue3 + Vite2 項目實戰複盤總結(幹貨!)

1.緊跟時代的文法潮流支援

module 形式引入 js 腳本

在 js 裡面,可以通過這種形式引入 css

支援 css 子產品化寫法 純 html 項目也可以做到實時更新

讓我們可以隻需要關注業務開發,而無需去關注文法層面的相容性以及打包配置,我喜歡這樣的開發體驗。

vite demo 代碼位址[3]

項目遇到的困難

困難總比辦法多,再多的問題都會慢慢被解決,項目會如期上線。項目的開發,磕磕碰碰,才有成長,學到東西才有意義。

輪播元件

應産品需求,輪播元件最終使用第三方插件,最初選用 vue-awesome-swiper ,但是 vue3 不支援,雖然官方有 vue3 的 demo,但是需要 vue2與 vue3 混用。

Vue3 + Vite2 項目實戰複盤總結(幹貨!)

一番查找最後選用 swiper 插件,本身就支援了 vue3 ,而且他隻支援 vue3,救了我。

Vue3 + Vite2 項目實戰複盤總結(幹貨!)

就是文檔寫的不太好,很多并沒有明确的暴露出來,需要去 swiper.js 文檔查找, swiper 本身支援現在主流的架構這是一個很棒的體驗,就是文檔這一塊需要加油。

虛拟滾動

頁面清單加載上百千條資料時,白屏時間長,滾動有卡頓。最開始考慮采用前端頁面分頁,隻要資料夠多頁面 dom 節點還是很多,達到一定量卡頓依舊存在。後來使用 vue-virtual-scroller 解決問題,但在網上看到大部分都是vue2版本的,vue3 版本都是在 issues 裡面找到的。

Vue3 + Vite2 項目實戰複盤總結(幹貨!)

在使用過程中又遇到,缺少某些方法導緻無法滿足産品需求,最後源碼查找到滿足需求的方法。vue3 本身的文檔也不夠完善,如果能夠暴露更多的方法,而不是源碼找,體驗會更好。

Vue3 + Vite2 項目實戰複盤總結(幹貨!)

但是這個項目在 github 上面的 star 很不錯,應該是靠譜的,隻是人家還沒來得及做吧,哈哈。

Vue3 + Vite2 項目實戰複盤總結(幹貨!)

總結

以上就我個人這次項目實戰的經驗而言,在用新的 API 的時候,需要思考一個問題,邏輯點聚合,同時也要注意轉變代碼組織思維。這不僅是 vue2 和 vue3 的差別,而是一直以來我們應該思考的一個問題,每次開發都應該思考,如何能讓這個項目/元件能夠長期穩定的發展。架構的更新于使用者而言不僅僅是文法的更新,而應該去思考,架構在發展中遇到了什麼問題?他是如何解決的?為了我們開發的項目長期穩定可持續的發展,是否可以借鑒他們的經驗?

項目中使用到的技術棧及文檔

vite.config 的配置文檔 [4]

路由 router[5]

vue3[6]

輪播插件swiper[7]

虛拟滾動vue3 版本[8]

vue3/vite資料推薦

昨晚尤大的連麥直播,我學到了很多!!![9]

vite 文檔[10]

備戰2021:vite工程化實踐,建議收藏[11]

手撸Vite,揭開Vite神秘面紗[12]

備戰2021:Vite2項目最佳實踐[13]

【譯】下一代前端建構工具 ViteJS 中英雙語字幕 | 技術點評[14]

【譯】下一代前端工具 ViteJS 中英雙語字幕 - Open Source Friday[15]

忙了一夜用CompositionAPI征服産品妹子花裡胡哨的需求[16]

閃電五連鞭:Composition API原理深度剖析[17]

不要再用Vue 2的思維寫Vue 3了[18]

vue3 源碼解析[19]

References

[1]

什麼是組合式 API?: https://v3.cn.vuejs.org/guide/composition-api-introduction.html#%E4%BB%80%E4%B9%88%E6%98%AF%E7%BB%84%E5%90%88%E5%BC%8F-api

[2]

createWebHistory 支援設定base檔案目錄: https://next.router.vuejs.org/zh/api/#createwebhistory?fileGuid=t3GvJVRGxRkXgypy

[3]

vite demo 代碼位址: https://github.com/sunseekers/vite/blob/main/index.html

[4]

vite.config 的配置文檔 : https://cn.vitejs.dev/config/#mode

[5]

路由 router: https://next.router.vuejs.org/introduction.html

[6]

vue3: https://v3.cn.vuejs.org/guide/installation.html#%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7-cli

[7]

輪播插件swiper: https://swiperjs.com/vue

[8]

虛拟滾動vue3 版本: https://github.com/Akryum/vue-virtual-scroller/blob/next/packages/vue-virtual-scroller/README.md

[9]

昨晚尤大的連麥直播,我學到了很多!!!: https://juejin.cn/post/6960506633839443981#comment

[10]

vite 文檔: https://cn.vitejs.dev/guide/why.html

[11]

備戰2021:vite工程化實踐,建議收藏: https://juejin.cn/post/6910014283707318279

[12]

手撸Vite,揭開Vite神秘面紗: https://juejin.cn/post/6960110425438421006

[13]

備戰2021:Vite2項目最佳實踐: https://juejin.cn/post/6924912613750996999

[14]

【譯】下一代前端建構工具 ViteJS 中英雙語字幕 | 技術點評: https://juejin.cn/post/6937176680251424775

[15]

【譯】下一代前端工具 ViteJS 中英雙語字幕 - Open Source Friday: https://www.bilibili.com/video/BV1kh411Q7WN

[16]

忙了一夜用CompositionAPI征服産品妹子花裡胡哨的需求: https://juejin.cn/post/6891885484524437518

[17]

閃電五連鞭:Composition API原理深度剖析: https://juejin.cn/post/6894993303486332941

[18]

不要再用 vue2 思想寫 vue3 了: https://mp.weixin.qq.com/s/w4n_WhbDqK4kgzxEHUWWfw

[19]

vue3 源碼解析: https://vue3js.cn/reactivity/reactive.spec.html