vite-esbuild

這篇文章對 esbuild 在 vite 中的應(yīng)用做一個總結(jié)

vite 中 esbuild 的應(yīng)用

esbuild 是 vite 性能快的關(guān)鍵汰聋。esbuild 在 vite 中主要被使用在以下場景:

  1. 通過入口分析依賴樹,收集 node_modules 中的依賴庐船,提前打包處理歇万,并在磁盤持久化緩存處理過后的文件。
  2. 對部分業(yè)務(wù)文件 使用 esbuild 處理轉(zhuǎn)化闸溃,比如 ts整吆、jsx、tsx辉川。注意 js 類型文件并不會被處理

node_modules 處理

需要處理 node_modules 的原因:

  1. 第三方庫代碼不會經(jīng)常變動表蝙,緩存處理,提高響應(yīng)速度乓旗。
  2. 打包第三方庫府蛇,使 lodash 這種文件較多的庫,減少網(wǎng)絡(luò)請求寸齐。
  3. 代碼兼容處理:比如有的依賴代碼模塊格式并不是 esm 而是 commonjs欲诺,利用 esbuild 進行模塊格式轉(zhuǎn)換。

難點一:vite 如何從 index.html 入口分析依賴的組成渺鹦?他怎么知道需要處理哪些包?

  1. esbuild 天生支持 index.html 作為入口打包

require('esbuild').buildSync({
  entryPoints: ['index.html'], // is ok
  bundle: true,
  write: true,
  outdir: 'out',
})


if (resolved.includes('node_modules') || include?.includes(id)) {
    if (OPTIMIZABLE_ENTRY_RE.test(resolved)) {
        // esbuild 插件中直接判斷引入的包是否是 node_modules 中的依賴
        depImports[id] = resolved
    }
}


難點二:esbuild 如何處理 vue 等非 javascript 文件蛹含,并無官方 vue-loader

const regex = isHtml ? scriptModuleRE : scriptRE

const scriptModuleRE =
    /(<script\b[^>]*type\s*=\s*(?:"module"|'module')[^>]*>)(.*?)<\/script>/gims
export const scriptRE = /(<script\b(?:\s[^>]*>|>))(.*?)<\/script>/gims


vite 內(nèi)部通過編寫一個簡單的 esbuild 插件毅厚,直接利用正則表達式將 script 標簽內(nèi)部內(nèi)容截取出來,作為 vue 文件的內(nèi)容浦箱。這樣 esbuild 就可以將 vue 文件當成 js 文件處理依賴樹了吸耿。

編譯業(yè)務(wù)文件

當用戶第一次請求業(yè)務(wù)文件的時候,瀏覽器以及 vite 應(yīng)用內(nèi)部均沒有緩存酷窥,這個時候就要倚靠 esbuild 對部分業(yè)務(wù)文件進行編譯咽安。

esbuild 默認會編譯 ts、tsx蓬推、jsx 文件妆棒。

其中 js 文件默認不會被編譯。所以當選擇一些新語法開發(fā)時沸伏,要慎重

語法兼容問題

瀏覽器兼容

就像剛才說的問題糕珊,普通的 js 文件以及 vue 文件中的 js script 內(nèi)容,是不會被 esbuild 處理編譯的毅糟,所以不穩(wěn)定的新語法是不能在 vite 環(huán)境下使用的红选。

esbuild 兼容

esbuild 作為新起的打包工具,他對部分語法是不支持的姆另,比如 js 文件中使用裝飾器喇肋。這個場景 esbuild 就是不兼容的坟乾。

所以語法兼容問題要考慮兩個問題:

  1. 你開發(fā)時用的瀏覽器最好是比較新的 chrome 或者火狐瀏覽器,因為 vite 并不會默認編譯 js 文件蝶防,如果有兼容問題糊渊,處理起來比較復(fù)雜。
  2. 代碼兼容也要考慮 esbuild 的語法支持程度慧脱。如果有 esbuild 不支持的語法渺绒,在 vite 提前打包 node_modules 文件時會直接報錯。(vite 會在啟動服務(wù)的時候菱鸥,默認從入口查找所有需要打包的 node_modules 文件宗兼,如果你的業(yè)務(wù)代碼有兼容問題,會導(dǎo)致 esbuild 分析文件直接報錯氮采。)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末殷绍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鹊漠,更是在濱河造成了極大的恐慌主到,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躯概,死亡現(xiàn)場離奇詭異登钥,居然都是意外死亡,警方通過查閱死者的電腦和手機娶靡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門牧牢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人姿锭,你說我怎么就攤上這事塔鳍。” “怎么了呻此?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵轮纫,是天一觀的道長。 經(jīng)常有香客問我焚鲜,道長掌唾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任恃泪,我火速辦了婚禮郑兴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贝乎。我一直安慰自己情连,他們只是感情好,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布览效。 她就那樣靜靜地躺著却舀,像睡著了一般虫几。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挽拔,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天辆脸,我揣著相機與錄音,去河邊找鬼螃诅。 笑死啡氢,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的术裸。 我是一名探鬼主播倘是,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼袭艺!你這毒婦竟也來了搀崭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤猾编,失蹤者是張志新(化名)和其女友劉穎瘤睹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體答倡,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡轰传,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了苇羡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绸吸。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖设江,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情攘轩,我是刑警寧澤叉存,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站度帮,受9級特大地震影響歼捏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笨篷,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一瞳秽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧率翅,春花似錦练俐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽燕锥。三九已至,卻和暖如春悯蝉,著一層夾襖步出監(jiān)牢的瞬間归形,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工鼻由, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留暇榴,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓蕉世,卻偏偏與公主長得像蔼紧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子讨彼,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容