<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 3105字,需瀏覽 7分鐘

           ·

          2021-12-15 06:19

          作者:Sunshine_Lin

          簡介:「前端之神」的號主江湖人稱林三心,現(xiàn)已有100+篇原創(chuàng)文章,全網(wǎng)粉絲高達1w+,面試過超過100+個前端程序員,全網(wǎng)獲贊2w+,全網(wǎng)閱讀量播放量超過60w,更是B站「面試進階成為大佬」系列視頻的Up主。喜歡分享Vue,React,Typescript等高級前端知識。

          來源:SegmentFault  思否社區(qū)


          前言



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


          由于這幾個月使用了 Vue3 + TS + Vite 進行開發(fā),并且是真的被 Vite 強力吸粉了?。?!Vite最大的優(yōu)點就是:快?。?!非??欤。?!


          說實話,使用 Vite 開發(fā)之后,我都有點不想回到以前 Webpack 的項目開發(fā)了,因為之前的項目啟動項目需要 30s 以上,修改代碼更新也需要 2s 以上,但是現(xiàn)在使用 Vite ,差不多啟動項目只需要 1s ,而修改代碼更新也是超級快?。?!


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



          問題現(xiàn)狀



          ES模塊化支持的問題


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


          // index.js

          import { add } from './add.js'
          import { sub } from './sub.js'
          console.log(add(1, 2))
          console.log(sub(1, 2))

          // add.js
          export const add = (a, b) => a + b 

          // sub.js
          export const sub = (a, b) => a - b 


          你覺得這樣的一段代碼,放到瀏覽器能直接運行嗎?答案是不行的哦。那怎么解決呢?這時候打包工具出場了,他將 index.js、add.js、sub.js 這三個文件打包在一個 bundle.js 文件里,然后在項目 index.html 中直接引入 bundle.js ,從而達到代碼效果。一些打包工具,都是這么做的,例如 webpack、Rollup、Parcel


          項目啟動與代碼更新的問題


          這個不用說,大家都懂:


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

          • 代碼更新:隨著項目越來越大,修改一小段代碼,保存后都要等幾秒才更新


          解決問題



          解決啟動項目緩慢


          Vite 在打包的時候,將模塊分成兩個區(qū)域 依賴 和 源碼 :

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

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


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


          第二張圖,是 Vite 的打包方式,剛剛說了, Vite 是直接把轉(zhuǎn)換后的 es module 的JavaScript代碼,扔給 支持es module的瀏覽器 ,讓瀏覽器自己去加載依賴,也就是把壓力丟給了 瀏覽器 ,從而達到了項目啟動速度快的效果。


          解決更新緩慢


          剛剛說了,項目啟動時,將模塊分成 依賴 和 源碼 ,當你更新代碼時, 依賴 就不需要重新加載,只需要精準地找到是哪個 源碼 的文件更新了,更新相對應的文件就行了。這樣做使得更新速度非常快。

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

          生產(chǎn)環(huán)境



          剛剛咱們說的都是 開發(fā)環(huán)境 ,也說了, Vite 在是直接把轉(zhuǎn)化后的 es module 的JavaScript,扔給瀏覽器,讓瀏覽器根據(jù)依賴關系,自己去加載依賴。

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

          • 1、你代碼是放在服務器的,過多的瀏覽器加載依賴肯定會引起更多的網(wǎng)絡請求

          • 2、為了在生產(chǎn)環(huán)境中獲得最佳的加載性能,最好還是將代碼進行 tree-shaking、懶加載和 chunk 分割、CSS處理,這些優(yōu)化操作,目前 esbuild 還不怎么完善


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



          點擊左下角閱讀原文,到 SegmentFault 思否社區(qū) 和文章作者展開更多互動和交流,掃描下方”二維碼“或在“公眾號后臺回復“ 入群 ”即可加入我們的技術交流群,收獲更多的技術文章~

          - END -


          瀏覽 44
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲天堂无码在线观看 | 日韩无码一道本 | 免费在线亚洲 | 欧美色图在线视频 | 日韩精品毛片在线播放一 |