精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Vite 是怎樣利用 Esbuild 來提升性能的 ?

開發 前端
今天小編就通過本文和大家一起聊一聊 Vite 是怎樣利用 Esbuild 來提升性能的。

前言

在上一篇 為什么有人說 vite 快,有人卻說 vite 慢?[1] 中,我們提到過開發模式下使用 Vite 會有首屏性能下降的負面效果。之所以會造成首屏性能下降,一方面是 dev server 需要完成預構建才可以響應首屏請求;另一方面是需要對請求文件做實時轉換。

也許有的同學會問,是不是針對這兩個方面做優化,就可以提升首屏性能呢?原則上這樣是沒有問題的,而且 Vite 也是這么做的。為了能提升性能,Vite 另辟蹊徑的借助了 Esbuild 能快速完成項目打包、文件轉換的能力來進行預構建、內容轉換,效果非常好。

今天小編就通過本文和大家一起聊一聊 Vite 是怎樣利用 Esbuild 來提升性能的。

本文的目錄結構如下:

  •  初探 Esbuid[2]
  •  什么是 Esbuild[3]
  •  關鍵 API \- transform \& build[4]
  •  plugin[5]
  •  Esbuild 在 Vite 中的巧妙使用[6]
  •  預構建[7]
  •  middlewares 中內容轉換[8]
  •  結束語

初探 Esbuild

首先,小編先帶大家簡單了解一下 Esbuild,其官方地址是: **Esbuild[9]**。

什么是 Esbuild

Esbuild 是一款基于 Go 語言開發的 javascript 打包工具,最大的一個特征就是快。

通過官網提供的一張圖,我們可以清晰的看到 Esbuild 的表現是多么優秀:

image.png

同樣規模的項目,使用 Esbuild 可以將打包速度提升 10 - 100 倍,這對廣大一直飽受 Webpack 緩慢打包速度折磨的開發人員來說,簡直就是福音。

而 Esbuild 之所以能這么快,主要原因有兩個:

  •  Go 語言開發,可以多線程打包,代碼直接編譯成機器碼;
  •   Webpack 一直被人詬病構建速度慢,主要原因是在打包構建過程中,存在大量的 resolve、load、transform、parse 操作(詳見 為什么有人說 vite 快,有人卻說 vite 慢?- 快速的冷啟動[10] ),而這些操作通常是通過 javascript 代碼來執行的。要知道,javascript 并不是什么高效的語言,在執行過程中要先編譯后執行,還是單線程并且不能利用多核 cpu 優勢,和 Go 語言相比,效率很低。
  •  可充分利用多核 cpu 優勢;

關鍵 API - transfrom & build

Esbuild 并不復雜。它對外提供了兩個 API - transform 和 build,使用起來非常簡單。

transfrom,轉換的意思。通過這個 api,我們可以將 ts、jsx、tsx 等格式的內容轉化為 js。transfrom 只負責文件內容轉換,并不會生成一個新的文件。

build,構建的意思,根據指定的單個或者多個入口,分析依賴,并使用 loader 將不同格式的內容轉化為 js 內容,生成一個或多個 bundle 文件。

這兩個 API 的使用方式:

const res = await esbuild.transform(code, options) // 將 code 轉換為指定格式的內容
esbuild.build(options) // 打包構建
復制代碼

關于使用 transform、build 需要傳入的具體配置項,本文就不詳細說明了,官網對這一塊兒有很詳細的說明,感興趣的同學可以去官網 - simple-options[11]、Advanced options[12] 看看,也可以自己動手試試。

plugin

和 Webpack、Rollup 等構建工具一樣,Esbuild 也提供了供外部使用的 plugin,使得我們可以介入構建打包過程。

  •  在這里要說明一點,只有 build 這個 API 的入參中可以配置 plugin,transform 不可以。

一個標準的 plugin 的標準格式如下:

