国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

「 不懂就問 」Esbuild 為什么這么快?

開發(fā) 開發(fā)工具
每次運行打包器時,JavaScript VM 都會在沒有任何優(yōu)化提示的情況下看到打包程序的代碼。在 esbuild 忙于解析 JavaScript 時,node 忙于解析打包程序的JavaScript。

[[402061]]

前言

esbuild 是新一代的 JavaScript 打包工具。

他的作者是 Figma 的 CTO - Evan Wallace。

[[402062]]

( 這卡姿蘭大眼睛,令人唏噓的發(fā)際線, 一看就知道很強!)

esbuild以速度快而著稱,耗時只有 webpack 的 2% ~3%。

esbuild 項目主要目標(biāo)是: 開辟一個構(gòu)建工具性能的新時代,創(chuàng)建一個易用的現(xiàn)代打包器。

它的主要功能:

  • Extreme speed without needing a cache
  • ES6 and CommonJS modules
  • Tree shaking of ES6 modules
  • An API for JavaScript and Go
  • TypeScript and JSX syntax
  • Source maps
  • Minification
  • Plugins

現(xiàn)在很多工具都內(nèi)置了它,比如我們熟知的:

  • vite,
  • snowpack

借助 esbuild 優(yōu)異的性能, vite 更是如虎添翼, 快到飛起。

今天我們就來探索一下: 為什么 esbuild 這么快?

下文的主要內(nèi)容:

  • 幾組性能數(shù)據(jù)對比
  • 為什么 esbuild 這么快
  • esbuild upcoming roadmap
  • esbuild 在 vite 中的運用
  • 為什么生產(chǎn)環(huán)境仍需打包?
  • 為何vite不用 esbuild 打包?
  • 總結(jié)

正文

先看一組對比:

使用 10 份 threeJS 的生產(chǎn)包,對比不同打包工具在默認配置下的打包速度。

webpack5 墊底, 耗時 55.25秒。

esbuild 僅耗時 0.37 秒。

差異巨大。

還有更多對比:

https://twitter.com/evanwallace/status/1314121407903617025

webpack5 表示很受傷: 我還比不過 webpack 4 ?

...

為什么 esbuild 這么快 ?

有以下幾個原因。

(為了保證內(nèi)容的準(zhǔn)確性, 以下內(nèi)容翻譯自 esbuild 官網(wǎng)。)

1. 它是用 Go 語言編寫的,并可以編譯為本地代碼。

大多數(shù)打包器都是用 JavaScript 編寫的,但是對于 JIT 編譯的語言來說,命令行應(yīng)用程序擁有最差的性能表現(xiàn)。

每次運行打包器時,JavaScript VM 都會在沒有任何優(yōu)化提示的情況下看到打包程序的代碼。

在 esbuild 忙于解析 JavaScript 時,node 忙于解析打包程序的JavaScript。

到節(jié)點完成解析打包程序代碼的時間時,esbuild可能已經(jīng)退出,您的打包程序甚至還沒有開始打包。

另外,Go 是為并行性而設(shè)計的,而 JavaScript 不是。

Go在線程之間共享內(nèi)存,而JavaScript必須在線程之間序列化數(shù)據(jù)。

Go 和 JavaScript都有并行的垃圾收集器,但是Go的堆在所有線程之間共享,而對于JavaScript, 每個JavaScript線程中都有一個單獨的堆。

根據(jù)測試,這似乎將 JavaScript worker 線程的并行能力減少了一半,大概是因為一半CPU核心正忙于為另一半收集垃圾。

2. 大量使用了并行操作。

esbuild 中的算法經(jīng)過精心設(shè)計,可以充分利用CPU資源。

大致分為三個階段:

  • 解析
  • 鏈接
  • 代碼生成

解析和代碼生成是大部分工作,并且可以完全并行化(鏈接在大多數(shù)情況下是固有的串行任務(wù))。

