Bun 的 bundler API 主要受到 esbuild 的啟發。從 esbuild 遷移到 Bun 的 bundler 應該相對容易。本指南將簡要說明您可能考慮遷移到 Bun 的 bundler 的原因,並提供一個並排的 API 比較參考,供已熟悉 esbuild 的 API 的人使用。
有一些行為差異需要注意。
- 預設打包。與 esbuild 不同,Bun 預設總是打包。這就是為什麼在 Bun 範例中不需要
--bundle
旗標。若要個別轉譯每個檔案,請使用Bun.Transpiler
。 - 它只是一個 bundler。與 esbuild 不同,Bun 的 bundler 不包含內建的開發伺服器或檔案監控器。它只是一個 bundler。bundler 旨在與
Bun.serve
和其他執行時期 API 結合使用,以達到相同的效果。因此,所有與 HTTP/檔案監控相關的選項都不適用。
效能
Bun 的 bundler 結合了效能導向的 API,以及高度最佳化的基於 Zig 的 JS/TS 解析器,在 esbuild 的 three.js 基準測試 中,比 esbuild 快 1.75 倍。

CLI API
Bun 和 esbuild 都提供命令列介面。
esbuild <entrypoint> --outdir=out --bundle
bun build <entrypoint> --outdir=out
在 Bun 的 CLI 中,像 --minify
這樣的簡單布林旗標不接受參數。像 --outdir <path>
這樣的其他旗標接受參數;這些旗標可以寫成 --outdir out
或 --outdir=out
。某些旗標,例如 --define
,可以指定多次:--define foo=bar --define bar=baz
。
esbuild | bun build | |
---|---|---|
--bundle | n/a | Bun 總是會打包,使用 --no-bundle 來停用此行為。 |
|
| 語法差異小;沒有冒號。
|
|
| 語法差異小;沒有冒號。
|
--format | --format | Bun 目前僅支援 "esm" ,但已規劃其他模組格式。esbuild 預設為 "iife" 。 |
|
| Bun 支援與 esbuild 不同的內建載入器組;請參閱 Bundler > Loaders 以取得完整參考。esbuild 載入器
|
--minify | --minify | 沒有差異 |
--outdir | --outdir | 沒有差異 |
--outfile | --outfile | |
--packages | n/a | 不支援 |
--platform | --target | 為了一致性,重新命名為 --target ,與 tsconfig 一致。不支援 neutral 。 |
--serve | n/a | 不適用 |
--sourcemap | --sourcemap | 沒有差異 |
--splitting | --splitting | 沒有差異 |
--target | n/a | 不支援。Bun 的打包器目前不執行語法降級。 |
--watch | --watch | 沒有差異 |
--allow-overwrite | n/a | 永遠不允許覆寫 |
--analyze | n/a | 不支援 |
--asset-names | --asset-naming | 為了一致性,重新命名為 JS API 中的 naming |
--banner | n/a | 不支援 |
--certfile | n/a | 不適用 |
--charset=utf8 | n/a | 不支援 |
--chunk-names | --chunk-naming | 為了一致性,重新命名為 JS API 中的 naming |
--color | n/a | 總是啟用 |
--drop | n/a | 不支援 |
--entry-names | --entry-naming | 為了一致性,重新命名為 JS API 中的 naming |
--footer | n/a | 不支援 |
--global-name | n/a | 不適用,Bun 目前不支援 iife 輸出 |
--ignore-annotations | n/a | 不支援 |
--inject | n/a | 不支援 |
--jsx | --jsx-runtime <runtime> | 支援 "automatic" (使用 jsx 轉換)和 "classic" (使用 React.createElement ) |
--jsx-dev | n/a | Bun 從 tsconfig.json 讀取 compilerOptions.jsx 以確定預設值。如果 compilerOptions.jsx 是 "react-jsx" ,或如果 NODE_ENV=production ,Bun 將使用 jsx 轉換。否則,它會使用 jsxDEV 。對於任何 Bun 都使用 jsxDEV 。打包器不支援 preserve 。 |
--jsx-factory | --jsx-factory | |
--jsx-fragment | --jsx-fragment | |
--jsx-import-source | --jsx-import-source | |
--jsx-side-effects | n/a | JSX 始終假設沒有副作用 |
--keep-names | n/a | 不支援 |
--keyfile | n/a | 不適用 |
--legal-comments | n/a | 不支援 |
--log-level | n/a | 不支援。這可以在 bunfig.toml 中設定為 logLevel 。 |
--log-limit | n/a | 不支援 |
--log-override:X=Y | n/a | 不支援 |
--main-fields | n/a | 不支援 |
--mangle-cache | n/a | 不支援 |
--mangle-props | n/a | 不支援 |
--mangle-quoted | n/a | 不支援 |
--metafile | n/a | 不支援 |
--minify-whitespace | --minify-whitespace | |
--minify-identifiers | --minify-identifiers | |
--minify-syntax | --minify-syntax | |
--out-extension | n/a | 不支援 |
--outbase | --root | |
--preserve-symlinks | n/a | 不支援 |
--public-path | --public-path | |
--pure | n/a | 不支援 |
--reserve-props | n/a | 不支援 |
--resolve-extensions | n/a | 不支援 |
--servedir | n/a | 不適用 |
--source-root | n/a | 不支援 |
--sourcefile | n/a | 不支援。Bun 尚未支援 stdin 輸入。 |
--sourcemap | --sourcemap | 沒有差異 |
--sources-content | n/a | 不支援 |
--supported | n/a | 不支援 |
--tree-shaking | n/a | 永遠為 true |
--tsconfig | --tsconfig-override | |
--version | n/a | 執行 bun --version 以查看 Bun 的版本。 |
JavaScript API
esbuild.build() | Bun.build() | |
---|---|---|
absWorkingDir | n/a | 永遠設定為 process.cwd() |
alias | n/a | 不支援 |
allowOverwrite | n/a | 永遠為 false |
|
| 使用與 esbuild 相同的範本語法,但必須明確包含
|
banner | n/a | 不支援 |
bundle | n/a | 永遠為 true 。使用 Bun.Transpiler 在不打包的情況下轉譯。 |
charset | n/a | 不支援 |
|
| 使用與 esbuild 相同的範本語法,但必須明確包含
|
color | n/a | Bun 在建置結果的 logs 屬性中回傳記錄。 |
conditions | n/a | 不支援。匯出條件優先順序由 target 決定。 |
define | define | |
drop | n/a | 不支援 |
|
| Bun 支援一個
|
entryPoints | entrypoints | 大小寫差異 |
external | external | 沒有差異 |
footer | n/a | 不支援 |
format | format | 目前僅支援 "esm" 。已規劃支援 "cjs" 和 "iife" 。 |
globalName | n/a | 不支援 |
ignoreAnnotations | n/a | 不支援 |
inject | n/a | 不支援 |
jsx | jsx | JS API 中不支援,請在 tsconfig.json 中設定 |
jsxDev | jsxDev | JS API 中不支援,請在 tsconfig.json 中設定 |
jsxFactory | jsxFactory | JS API 中不支援,請在 tsconfig.json 中設定 |
jsxFragment | jsxFragment | JS API 中不支援,請在 tsconfig.json 中設定 |
jsxImportSource | jsxImportSource | JS API 中不支援,請在 tsconfig.json 中設定 |
jsxSideEffects | jsxSideEffects | JS API 中不支援,請在 tsconfig.json 中設定 |
keepNames | n/a | 不支援 |
legalComments | n/a | 不支援 |
loader | loader | Bun 支援與 esbuild 不同的內建載入器組;請參閱 Bundler > Loaders 以取得完整參考。esbuild 載入器 dataurl 、binary 、base64 、copy 和 empty 尚未實作。 |
logLevel | n/a | 不支援 |
logLimit | n/a | 不支援 |
logOverride | n/a | 不支援 |
mainFields | n/a | 不支援 |
mangleCache | n/a | 不支援 |
mangleProps | n/a | 不支援 |
mangleQuoted | n/a | 不支援 |
metafile | n/a | 不支援 |
|
| 在 Bun 中,
|
minifyIdentifiers | minify.identifiers | 請參閱 minify |
minifySyntax | minify.syntax | 請參閱 minify |
minifyWhitespace | minify.whitespace | 請參閱 minify |
nodePaths | n/a | 不支援 |
outExtension | n/a | 不支援 |
outbase | root | 名稱不同 |
outdir | outdir | 沒有差異 |
outfile | outfile | 沒有差異 |
packages | n/a | 不支援,請使用 external |
platform | target | 支援 "bun" 、"node" 和 "browser" (預設)。不支援 "neutral" 。 |
plugins | plugins | Bun 的外掛 API 是 esbuild 的子集。有些 esbuild 外掛可以使用在 Bun 中。 |
preserveSymlinks | n/a | 不支援 |
publicPath | publicPath | 沒有差異 |
pure | n/a | 不支援 |
reserveProps | n/a | 不支援 |
resolveExtensions | n/a | 不支援 |
sourceRoot | n/a | 不支援 |
sourcemap | sourcemap | 支援 "inline" 、"external" 和 "none" |
sourcesContent | n/a | 不支援 |
splitting | splitting | 沒有差異 |
stdin | n/a | 不支援 |
supported | n/a | 不支援 |
target | n/a | 不支援語法降級 |
treeShaking | n/a | 永遠為 true |
tsconfig | n/a | 不支援 |
write | n/a | 如果設定了 outdir /outfile ,則設定為 true ,否則為 false |
外掛 API
Bun 的外掛 API 設計為與 esbuild 相容。Bun 不支援 esbuild 的所有外掛 API,但已實作核心功能。許多第三方 esbuild
外掛可以使用在 Bun 中。
長期而言,我們目標是與 esbuild 的 API 達到功能相等,因此如果有些功能無法使用,請提交問題以協助我們優先處理。
Bun 和 esbuild 中的外掛是使用 builder
物件定義的。
import type { BunPlugin } from "bun";
const myPlugin: BunPlugin = {
name: "my-plugin",
setup(builder) {
// define plugin
},
};
builder
物件提供了一些方法,用於連接到打包程式的部分。Bun 實作了 onResolve
和 onLoad
;尚未實作 esbuild 的 onStart
、onEnd
和 onDispose
鉤子,以及 resolve
工具程式。initialOptions
已部分實作,為唯讀且僅包含 esbuild 選項的子集;請改用 config
(與 Bun 的 BuildConfig
格式相同)。
import type { BunPlugin } from "bun";
const myPlugin: BunPlugin = {
name: "my-plugin",
setup(builder) {
builder.onResolve(
{
/* onResolve.options */
},
args => {
return {
/* onResolve.results */
};
},
);
builder.onLoad(
{
/* onLoad.options */
},
args => {
return {
/* onLoad.results */
};
},
);
},
};
onResolve
選項
🟢 | 篩選器 |
---|---|
🟢 | 命名空間 |
參數
🟢 | 路徑 |
---|---|
🟢 | 匯入程式 |
🔴 | 命名空間 |
🔴 | 解析目錄 |
🔴 | 類型 |
🔴 | 外掛程式資料 |
結果
🟢 | 命名空間 |
---|---|
🟢 | 路徑 |
🔴 | 錯誤 |
🔴 | external |
🔴 | 外掛程式資料 |
🔴 | 外掛程式名稱 |
🔴 | 副作用 |
🔴 | 字尾 |
🔴 | 警告 |
🔴 | 監控目錄 |
🔴 | 監控檔案 |
onLoad
選項
🟢 | 篩選器 |
🟢 | 命名空間 |
參數
🟢 | 路徑 |
🔴 | 命名空間 |
🔴 | 字尾 |
🔴 | 外掛程式資料 |
結果
🟢 | 內容 |
🟢 | loader |
🔴 | 錯誤 |
🔴 | 外掛程式資料 |
🔴 | 外掛程式名稱 |
🔴 | 解析目錄 |
🔴 | 警告 |
🔴 | 監控目錄 |
🔴 | 監控檔案 |