let customerPlugin = {
name: 'xxx',
setup: (build) => {
build.onResolve({ filter: '', namespace: '' }, args => { ...});
build.onLoad({ filter: '', namespace: ''}, args => { ... });
build.onStart(() => { ... });
build.onEnd((result) => { ... });
}
}
復制代碼

其中,setup 可以幫助我們在 build 的各個過程中注冊 hook。

Esbuild 對外提供的 hook 比較簡單,總共 4 個:

  •  onResolve, 解析 url 時觸發,可自定義 url 如何解析。如果 callback 有返回 path,后面的同類型 callback 將不會執行。所有的 onResolve callback 將按照對應的 plugin 注冊的順序執行。
  •  onLoad, 加載模塊時觸發,可自定義模塊如何加載。如果 callback 有返回 contents,后面的同類型 callback 將不會執行。所有的 onLoad callback 將按照對應的 plugin 注冊的順序執行。
  •  onStart, 每次 build 開始時都會觸發,沒有入參,因此不具有改變 build 的能力。多個 plugin 的 onStart 并行執行。
  •  onEnd, 每次 build 結束時會觸發,入參為 build 的結果,可對 result 做修改。所有的的 onEnd 將按照對應的 plugin 注冊的順序執行。

正是有了 onResolve、onLoad、onStart、onEnd,我們可以在 build 過程中的解析 url、加載模塊內容、構建開始、構建結束階段介入,做自定義操作。

Esbuild 在 Vite 中的巧妙使用

了解了 Esbuild 的基本用法以后,小編就帶大家一起來看看 Vite 是怎么利用 Esbuild 來做預構建和內容轉換的。

預構建

先來回顧一下為什么要做預構建。

原因有兩點:

  •  將非 ESM 規范的代碼轉換為符合 ESM 規范的代碼;
  •  將第三方依賴內部的多個文件合并為一個,減少 http 請求數量;

要完成預構建,最關鍵的兩點是找到項目中所有的第三份依賴和對第三方依賴做合并、轉換。借助 Esbuild,Vite 很輕松的實現了這兩個訴求。

  •  尋找第三方依賴

尋找第三方依賴的過程非常簡單,分為兩步:

和 Webpack、Rollup、Parcel 等構建工具一樣,Esbuild 在做打包構建時也要構建模塊依賴圖 - module graph(具體過程可參考 為什么有人說 vite 快,有人卻說 vite 慢?- 快速的冷啟動[13] 中 Webpack 構建 module graph)。

在構建 module graph 時,第一步就是解析模塊的絕對路徑,這個時候就會觸發 onResolve hook。在 onResolve hook 觸發時,會傳入模塊的路徑。根據模塊的路徑,我們就可以判斷出這個模塊是第三方依賴還是業務代碼。

   舉個 ??,

// main.tsx
import react from 'react';
import CustomeComponent from './components/CustomeComponent';
...
復制代碼

在對 main.tsx 的內容做 parser 操作時,能知道 main.tsx 依賴 react 和 CustomeComponent,然后開始解析 react 和 CustomeComponent。

解析 react、CustomeComponent 時,會觸發 onResolve hook,入參分別為 'react' 和 './components/CustomeComponent'。根據入參,我們可以很清楚的區分 'react' 是第三方依賴,'./components/CustomeComponet' 是業務代碼。

這樣,esbuild 完成構建,項目中的第三方依賴也就收集完畢了。所有的第三方依賴會收集到一個 deps 列表中。

  1.   定義一個帶 onResolve hook 和 onLoad hook 的 esbuild plugin;
  2.   執行 esbuild 的 build 方法做打包構建;
  •  合并、轉換第三方依賴

知道了項目中的第三方依賴以后,再做合并、轉換操作就非常簡單了。

這一步, Vite 直接通過 esbuild 提供的 build 方法,指定 entryPoints 為收集到的第三方依賴,format 為 esm,再做一次打包構建。

這一次,會對第三方依賴做合并、轉換操作。打包構建完成以后,再把構建內容輸出到 /node_modules/.vite/deps 下。