由于所有線程共享內(nèi)存,因此當(dāng)捆綁導(dǎo)入同一JavaScript庫的不同入口點時,可以輕松地共享工作。

大多數(shù)現(xiàn)代計算機具有多內(nèi)核,因此并行性是一個巨大的勝利。

3. 代碼都是自己寫的, 沒有使用第三方依賴。

自己編寫所有內(nèi)容, 而不是使用第三方庫,可以帶來很多性能優(yōu)勢。

可以從一開始就牢記性能,可以確保所有內(nèi)容都使用一致的數(shù)據(jù)結(jié)構(gòu)來避免昂貴的轉(zhuǎn)換,并且可以在必要時進行廣泛的體系結(jié)構(gòu)更改。缺點當(dāng)然是多了很多工作。

例如,許多捆綁程序都使用官方的TypeScript編譯器作為解析器。

但是,它是為實現(xiàn)TypeScript編譯器團隊的目標(biāo)而構(gòu)建的,它們沒有將性能作為頭等大事。

4. 內(nèi)存的高效利用。

理想情況下, 根據(jù)數(shù)據(jù)數(shù)據(jù)的長度, 編譯器的復(fù)雜度為O(n).

如果要處理大量數(shù)據(jù),內(nèi)存訪問速度可能會嚴重影響性能。

對數(shù)據(jù)進行的遍歷次數(shù)越少(將數(shù)據(jù)轉(zhuǎn)換成數(shù)據(jù)所需的不同表示形式也就越少),編譯器就會越快。

例如,esbuild 僅觸及整個JavaScript AST 3次:

  1. 進行詞法分析,解析,作用域設(shè)置和聲明符號的過程
  2. 綁定符號,最小化語法。比如:將 JSX / TS轉(zhuǎn)換為 JS, ES Next 轉(zhuǎn)換為 es5。
  3. 最小標(biāo)識符,最小空格,生成代碼。

當(dāng) AST 數(shù)據(jù)在CPU緩存中仍然處于活躍狀態(tài)時,會最大化AST數(shù)據(jù)的重用。

其他打包器在單獨的過程中執(zhí)行這些步驟,而不是將它們交織在一起。

它們也可以在數(shù)據(jù)表示之間進行轉(zhuǎn)換,將多個庫組織在一起(例如:字符串→TS→JS→字符串,然后字符串→JS→舊的JS→字符串,然后字符串→JS→minified JS→字符串)。

這樣會占用更多內(nèi)存,并且會減慢速度。

Go的另一個好處是它可以將內(nèi)容緊湊地存儲在內(nèi)存中,從而使它可以使用更少的內(nèi)存并在CPU緩存中容納更多內(nèi)容。

所有對象字段的類型和字段都緊密地包裝在一起,例如幾個布爾標(biāo)志每個僅占用一個字節(jié)。

Go 還具有值語義,可以將一個對象直接嵌入到另一個對象中,因此它是'免費的',無需另外分配。

JavaScript不具有這些功能,還具有其他缺點,例如 JIT 開銷(例如隱藏的類插槽)和低效的表示形式(例如,非整數(shù)與指針堆分配)。

以上的每一條因素, 都能在一定程度上提高編譯速度。

當(dāng)它們共同工作時,效果比當(dāng)今通常使用的其他打包器快幾個數(shù)量級。

以上內(nèi)容比較繁瑣,對此,也有一些網(wǎng)友做了簡要的總結(jié):

  • 它是用 Go 語言編寫的,該語言可以編譯為本地代碼。而且 Go 的執(zhí)行速度很快。一般來說,JS 的操作是毫秒級,而 Go 則是納秒級。
  • 解析,生成最終打包文件和生成 source maps 的操作全部完全并行化
  • 無需昂貴的數(shù)據(jù)轉(zhuǎn)換,只需很少的幾步即可完成所有操作
  • 該庫以提高編譯速度為編寫代碼時的第一原則,并盡量避免不必要的內(nèi)存分配。

