當前位置: 妍妍網 > 碼農

Vite為什麽快呢?快在哪?說一下我自己的理解吧

2024-03-22碼農


前言

大家好,我是林三心, 用最通俗易懂的話講最難的知識點 是我的座右銘, 基礎是進階的前提 是我的初心。

由於這幾個月使用了 Vue3 + TS + Vite 進行開發,並且是真的被 Vite 強力吸粉了!!!Vite最大的優點就是:快!!!非常快!!!

說實話,使用 Vite 開發之後,我都有點不想回到以前 Webpack 的計畫開發了,因為之前的計畫啟動計畫需要 30s 以上,修改程式碼更新也需要 2s 以上,但是現在使用 Vite ,差不多啟動計畫只需要 1s ,而修改程式碼更新也是超級快!!!

那到底是為什麽 Vite 可以做到這麽快呢?官方給的解釋,真的很官方。。所以今天我想用比較通俗易懂的話來講講,希望大家能看一遍就懂。

問題現狀

ES模組化支持的問題

咱們都知道,以前的瀏覽器是不支持 ES module 的,比如:

// index.js
import { add } from'./add.js'
import { sub } from'./sub.js'
console.log(add(12))
console.log(sub(12))
// add.js
exportconst add = (a, b) => a + b 
// sub.js
exportconst sub = (a, b) => a - b 

你覺得這樣的一段程式碼,放到瀏覽器能直接執行嗎?答案是不行的哦。那怎麽解決呢?這時候打包工具出場了,他將 index.js、add.js、sub.js 這三個檔打包在一個 bundle.js 檔裏,然後在計畫 index.html 中直接引入 bundle.js ,從而達到程式碼效果。一些打包工具,都是這麽做的,例如 webpack、Rollup、Parcel

計畫啟動與程式碼更新的問題

這個不用說,大家都懂:

  • 計畫啟動:隨著計畫越來越大,啟動個計畫可能要幾分鐘

  • 程式碼更新:隨著計畫越來越大,修改一小段程式碼,保存後都要等幾秒才更新

  • 解決問題

    解決啟動計畫緩慢

    Vite 在打包的時候,將模組分成兩個區域 依賴 源碼

  • 依賴 :一般是那種在開發中不會改變的JavaScript,比如元件庫,或者一些較大的依賴(可能有上百個模組的庫),這一部份使用 esbuild 來進行 預構建依賴 , esbuild 使用的是 Go 進行編寫,比 JavaScript 編寫的打包器預構建依賴快 10-100倍

  • 源碼 :一般是哪種好修改機率比較大的檔,例如 JSX、CSS、vue 這些需要轉換且時常會被修改編輯的檔。同時,這些檔並不是一股腦全部載入,而是可以按需載入(例如路由懶載入)。 Vite 會將檔轉換後,以 es module 的方式直接交給瀏覽器,因為現在的瀏覽器大多數都直接支持 es module ,這使效能提高了很多,為什麽呢?咱們看下面兩張圖:

  • 第一張圖,是以前的打包模式,就像之前舉的 index.js、add.js、sub.js 的例子,計畫啟動時,需要先將所有檔打包成一個檔 bundle.js ,然後在 html 引入,這個 多檔 -> bundle.js 的過程是非常耗時間的。

    第二張圖,是 Vite 的打包方式,剛剛說了, Vite 是直接把轉換後的 es module 的JavaScript程式碼,扔給 支持es module的瀏覽器 ,讓瀏覽器自己去載入依賴,也就是把壓力丟給了 瀏覽器 ,從而達到了計畫啟動速度快的效果。

    解決更新緩慢

    剛剛說了,計畫啟動時,將模組分成 依賴 源碼 ,當你更新程式碼時, 依賴 就不需要重新載入,只需要精準地找到是哪個 源碼 的檔更新了,更新相對應的檔就行了。這樣做使得更新速度非常快。

    Vite 同時利用 HTTP 頭來加速整個頁面的重新載入(再次讓瀏覽器為我們做更多事情):源碼模組的請求會根據 304 Not Modified 進行協商緩存,而依賴模組請求則會透過 Cache-Control: max-age=31536000,immutable 進行強緩存,因此一旦被緩存它們將不需要再次請求。

    生產環境

    剛剛咱們說的都是 開發環境 ,也說了, Vite 在是直接把轉化後的 es module 的JavaScript,扔給瀏覽器,讓瀏覽器根據依賴關系,自己去載入依賴。

    那有人就會說了,那放到 生產環境 時,是不是可以不打包,直接在開個 Vite 服務就行,反正瀏覽器會自己去根據依賴關系去自己載入依賴。答案是不行的,為啥呢:

  • 1、你程式碼是放在伺服器的,過多的瀏覽器載入依賴肯定會引起更多的網路請求

  • 2、為了在生產環境中獲得最佳的載入效能,最好還是將程式碼進行 tree-shaking、懶載入和 chunk 分割、CSS處理 ,這些最佳化操作,目前 esbuild 還不怎麽完善

  • 所以 Vite 最後的打包是使用了 Rollup

    結語

    我是林三心,一個熱心的前端菜鳥程式設計師。如果你上進,喜歡前端,想學習前端,那咱們可以交朋友,一起摸魚哈哈,摸魚群