這樣,通過兩次 esbuild.build,預構建就完成了。

middlewares 中內容轉換

Vite 中源文件的轉換是在 dev server 啟動以后通過 middlewares 實現的。

當瀏覽器發起請求以后,dev sever 會通過相應的 middlewares 對請求做處理,然后將處理以后的內容返回給瀏覽器。

middlewares 對源文件的處理,分為 resolve、load、transform、parser 四個過程:

  1.    resolve - 解析 url,找到源文件的絕對路徑;
  2.    load - 加載源文件。如果是第三方依賴,直接將預構建內容返回給瀏覽器;如果是業務代碼,繼續 transform、parser。
  3.    transfrom - 對源文件內容做轉換,即 ts -> js, less -> css 等。轉換完成的內容可以直接返回給瀏覽器了。
  4.    parser - 對轉換以后的內容做分析,找到依賴模塊,對依賴模塊做預轉換 - pre transform 操作,即重復 1 - 4。

pre transform 是 Vite 做的一個優化點。預轉換的內容會先做緩存,等瀏覽器發起請求以后,如果已經完成轉換,直接將緩存的內容返回給瀏覽器。

Vite 在處理步驟 3 時,是通過 esbuild.transform 實現的,對比 Webpack 使用各個 loader 處理源文件,那是非常簡單、快捷的。

結束語

有一說一,Vite 通過 Esbuild 來優化預構建和內容轉換的思路非常棒,這給我們以后處理同類問題提供了解決方案,真心給尤大點 ????。

另外除了使用 Esbuild, Vite 內部還有很多可以拿出來單獨講的優化技巧,這個以后有機會小編可以再給大家詳細講講。

責任編輯:龐桂玉 來源: 前端進階之旅
相關推薦

2023-04-10 09:15:25

Vite 4.3SWC 插件

2015-01-21 15:40:44

GoRuby

2022-02-24 10:42:32

JavaScript開發報告

2021-05-08 08:35:33

Webpack前端性能

2016-10-27 08:39:35

大數據設計定量

2015-05-29 14:01:00

網絡優化網絡性能

2025-01-13 00:00:00

2015-06-01 10:14:13

微服務AWS性能彈性計算云

2022-10-15 07:49:18

代碼虛擬線程

2016-09-26 13:50:52

Linux系統性能

2021-09-27 09:52:41

FacebookBOLTLinux

2011-08-09 17:15:45

注冊表注冊表編輯器

2010-03-19 09:22:37

至強5600

2009-03-22 19:19:15

多核多核服務器多核歷史

2013-07-24 15:33:57

紅帽

2014-07-04 09:58:15

gemsRails

2022-02-24 07:56:42

開發Viteesbuild

2024-11-28 10:26:32

2023-04-21 10:10:07

Vite 4.3前端

2020-10-27 08:24:01

Java
點贊
收藏

51CTO技術棧公眾號