僅作參考。

Upcoming roadmap

以下這幾個 feature 已經(jīng)在進行中了, 而且是第一優(yōu)先級:

  1. Code splitting (#16, docs)
  2. CSS content type (#20, docs)
  3. Plugin API (#111)

下面這幾個 fearure 比較有潛力, 但是還不確定:

  1. HTML content type (#31)
  2. Lowering to ES5 (#297)
  3. Bundling top-level await (#253)

感興趣的可以保持關(guān)注。

esbuild 在 vite 中的運用

vite 中大量使用了 esbuild, 這里簡單分享兩點。

optimizer

https://github.com/vitejs/vite/blob/main/packages/vite/src/node/optimizer/index.ts#L262

  1. import { build, BuildOptions as EsbuildBuildOptions } from 'esbuild' 
  2.  
  3. // ... 
  4. const result = await build({ 
  5.     entryPoints: Object.keys(flatIdDeps), 
  6.     bundle: true
  7.     format: 'esm'
  8.     external: config.optimizeDeps?.exclude, 
  9.     logLevel: 'error'
  10.     splitting: true
  11.     sourcemap: true
  12.     outdir: cacheDir, 
  13.     treeShaking: 'ignore-annotations'
  14.     metafile: true
  15.     define, 
  16.     plugins: [ 
  17.       ...plugins, 
  18.       esbuildDepPlugin(flatIdDeps, flatIdToExports, config) 
  19.     ], 
  20.     ...esbuildOptions 
  21.   }) 
  22.  
  23.   const meta = result.metafile! 
  24.  
  25.   // the paths in `meta.outputs` are relative to `process.cwd()` 
  26.   const cacheDirOutputPath = path.relative(process.cwd(), cacheDir) 
  27.  
  28.   for (const id in deps) { 
  29.     const entry = deps[id] 
  30.     data.optimized[id] = { 
  31.       file: normalizePath(path.resolve(cacheDir, flattenId(id) + '.js')), 
  32.       src: entry, 
  33.       needsInterop: needsInterop( 
  34.         id, 
  35.         idToExports[id], 
  36.         meta.outputs, 
  37.         cacheDirOutputPath 
  38.       ) 
  39.     } 
  40.   } 
  41.  
  42.   writeFile(dataPath, JSON.stringify(data, null, 2)) 

處理 .ts 文件

https://github.com/vitejs/vite/commit/59035546db7ff4b7020242ba994a5395aac92802

為什么生產(chǎn)環(huán)境仍需打包?

盡管原生 ESM 現(xiàn)在得到了廣泛支持,但由于嵌套導(dǎo)入會導(dǎo)致額外的網(wǎng)絡(luò)往返,在生產(chǎn)環(huán)境中發(fā)布未打包的 ESM 仍然效率低下(即使使用 HTTP/2)。

為了在生產(chǎn)環(huán)境中獲得最佳的加載性能,最好還是將代碼進行 tree-shaking、懶加載和 chunk 分割(以獲得更好的緩存)。

要確保開發(fā)服務(wù)器和產(chǎn)品構(gòu)建之間的最佳輸出和行為達到一致,并不容易。

為解決這個問題,Vite 附帶了一套 構(gòu)建優(yōu)化 的 構(gòu)建命令,開箱即用。

為何 vite 不用 esbuild 打包?

雖然 esbuild 快得驚人,并且已經(jīng)是一個在構(gòu)建庫方面比較出色的工具,但一些針對構(gòu)建應(yīng)用的重要功能仍然還在持續(xù)開發(fā)中 —— 特別是代碼分割和 CSS處理方面。

就目前來說,Rollup 在應(yīng)用打包方面, 更加成熟和靈活。

盡管如此,當(dāng)未來這些功能穩(wěn)定后,也不排除使用 esbuild 作為生產(chǎn)構(gòu)建器的可能。

總結(jié)

esbuild 為構(gòu)建提效帶來了曙光, 而且 esm 的數(shù)量也在快速增加:

https://twitter.com/skypackjs/status/1113838647487287296

 

希望 esm 生態(tài)盡快完善起來, 造福前端。

本文轉(zhuǎn)載自微信公眾號「前端皮小蛋」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系前端皮小蛋公眾號。

 

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

2021-05-29 06:23:47

webpack esbuild

2021-06-09 09:32:58

Esbuild 工具前端

2020-02-27 15:44:41

Nginx服務(wù)器反向代理

2024-02-26 21:15:20

Kafka緩存參數(shù)

2020-02-27 21:03:30

調(diào)度器架構(gòu)效率

2020-03-30 15:05:46

Kafka消息數(shù)據(jù)

2020-10-15 09:19:36

Elasticsear查詢速度

2023-08-29 07:46:08

Redis數(shù)據(jù)ReHash

2025-12-03 06:50:00

2025-11-28 01:15:00

KafkaJVM高性能

2023-03-21 08:02:36

Redis6.0IO多線程

2017-06-06 16:30:55

戴爾交付保障

2020-10-21 09:17:52

Redis面試內(nèi)存

2024-11-26 08:52:34

SQL優(yōu)化Kafka

2021-03-18 14:34:34

達達集團京東云電商

2020-04-27 07:13:37

Nginx底層進程

2024-07-24 08:38:07

2023-11-02 10:22:29

gRPC后端通信

2022-01-04 08:54:32

Redis數(shù)據(jù)庫數(shù)據(jù)類型

2013-06-14 10:12:22

共享并行
點贊
收藏

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

国产精品人人做人人爽| 成人激情在线观看| 午夜成年人在线免费视频| 欧美日韩一区视频| 免费不卡视频| 亚洲第一视频在线观看| 99精品国自产在线| 午夜欧美大片免费观看| 欧美午夜精彩| 精品国产aⅴ麻豆| 玖玖国产精品视频| 日韩小视频网站| 亚洲天堂a在线| 国产在线一在线二| 精品亚洲国产视频| 卡一精品卡二卡三网站乱码| 成人av片网址| 国产精品一区三区| 国产精品三级a三级三级午夜 | 3d成人h动漫网站入口| caoporn视频在线| 久久久久久久久久久免费精品| 久久久久久久久99精品大| 手机成人av在线| 亚洲女人****多毛耸耸8| 免费大片在线观看www| zzjj国产精品一区二区| 精品一区二区三区在线| 亚洲一区二区三区欧美| 亚洲精品国产一区二区三区四区在线 | 免费看电影在线| 超碰91人人草人人干| 久久久久久美女精品 | 国产一区不卡在线| 国产网站免费观看| 精品sm捆绑视频| 九九免费精品视频在线观看| 亚洲精品成人三区| 一区二区三区免费看视频| freexxx性亚洲精品| 国产成人aa精品一区在线播放| 一本色道久久| 激情深爱一区二区| 在线观看中文字幕| yellow在线观看网址| 欧美大片在线看| 99国产成+人+综合+亚洲欧美| 无码人妻丰满熟妇区五十路百度| 欧美精品久久99| 日韩精选在线| 波多野结衣 作品| 欧美性高潮床叫视频 | 一本一道久久a久久精品逆3p| 99久久婷婷| 777米奇影视第四色| 欧美一区二区不卡视频| 国产剧情在线观看一区| 精品丰满人妻无套内射| 91精品国产综合久久国产大片 | 999视频在线免费观看| 久久精品在线免费观看| 91超碰在线免费| 亚洲bt天天射| 国产精品久久久久久久久免费相片 | 国产 高清 精品 在线 a| 国产色91在线| 国产理论在线| 久中文字幕一区| 亚洲成精国产精品女| 99re8这里有精品热视频8在线| 亚洲美女搞黄| 91麻豆精品91久久久久同性| 国产精品久久久乱弄| 无人在线观看的免费高清视频 | 国产精品porn| 传媒在线观看| 8x拔播拔播x8国产精品 | 成人蜜桃视频网站网址| 色婷婷成人综合| 国产在线播放一区三区四| 免费av在线网址| 国产精品久久波多野结衣| 午夜精品久久久久久不卡8050| 亚洲福利天堂| 黄色激情网站| 日本免费久久高清视频| 国产精品伦理一区二区| jizz性欧美2| 黄色免费网址大全| 色综合久久悠悠| 欧美国产精品中文字幕| 欧美黄视频在线观看| 超碰成人免费在线| 中文字幕亚洲第一| 99精品在线免费| 成人日韩视频| 小泽玛利亚视频在线观看| 午夜精品一区二区三区在线播放| 国产日韩成人精品| 蜜桃视频欧美| 一区二区三区四区在线免费视频| 成人综合国产精品| 在线看日本不卡| 99在线观看免费视频精品观看| 麻豆传媒在线完整视频| 日韩精品另类天天更新| 亚洲精品国产欧美| www.欧美日韩| 欧美专区视频| 写真片福利在线播放| 国产原创欧美精品| 欧美日韩国产在线观看| 蜜臀久久99精品久久久久宅男| 性欧美18xxxhd| 成人在线观看a| 国产精品情侣自拍| 91精品久久久久久久91蜜桃| 麻豆91在线观看| 精品欧美一区二区三区在线观看| heyzo国产| 日本亚洲精品在线观看| 欧美日韩一区久久| 国产乱对白刺激视频不卡| 久久9999免费视频| 午夜视频在线免费| 日韩精品福利视频| 精品国产欧美一区二区五十路 | 在线看中文字幕| 国产99视频精品免费视频36| 日韩欧美卡一卡二| a级高清视频欧美日韩| 亚洲精品小区久久久久久| 国产片在线观看| 男人的天堂视频在线| 国模吧一区二区三区| 欧美在线播放高清精品| 国产一区二三区| 久久porn| 欧美日韩色综合| 欧美激情三级免费| 成人性生交大片免费网站 | 欧美.www| 青青草国产精品亚洲专区无| 国产 欧美在线| 成人av手机在线观看| 国产一区二区成人久久免费影院 | 欧美日韩一区小说| 亚洲欧美制服丝袜| 欧美男男青年gay1069videost | 欧美激情第三页| 欧美午夜宅男影院在线观看| 日韩理论片网站| 麻豆成人在线| 国产传媒在线| 成人亚洲精品| 中文字幕色婷婷在线视频| 国产二区视频在线观看| 99只有精品| 91首页免费视频| 亚洲视频一二区| 精品av久久707| 欧美日韩精品三区| 制服丝袜亚洲播放| 日韩精品在线视频| 欧美精品18videos性欧| 日韩偷拍一区二区| 国产高清av在线播放| 50度灰在线观看| 三级三级久久三级久久18| 国产精品黄视频| 国产美女精品在线观看| 成人软件网18免费视频| av在线中出| 亚洲欧美网站| 9191成人精品久久| 国产91精品在线播放| 亚洲an天堂an在线观看| 欧美日韩一区二区高清| 精品精品欲导航| 2022亚洲天堂| 51精品在线| 日韩欧美一区二区三区在线视频 | 国产精品久久久久久亚洲影视| 亚洲精品天堂成人片av在线播放| 国产手机免费视频| 天堂√在线观看一区二区 | www国产精品com| 日韩免费观看视频| 免费亚色电影在线观看| 欧美日韩夜夜| 国产**成人网毛片九色| 日韩va亚洲va欧洲va国产| 800av在线免费观看| 精品资源在线| 亚洲视频在线观看三级| 久久久亚洲精品视频| 99在线观看视频免费| 91亚洲无吗| 欧美美女一区二区三区| 日韩av电影在线观看|