偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

深入了解Vite:依賴預(yù)構(gòu)建原理

開發(fā) 前端
? commonJS 與 UMD兼容:因為Vite在開發(fā)階段主要是依賴瀏覽器原生ES模塊化規(guī)范,所以無論是我們的源代碼還是第三方依賴都得符合ESM的規(guī)范,但是目前并不是所有第三方依賴都有ESM的版本,所以需要對第三方依賴進行預(yù)編譯,將它們轉(zhuǎn)換成EMS規(guī)范的產(chǎn)物。

前言

前面我們有提到Vite在開發(fā)階段,提倡的是一個no-bundle的理念,不必與webpack那樣需要先將整個項目進行打包構(gòu)建。但是no-bundle的理念只適合源代碼部分(我們自己寫的代碼),vite會將項目中的所有模塊分為依賴與源碼兩部分。

依賴:指的是一些不會變動的一些模塊,如:node_modules中的第三方依賴,這部分代碼vite會在啟動本地服務(wù)之前使用esbuild進行預(yù)構(gòu)建。esbuild 使用 Go 編寫,比使用 JavaScript 編寫的打包器預(yù)構(gòu)建依賴快 10-100 倍。

源碼:指的是我們自己開發(fā)時寫的那部分代碼,這部分代碼可能會經(jīng)常變動,并且一般不會同時加載所有源代碼。

所以總結(jié)來說:no-bundle是針對源碼的,而預(yù)構(gòu)建是針對第三方依賴的

使用預(yù)構(gòu)建的原因

主要有以下兩點:

  • commonJS 與 UMD兼容:因為Vite在開發(fā)階段主要是依賴瀏覽器原生ES模塊化規(guī)范,所以無論是我們的源代碼還是第三方依賴都得符合ESM的規(guī)范,但是目前并不是所有第三方依賴都有ESM的版本,所以需要對第三方依賴進行預(yù)編譯,將它們轉(zhuǎn)換成EMS規(guī)范的產(chǎn)物。

比如React,它就沒有ESM的版本,所以在使用Vite時需要預(yù)構(gòu)建

圖片圖片

  • 性能:為了提高后續(xù)頁面的加載性能,Vite將那些具有許多內(nèi)部模塊的 ESM 依賴項轉(zhuǎn)換為單個模塊。

比如常用的loads-es

我們引入lodash-es工具包中的debounce方法,此時它理想狀態(tài)應(yīng)該是只發(fā)出一個請求

import  { debounce }  from 'lodash-es'

事實也是這樣:

圖片圖片

但這是預(yù)構(gòu)建的功勞,如果我們對lodash-es關(guān)閉預(yù)構(gòu)建呢?

vite配置文件加上如下代碼,再來試試:

// vite.config.js
optimizeDeps: {
    exclude: ['lodash-es']
  }

圖片圖片

可以看到,此時發(fā)起了600多個請求,這是因為lodash-es 有超過 600 個內(nèi)置模塊!

vite通過將 lodash-es 預(yù)構(gòu)建成單個模塊,只需要發(fā)起一個HTTP請求!可以很大程度地提高加載性能

由于Vite的預(yù)構(gòu)建是基于性能優(yōu)異的Esbuild來完成的,所以并不會造成明顯的打包性能問題

開啟預(yù)構(gòu)建

默認配置

一般來說,Vite幫我們默認開啟了預(yù)構(gòu)建

圖片圖片

預(yù)構(gòu)建產(chǎn)物會存放在:node_modules/.vite/deps

圖片圖片

里面會有一個_metadata.json的文件,這里保存著已經(jīng)預(yù)構(gòu)建過的依賴信息

對于預(yù)構(gòu)建產(chǎn)物的請求,Vite會設(shè)置為強緩存,有效時間為1年,對于有效期內(nèi)的請求,會直接使用緩存內(nèi)容

圖片圖片

如果只有HTTP強緩存肯定也不行,如果用戶更新了依賴版本,在緩存過期之前,瀏覽器拿到的一直是舊版本的內(nèi)容。

所以Vite對本地文件也設(shè)置了緩存判斷,如果下面幾個地方任意一個地方有變動,Vite將會對依賴進行重新預(yù)構(gòu)建:

  • 項目依賴dependencies變更

圖片圖片

  • 各種包管理器的lock文件變更

圖片圖片

  • optimizeDeps配置內(nèi)容變更

圖片圖片

自定義配置

entries

默認情況下,Vite會抓取項目中的index.html來檢測需要預(yù)構(gòu)建的依賴

optimizeDeps: {
  entries: ['index.html']
}

如果指定了 build.rollupOptions.input,Vite 將轉(zhuǎn)而去抓取這些入口點。

exclude

排除需要預(yù)構(gòu)建的依賴項

optimizeDeps: {
  exclude: ['lodash-es']
}

include

默認情況下,不在 node_modules 中的依賴不會被預(yù)構(gòu)建。使用此選項可強制選擇預(yù)構(gòu)建的依賴項。

optimizeDeps: {
  include: ['lodash-es']
}

預(yù)構(gòu)建流程

還是從源碼入手,在啟動服務(wù)的過程中會執(zhí)行一個initDepsOptimizer表示初始化依賴優(yōu)化

圖片圖片

接著找到定義initDepsOptimizer方法的地方

圖片圖片

在這里會執(zhí)行createDepsOptimizer方法,再接著找到定義createDepsOptimizer的地方

圖片圖片

這里首先會去執(zhí)行l(wèi)oadCachedDepOptimizationMetadata用于獲取本地緩存中的metadata數(shù)據(jù)

圖片圖片

該函數(shù)會在獲取到_metadata.json文件內(nèi)容之后去對比lock文件hash以及配置文件optimizeDeps內(nèi)容,如果一樣說明預(yù)構(gòu)建緩存沒有任何改變,無需重新預(yù)構(gòu)建,直接使用上次預(yù)構(gòu)建緩存即可。

如果沒有緩存時則需要進行依賴掃描:

圖片圖片

這里主要是會調(diào)用scanImport方法,從名字也能看出該方法應(yīng)該是通過掃描項目中的import語句來得到需要預(yù)編譯的依賴

圖片圖片

最終會返回一個prepareEsbuildScanner方法:

圖片圖片

最后該方法中會使用esbuild對掃描出來的依賴項進行預(yù)編譯。

責(zé)任編輯:武曉燕 來源: 前端南玖
相關(guān)推薦

2021-01-19 12:00:39

前端監(jiān)控代碼

2021-04-28 10:13:58

zookeeperZNode核心原理

2024-04-12 07:51:05

SpringBean初始化

2021-01-12 09:03:17

MySQL復(fù)制半同步

2010-07-13 09:36:25

2010-11-19 16:22:14

Oracle事務(wù)

2020-09-21 09:53:04

FlexCSS開發(fā)

2022-08-26 13:48:40

EPUBLinux

2009-08-25 16:27:10

Mscomm控件

2010-06-23 20:31:54

2020-07-20 06:35:55

BashLinux

2020-11-06 16:50:43

工具GitLab CICD

2011-07-18 15:08:34

2022-06-03 10:09:32

威脅檢測軟件

2010-11-15 11:40:44

Oracle表空間

2018-06-22 13:05:02

前端JavaScript引擎

2010-09-27 09:31:42

JVM內(nèi)存結(jié)構(gòu)

2013-04-16 10:20:21

云存儲服務(wù)云存儲SLA服務(wù)水平協(xié)議

2010-11-08 13:54:49

Sqlserver運行

2023-10-13 00:09:20

桶排序排序算法
點贊
收藏

51CTO技術(shù)棧公眾號