精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲福利在线观看| 99久久综合99久久综合网站| 日韩视频免费在线观看| 五月天婷婷影视| 国产天堂在线播放视频| www.一区二区| 国产精品美女视频网站| 欧美国产在线看| 天天久久夜夜| 91精品蜜臀在线一区尤物| 国产3p露脸普通话对白| 亚洲乱亚洲乱妇| 成人免费av资源| 国产美女扒开尿口久久久| 精品视频久久久久| 欧美 变态 另类 人妖| 免费的黄色av| 老色鬼精品视频在线观看播放| 欧美精品在线免费| 女女互磨互喷水高潮les呻吟 | 久久综合社区| 欧美麻豆精品久久久久久| 亚洲熟妇无码一区二区三区| 免费的黄网站在线观看| 91蝌蚪国产九色| 91中文字精品一区二区| 啪啪小视频网站| 亚洲国产日韩欧美一区二区三区| 视频在线一区二区| 人妻无码中文久久久久专区| 动漫一区二区三区| 欧美色倩网站大全免费| 免费av观看网址| 污的网站在线观看| 一区二区中文视频| 亚洲国产一区在线| 久久精品色图| 91色九色蝌蚪| 国产一区二区在线观看免费播放| 国产免费黄视频| 亚洲一级片在线播放| 欧美变态网站| 欧美α欧美αv大片| 午夜xxxxx| 全球中文成人在线| 欧美丝袜自拍制服另类| 亚洲 中文字幕 日韩 无码| 男人的天堂免费在线视频| 亚洲永久精品国产| 欧美a级免费视频| av大大超碰在线| 中文字幕亚洲成人| 一区二区三区免费看| 国产二区在线播放| 亚洲国产成人午夜在线一区| 欧洲精品亚洲精品| 男人天堂网在线观看| 久久久久一区二区三区四区| 国产一区福利视频| 天天综合在线视频| 91丨porny丨国产入口| 精品无人区一区二区三区竹菊| 少妇精品视频一区二区| 99久久99精品久久久久久| 精品中文字幕人| 欧美日韩国产综合视频| 久久精品人人爽人人爽| 日本欧洲国产一区二区| freemovies性欧美| 国产精品理论在线观看| 国产精品美女在线播放| 欧美黑人猛交| 岛国av午夜精品| 50路60路老熟妇啪啪| 午夜av成人| 91麻豆精品国产91久久久久 | 九九热精品在线观看| 欧美日韩一区二区三区四区在线观看| 欧美成在线视频| 日韩免费黄色片| 午夜综合激情| 国产欧美一区二区三区久久 | 亚洲精品中文字幕| 在线欧美小视频| 在线观看免费不卡av| 欧美片网站免费| 日韩精品视频在线免费观看| 午夜在线观看一区| 一区二区电影在线观看| 久久免费观看视频| 中文字幕av片| 国产·精品毛片| 日本一区二区三区www| 成人ww免费完整版在线观看| 午夜视频一区二区| 色悠悠久久综合网| www.成人网| 国产午夜精品一区理论片飘花| www.xx日本| 亚洲高清av| 国产精品午夜一区二区欲梦| 亚洲AV无码成人片在线观看 | 欧日韩不卡视频| 伊人久久综合| 国产精品网站大全| 日韩中文字幕免费在线观看| 中文在线资源观看网站视频免费不卡| 成人在线免费观看网址| 欧美1级2级| 精品精品欲导航| 99热这里只有精品4| 在线观看日韩av电影| 成人a在线视频| 男男激情在线| 亚洲一区二区三区在线看| 国产九九在线视频| 成人在线tv视频| 色琪琪综合男人的天堂aⅴ视频| 日本一区二区三区四区五区| 精彩视频一区二区三区| 久久亚裔精品欧美| 麻豆av在线播放| 欧美老年两性高潮| 国产成人无码精品久久二区三| 午夜国产精品视频免费体验区| 国产精品福利无圣光在线一区| 韩国av电影在线观看| 亚洲视频一区二区在线| 男女视频在线看| 亚洲第一福利社区| 午夜精品一区二区三区在线视| 国产精品爽爽久久| 国产精品久久久久久久久久久免费看 | 亚洲欧洲精品一区二区三区 | 乱馆动漫1~6集在线观看| 欧美一区二区在线看| 国产又粗又长又黄的视频| 爽爽淫人综合网网站| 精品乱子伦一区二区三区| 毛片大全在线观看| 欧美mv日韩mv亚洲| 欧美日韩人妻精品一区二区三区 | 国产大学生av| 91精品国产乱码久久久久久| 国产欧美日韩免费看aⅴ视频| 国外av在线| 色域天天综合网| 欧美 日本 国产| 国产婷婷精品| 久久草视频在线看| 中文字幕在线免费观看视频| 国产手机视频精品| 日韩综合在线观看| 久久精品一区二区| 久久久久久三级| 欧美一级精品| 国产免费一区二区三区在线能观看 | 日韩成人av网站| 色成人免费网站| 色偷偷91综合久久噜噜| 国产精品一区二区人人爽| 综合久久综合久久| 在线观看一区二区三区视频| 欧美网站在线| 久久综合九九| 国产成人福利夜色影视| 久久精品成人欧美大片| 国产熟女一区二区三区五月婷| 亚洲精品ww久久久久久p站| 国模大尺度视频| 亚洲另类视频| 欧美日韩在线播放一区二区| 国产精品天堂蜜av在线播放 | 人人爽人人爽人人片| 久久99精品久久久久久动态图| 一区二区三区四区免费观看| 丁香婷婷成人| 日本成熟性欧美| 久久久久久久久免费视频| 日韩写真欧美这视频| 日本一区二区免费在线观看| 国产欧美视频在线观看| 久久久精品视频国产| 亚洲经典在线看| 先锋影音一区二区三区| 日韩免费一级| 热久久这里只有| 色综合久久影院| 亚洲第一级黄色片| 日本三级一区二区三区| 亚洲制服丝袜av| av黄色免费网站| 国产一区二区视频在线播放| 欧美视频在线观看网站| 成人3d精品动漫精品一二三| caoporn国产精品免费公开| 大胆人体一区| 欧美理论片在线观看| 国产免费av在线| 日韩美女主播在线视频一区二区三区 | 欧美最猛性xxxxx亚洲精品| 无遮挡动作视频在线观看免费入口| 日韩欧美一区中文| 日韩黄色片网站| 亚洲一区二区av电影| 亚洲а∨天堂久久精品2021| 国产精品资源网站| 国产wwwxx| 一区二区三区四区五区精品视频| 一区二区三区在线视频111| 国产亚洲成av人片在线观黄桃| 国产日本欧美视频| 成人香蕉视频| 国外成人性视频| 国产激情小视频在线| 精品亚洲永久免费精品| 性猛交富婆╳xxx乱大交天津| 91精品办公室少妇高潮对白| 久久国产精品二区| 国产精品成人免费精品自在线观看 | 亚洲欧美一区二区精品久久久 | 日韩精品免费一线在线观看| 精品人妻一区二区三区蜜桃 | 欧美日韩大片免费观看| 91热精品视频| 成人深夜福利| 全球成人中文在线| 91超碰国产在线| 久久久久久久国产| 中文在线免费| 久久精品国产亚洲一区二区| 91啦中文在线| 亚洲人成在线一二| 国模精品一区二区| 日韩精品中文字幕视频在线| 黄色小视频免费观看| 日韩午夜在线影院| 国产日产亚洲系列最新| 在线成人av影院| 国产精品国产三级国产普通话对白| 91成人免费电影| aaaaaa毛片| 日韩欧美一区二区三区| 精品在线视频免费| 亚洲永久精品大片| 精品少妇久久久久久888优播| 一区二区久久久| 精品夜夜澡人妻无码av| 国产在线一区二区| 色天使在线观看| 久久99久久99| 三区视频在线观看| 国产一区二区福利| 亚洲制服中文字幕| 国产在线一区二区| 久久久久中文字幕亚洲精品 | 欧美亚洲国产精品久久| 青青草国产精品| 日本欧美视频| 亚洲最新在线| 伊人久久大香线| 国产女主播自拍| 99精品国产一区二区青青牛奶 | 日韩电影一二三区| 91极品尤物在线播放国产| 蜜臀av性久久久久蜜臀aⅴ流畅| 手机av在线免费| 国产成人aaa| 偷偷色噜狠狠狠狠的777米奇| 26uuu色噜噜精品一区二区| 欧洲av一区二区三区| 中文字幕在线视频一区| 免费毛片在线播放免费| 欧美日韩国产在线| 中文字幕在线观看高清| 欧美一卡2卡3卡4卡| 天天色棕合合合合合合合| 国产亚洲精品美女| 激情在线小视频| 高清视频欧美一级| 桃子视频成人app| 91在线免费视频| 青青操综合网| 一区二区不卡在线观看| 国产综合视频| 国产v亚洲v天堂无码久久久| 久久91精品久久久久久秒播| 图片区偷拍区小说区| 久久久久久久综合狠狠综合| 日韩国产第一页| 污片在线观看一区二区| 中文在线资源天堂| 精品国产乱码久久久久久闺蜜| 韩国中文免费在线视频| 欧美精品亚州精品| 色香欲www7777综合网| 超碰97国产在线| 色88久久久久高潮综合影院| 成人免费网站入口| 麻豆一区二区在线| 色婷婷免费视频| 国产精品不卡在线| 日韩中文字幕在线观看视频| 7777精品伊人久久久大香线蕉完整版| 无码h黄肉3d动漫在线观看| 综合欧美国产视频二区| 毛片在线网站| 91日韩久久| 色综合狠狠操| 人妻熟女一二三区夜夜爱| 国产成人午夜精品5599| 国产成人一区二区在线观看| av成人综合| 成人在线小视频| 综合综合综合综合综合网| 狠狠干视频网站| 秋霞国产午夜精品免费视频| 亚洲の无码国产の无码步美| 亚洲天堂av老司机| 成年人视频免费| 亚洲精品国偷自产在线99热| 性xxxfreexxxx性欧美| 国产精品福利无圣光在线一区| 乱中年女人伦av一区二区| 黄色影视在线观看| 久久精品av麻豆的观看方式| 成人免费看aa片| 婷婷中文字幕综合| 国产综合无码一区二区色蜜蜜| 久久夜色精品国产亚洲aⅴ| 日韩黄色在线| 亚洲资源在线网| 美美哒免费高清在线观看视频一区二区| 国产精品揄拍100视频| 天天av天天翘天天综合网| 人人妻人人澡人人爽久久av | 欧美久久久影院| 888av在线| 国产美女久久精品香蕉69| 日本不卡电影| 一级黄色香蕉视频| 久久久久九九视频| 少妇太紧太爽又黄又硬又爽| 亚洲激情在线视频| 欧美aa一级| 欧美成人在线免费观看| 国产欧美日韩综合一区在线播放| 天天躁日日躁狠狠躁av麻豆男男| 亚洲一区二区在线免费观看视频| www.成人免费视频| 欧美日韩高清在线观看| 日韩免费一级| 精品国产av无码一区二区三区| 成人在线视频首页| 日韩精品在线免费看| 亚洲精品第一页| 性欧美又大又长又硬| 欧美一级日本a级v片| 日韩激情av在线| 亚洲少妇xxx| 欧美一区二区三区免费在线看 | 97激碰免费视频| 小嫩嫩12欧美| 91国产精品视频在线观看| 国产精品家庭影院| 99精品国产99久久久久久97| 九九九久久国产免费| 国产精品zjzjzj在线观看| 国产日韩一区二区在线| 国产女同性恋一区二区| 国产女人18毛片水真多| 久久久久久久网站| 亚洲欧洲免费| 三区视频在线观看| 亚洲观看高清完整版在线观看| 性插视频在线观看| 国产精品久久久久久久一区探花| 99欧美视频| 亚州av综合色区无码一区| 日本韩国欧美一区二区三区| 亚洲成人影院麻豆| 国产传媒一区二区| 日韩中文字幕不卡| 欧美性猛交xxxxx少妇| 日韩高清a**址| 国产精品黄色片| 久久这里只有精品8| 久久久久久久久一| 国产丝袜在线视频| 日韩免费观看网站| 亚洲精品国产成人影院| 亚洲精品乱码久久久久久不卡| 欧美性生活一区| 成人影音在线| 亚洲国产欧美一区二区三区不卡| 国产xxx精品视频大全| 青青视频在线免费观看| 欧美人在线视频| 欧美另类69xxxxx| 动漫美女无遮挡免费|