成人欧美一区二区三区黑人| 日韩国产精品视频| 先锋影音男人资源| 国产av一区二区三区| 激情婷婷亚洲| 日韩精品中文字幕久久臀| 日本成人中文字幕在线| dy888亚洲精品一区二区三区| 成人激情黄色小说| 国产精品成人va在线观看| 黄色片在线观看网站| 妖精视频一区二区三区| 欧美久久久久免费| 国产九九九九九| 四虎久久免费| 91香蕉视频黄| 亚洲a在线观看| 精品国产一区二区三区四| 999国产精品999久久久久久| 精品国产一区二区三区久久久蜜月 | 最新黄色网址在线观看| 欧美精品九九| 永久免费毛片在线播放不卡| 在线观看成人动漫| 日韩综合久久| 色婷婷av一区二区三区大白胸| 中文字幕在线中文| 成人动漫在线免费观看| 白白色 亚洲乱淫| 91欧美激情另类亚洲| 国产成人一级片| 欧美日本免费| 日韩性xxxx爱| 久久久视频6r| 亚洲国产合集| 亚洲福利精品在线| 国内精品国产三级国产aⅴ久| 成人一区视频| 色婷婷久久99综合精品jk白丝 | 国产精品色网| 欧美二区在线播放| 91香蕉一区二区三区在线观看| 久草成人在线| 精品视频久久久久久| 蜜臀av粉嫩av懂色av| 深夜福利一区二区三区| 欧美日本一区二区三区四区| 999在线免费视频| 欧美黑人一区| 色婷婷精品久久二区二区蜜臂av| 男人日女人bb视频| 瑟瑟视频在线看| 午夜视频在线观看一区| 日韩精品一区在线视频| 男人天堂亚洲天堂 | 天天操夜夜操视频| 一本一道久久综合狠狠老精东影业| 久久6免费高清热精品| 中文乱码字幕高清一区二区| 日韩片欧美片| 日韩最新中文字幕电影免费看| www.黄色在线| 波多野结衣在线观看一区二区| 亚洲天堂免费视频| 亚洲精品成人无码| 成人免费电影网址| 菠萝蜜影院一区二区免费| 91动漫免费网站| 国产精品久久观看| 欧美另类极品videosbestfree| 无码黑人精品一区二区| 91精品观看| 久久99国产精品自在自在app| 在线免费日韩av| 亚洲一级二级| 欧美最猛黑人xxxx黑人猛叫黄| 9i看片成人免费看片| 日韩电影网1区2区| 91久久久久久| 色婷婷av一区二区三区之e本道| av成人动漫在线观看| 欧美午夜欧美| 美女羞羞视频在线观看| 亚洲午夜久久久久久久久电影网| 免费看毛片的网址| 欧美日韩电影免费看| 在线观看成人免费视频| 99精品视频国产| 视频一区日韩精品| 亚洲区免费影片| 国产一区二区播放| 国产欧美亚洲一区| 国产日韩亚洲欧美| 韩国av在线免费观看| 2020国产成人综合网| 亚洲精品乱码视频| 国产精品69xx| 欧美在线|欧美| 日本成人xxx| 亚州国产精品| 日韩精品极品毛片系列视频| 日日碰狠狠添天天爽| 伊人久久大香线蕉综合热线| 日韩美女主播视频| 精品久久久中文字幕人妻| 91色|porny| 丰满人妻一区二区三区53号 | 欧美不卡高清| 日韩美女福利视频| 国产精品熟女久久久久久| 99久久久久久| 穿情趣内衣被c到高潮视频| gay欧美网站| 日韩视频一区二区在线观看| 久久久久亚洲av成人无码电影| 欧美日韩网站| 国产精品十八以下禁看| 午夜视频1000| 一区二区三区精品视频在线| 亚洲高清在线免费观看| 免费成人蒂法| 欧美激情在线有限公司| 91精品国产乱码久久| 91看片淫黄大片一级在线观看| 欧美日韩激情四射| 亚洲毛片在线免费| 国产亚洲激情在线| 国产区在线观看视频| 国产精品99久久久久久久女警 | 国产一区二区视频在线免费观看| 日本美女在线中文版| 色综合久久99| 美女又爽又黄视频毛茸茸| 欧美激情偷拍| 成人伊人精品色xxxx视频| 成人网视频在线观看| 欧美午夜片在线免费观看| 亚洲高清无码久久| 亚洲欧美综合| 91国产在线播放| 黄色一级片在线观看| 欧美日韩五月天| 中字幕一区二区三区乱码| 久久精品麻豆| 蜜桃成人在线| 精品成人av| 亚洲人在线观看| 日韩黄色一级视频| 久久精品欧美日韩精品| 一本色道无码道dvd在线观看| 日韩伦理一区二区三区| 91av在线播放| 免费在线稳定资源站| 欧美日韩综合视频| 日本少妇高潮喷水xxxxxxx| 另类天堂av| 日韩久久不卡| 成人午夜一级| 欧美成人精品激情在线观看| 国产女人高潮时对白| 亚洲视频小说图片| 美女日批在线观看| 一区在线播放| 精品在线观看一区二区| 爱情电影社保片一区| 亚洲欧美国产精品久久久久久久| 日韩精品一区二区亚洲av| 91免费观看视频| 男女视频一区二区三区| 欧美aaaa视频| 999热视频| 精精国产xxxx视频在线野外| 国产视频精品va久久久久久| 国产一区二区视频免费| 国产精品久久久久久久久免费相片| 午夜精品中文字幕| 欧美1区视频| 国产专区一区二区| 亚洲四虎影院| 久久精品视频导航| 丰满熟妇人妻中文字幕| 色噜噜偷拍精品综合在线| 国产又粗又长又黄的视频| 紧缚捆绑精品一区二区| 亚洲一区二区三区av无码| 在线看成人短视频| 成人xvideos免费视频| 乱插在线www| 亚洲人成77777在线观看网| 亚洲无码精品在线播放| 亚洲你懂的在线视频| 日本五十肥熟交尾| 蜜臀av国产精品久久久久 | 国产午夜精品一区二区三区欧美| 日韩视频专区| 99re8这里有精品热视频8在线 | 久久久久久久久成人| 国自产精品手机在线观看视频| 国产youjizz在线| 日韩一区二区三| 黄色在线视频网址| 一区二区三区色| 谁有免费的黄色网址| 国v精品久久久网| 我看黄色一级片| 日韩午夜av| 中国成人在线视频| 亚洲区小说区图片区qvod| 91久久嫩草影院一区二区| 亚洲精品一区| 欧美疯狂xxxx大交乱88av| 国产黄色在线播放| 亚洲成色www8888| 国产精品玖玖玖| 色88888久久久久久影院按摩| 久草成人在线视频| 中文字幕中文字幕一区二区| 中文字幕在线免费看线人| 国产麻豆精品一区二区| 亚洲三级视频网站| 国产毛片一区| 欧美又粗又长又爽做受| 自拍欧美日韩| 正在播放亚洲| 欧美亚洲国产激情| 裸模一区二区三区免费| 韩国精品福利一区二区三区| 91美女片黄在线观看游戏| 九色成人搞黄网站| 欧日韩不卡在线视频| 爱啪视频在线观看视频免费| 欧美国产亚洲精品久久久8v| 麻豆视频在线观看免费| 中文字幕亚洲欧美日韩高清| 久草在线免费福利资源| 亚洲精品福利视频| 四虎在线视频免费观看| 欧美va在线播放| 亚洲成a人片77777精品| 欧美一区二区三级| 国产毛片毛片毛片毛片| 精品婷婷伊人一区三区三| 无码人妻丰满熟妇精品 | 中文字幕在线播放日韩| 日本精品视频一区二区三区| 在线观看日本视频| 在线精品视频一区二区三四| 久久久久久久久黄色| 欧美性生交xxxxxdddd| 久久亚洲精品国产| 精品久久久久久中文字幕大豆网| 国产精品第一页在线观看| 亚洲成av人片在线观看| 日本少妇性高潮| 午夜一区二区三区视频| 日韩字幕在线观看| 午夜精品一区二区三区免费视频 | 久久久久久99| 深爱激情久久| 午夜精品福利一区二区| 999久久久国产精品| 宅男在线精品国产免费观看| 久久在线视频免费观看| 老司机午夜网站| 中文视频一区| 91九色丨porny丨国产jk| 99riav国产精品| 一本久道综合色婷婷五月| 免费不卡在线观看| 亚洲高清在线不卡| 成人午夜免费电影| 精品人妻少妇嫩草av无码| 亚洲国产精品ⅴa在线观看| 国产色无码精品视频国产| 亚洲一区二区三区在线看| 国产又黄又粗又爽| 欧美艳星brazzers| 999免费视频| 亚洲精品久久久久久久久久久 | 久久色视频免费观看| 免费看91的网站| 亚洲欧美激情小说另类| 午夜精品久久久久久久久久久久久蜜桃 | 国产一区二区在线影院| 永久免费未满蜜桃| 国产视频一区二区在线观看| 一区二区三区在线播放视频| 亚洲综合视频在线观看| 69亚洲精品久久久蜜桃小说 | 神马午夜精品95| 一本色道久久88综合亚洲精品ⅰ | 亚洲欧美激情插| 久久99精品波多结衣一区| 欧美吞精做爰啪啪高潮| 亚洲精品18在线观看| 国产亚洲人成网站在线观看| 91精品久久| 国产精品99一区| 国产精品45p| 亚洲一区二区三区涩| 亚洲国产免费看| 拔插拔插华人永久免费| 91美女在线观看| 免费中文字幕在线| 91福利资源站| 黄片毛片在线看| 精品国产自在精品国产浪潮| 天堂8中文在线最新版在线| 亚洲一区二区三区四区在线播放 | 国产日本在线播放| 日韩 欧美一区二区三区| 午夜福利三级理论电影| 中文字幕一区二区三区四区| 在线天堂中文字幕| 欧美成人一区二区三区在线观看| 午夜激情视频在线观看| 欧美一区二区大胆人体摄影专业网站| www久久久| 亚洲成人自拍视频| 久久精品30| 欧美深性狂猛ⅹxxx深喉| 亚洲精品视频观看| 一本色道久久综合精品婷婷 | 91在线中字| 国产欧美日韩高清| 国产a久久精品一区二区三区 | 国产成人av免费在线观看| 色婷婷激情久久| 日本加勒比一区| 欧美高清不卡在线| 精品国产三级| 国产免费色视频| 久久99久久99| 国产一区第一页| 欧美性色黄大片| 国产尤物视频在线| 日韩av电影在线网| 亚州国产精品| 国产成人无码av在线播放dvd| 99久久精品情趣| 韩国av免费观看| 亚洲精品久久久久久久久| 亚洲性色av| 欧美日韩精品久久| 日韩精品亚洲专区| 97人妻精品一区二区免费| 色综合久久久网| 成人综合影院| 国产日韩欧美视频在线| 久久一本综合| 亚洲综合123| 亚洲一区免费观看| 亚洲狼人综合网| 久久久人成影片一区二区三区观看 | 91精品国产免费| 人人超在线公开视频| 成人91免费视频| 在线视频观看日韩| 欧美bbbbb性bbbbb视频| 色综合咪咪久久| 91在线导航| 91在线精品视频| 很黄很黄激情成人| 亚洲av无码一区二区三区观看| 欧美日在线观看| 9色在线观看| 114国产精品久久免费观看| 激情综合中文娱乐网| 性欧美丰满熟妇xxxx性久久久| 欧美性开放视频| 日韩三级影院| av一区二区三区四区电影| 99精品热视频只有精品10| 天堂久久精品忘忧草| 91精品国产一区二区三区| 国产桃色电影在线播放| 久久久久天天天天| 免费看欧美美女黄的网站| 日韩在线观看视频一区二区| 日韩欧美在线网站| 日韩大片免费观看| 五月天亚洲综合| 岛国一区二区在线观看| 精品成人无码久久久久久| 北条麻妃99精品青青久久| 欧美aaaaaaaa牛牛影院| 免费涩涩18网站入口| 洋洋av久久久久久久一区| 内衣办公室在线| 亚洲在线免费看| 久久蜜桃精品| 五月天丁香激情| 在线看日韩av| 成午夜精品一区二区三区软件| 99re在线视频免费观看| 亚洲精品写真福利| 看电影就来5566av视频在线播放| 92福利视频午夜1000合集在线观看| 一本综合精品| 日日骚一区二区三区|