<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為什么快呢?快在哪?說(shuō)一下我自己的理解吧

          共 2237字,需瀏覽 5分鐘

           ·

          2021-12-19 02:55


          前言



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


          說(shuō)實(shí)話,使用?Vite?開發(fā)之后,我都有點(diǎn)不想回到以前?Webpack?的項(xiàng)目開發(fā)了,因?yàn)橹暗捻?xiàng)目啟動(dòng)項(xiàng)目需要?30s?以上,修改代碼更新也需要?2s?以上,但是現(xiàn)在使用?Vite?,差不多啟動(dòng)項(xiàng)目只需要?1s?,而修改代碼更新也是超級(jí)快?。。?/span>


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



          問(wèn)題現(xiàn)狀



          ES模塊化支持的問(wèn)題


          咱們都知道,以前的瀏覽器是不支持?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?


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


          項(xiàng)目啟動(dòng)與代碼更新的問(wèn)題


          這個(gè)不用說(shuō),大家都懂:


          • 項(xiàng)目啟動(dòng):隨著項(xiàng)目越來(lái)越大,啟動(dòng)個(gè)項(xiàng)目可能要幾分鐘

          • 代碼更新:隨著項(xiàng)目越來(lái)越大,修改一小段代碼,保存后都要等幾秒才更新


          解決問(wèn)題



          解決啟動(dòng)項(xiàng)目緩慢



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


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

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



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




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



          解決更新緩慢



          剛剛說(shuō)了,項(xiàng)目啟動(dòng)時(shí),將模塊分成?依賴?和?源碼?,當(dāng)你更新代碼時(shí),?依賴?就不需要重新加載,只需要精準(zhǔn)地找到是哪個(gè)?源碼?的文件更新了,更新相對(duì)應(yīng)的文件就行了。這樣做使得更新速度非???。

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


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




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

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


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

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



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





          最后



          如果你覺(jué)得這篇內(nèi)容對(duì)你挺有啟發(fā),我想邀請(qǐng)你幫我三個(gè)小忙:

          1. 點(diǎn)個(gè)「在看」,讓更多的人也能看到這篇內(nèi)容(喜歡不點(diǎn)在看,都是耍流氓 -_-)

          2. 歡迎加我微信「qianyu443033099」拉你進(jìn)技術(shù)群,長(zhǎng)期交流學(xué)習(xí)...

          3. 關(guān)注公眾號(hào)「前端下午茶」,持續(xù)為你推送精選好文,也可以加我為好友,隨時(shí)聊騷。


          點(diǎn)個(gè)在看支持我吧,轉(zhuǎn)發(fā)就更好了
          瀏覽 107
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  国产乱子伦-区二区三区 | 亚洲综合大片69999 | 国产在线网站 | 五月色婷婷中文字幕在线 | 中圆A1变臉性爱免费视频在线 |