Skip to content

Bun のバンドラー API は、esbuild から大きくインスピレーションを受けています。esbuild から Bun のバンドラーへの移行は比較的簡単です。このガイドでは、なぜ Bun のバンドラーへの移行を検討するべきなのかを説明し、esbuild の API に慣れている人のために API の並列比較リファレンスを提供します。

いくつかの動作の違いに注意してください。

NOTE

**デフォルトでバンドル。** esbuild とは異なり、Bun は常にデフォルトでバンドルします。これが、Bun の例で `--bundle` フラグが不要な理由です。各ファイルを個別にトランスパイルするには、`Bun.Transpiler` を使用します。

NOTE

**バンドラーのみ。** esbuild とは異なり、Bun のバンドラーには組み込みの開発サーバーやファイルウォッチャーは含まれていません。 単なるバンドラーです。バンドラーは、`Bun.serve` やその他のランタイム API と組み合わせて使用し、同じ効果を実現することを意図しています。そのため、HTTP/ファイルウォッチに関するすべてのオプションは適用されません。

パフォーマンス

パフォーマンスを重視した API と、高度に最適化された Zig ベースの JS/TS パーサーを組み合わせることで、Bun のバンドラーは esbuild の three.js ベンチマークで esbuild より 1.75 倍高速です。

CLI API

Bun と esbuild はどちらもコマンドラインインターフェースを提供しています。

bash
# esbuild
esbuild <entrypoint> --outdir=out --bundle

# bun
bun build <entrypoint> --outdir=out

Bun の CLI では、--minify のような単純なブールフラグは引数を受け付けません。--outdir <path> のような他のフラグは引数を受け付けます。これらのフラグは --outdir out または --outdir=out と記述できます。--define のような一部のフラグは複数回指定できます:--define foo=bar --define bar=baz

esbuildbun build備考
--bundlen/aBun は常にバンドルします。この動作を無効にするには --no-bundle を使用します。
--define:K=V--define K=V小さな構文の違い。コロンなし。
esbuild --define:foo=bar
bun build --define foo=bar
--external:<pkg>--external <pkg>小さな構文の違い。コロンなし。
esbuild --external:react
bun build --external react
--format--formatBun は現在 "esm""cjs" をサポートしていますが、より多くのモジュールフォーマットが計画されています。esbuild はデフォルトで "iife" です。
--loader:.ext=loader--loader .ext:loaderBun は esbuild とは異なる組み込みローダーのセットをサポートしています。完全なリファレンスについては Bundler > Loaders を参照してください。esbuild ローダーの dataurlbinarybase64copyempty はまだ実装されていません。

--loader の構文は少し異なります。
esbuild app.ts --bundle --loader:.svg=text
bun build app.ts --loader .svg:text
--minify--minify違いはありません
--outdir--outdir違いはありません
--outfile--outfile違いはありません
--packages--packages違いはありません
--platform--targettsconfig との一貫性のために --target に変更されました。neutral はサポートされていません。
--serven/a適用されません
--sourcemap--sourcemap違いはありません
--splitting--splitting違いはありません
--targetn/aサポートされていません。Bun のバンドラーは現時点で構文のダウングレードを実行しません。
--watch--watch違いはありません
--allow-overwriten/a上書きは許可されません
--analyzen/aサポートされていません
--asset-names--asset-namingJS API の naming との一貫性のために変更されました
--banner--bannerjs バンドルにのみ適用されます
--footer--footerjs バンドルにのみ適用されます
--certfilen/a適用されません
--charset=utf8n/aサポートされていません
--chunk-names--chunk-namingJS API の naming との一貫性のために変更されました
--colorn/a常に有効
--drop--drop
--entry-names--entry-namingJS API の naming との一貫性のために変更されました
--global-namen/a適用されません。Bun は現時点で iife 出力をサポートしていません
--ignore-annotations--ignore-dce-annotations
--injectn/aサポートされていません
--jsx--jsx-runtime <runtime>"automatic"(jsx 変換を使用)と "classic"React.createElement を使用)をサポート
--jsx-devn/aBun は tsconfig.json から compilerOptions.jsx を読み取り、デフォルトを決定します。compilerOptions.jsx"react-jsx" の場合、または NODE_ENV=production の場合、Bun は jsx 変換を使用します。それ以外の場合、jsxDEV を使用します。バンドラーは preserve をサポートしていません。
--jsx-factory--jsx-factory
--jsx-fragment--jsx-fragment
--jsx-import-source--jsx-import-source
--jsx-side-effectsn/aJSX は常に副作用がないと見なされます
--keep-namesn/aサポートされていません
--keyfilen/a適用されません
--legal-commentsn/aサポートされていません
--log-leveln/aサポートされていません。これは bunfig.tomllogLevel として設定できます。
--log-limitn/aサポートされていません
--log-override:X=Yn/aサポートされていません
--main-fieldsn/aサポートされていません
--mangle-cachen/aサポートされていません
--mangle-propsn/aサポートされていません
--mangle-quotedn/aサポートされていません
--metafilen/aサポートされていません
--minify-whitespace--minify-whitespace
--minify-identifiers--minify-identifiers
--minify-syntax--minify-syntax
--out-extensionn/aサポートされていません
--outbase--root
--preserve-symlinksn/aサポートされていません
--public-path--public-path
--puren/aサポートされていません
--reserve-propsn/aサポートされていません
--resolve-extensionsn/aサポートされていません
--servedirn/a適用されません
--source-rootn/aサポートされていません
--sourcefilen/aサポートされていません。Bun はまだ stdin 入力をサポートしていません。
--sourcemap--sourcemap違いはありません
--sources-contentn/aサポートされていません
--supportedn/aサポートされていません
--tree-shakingn/a常に true
--tsconfig--tsconfig-override
--versionn/aBun のバージョンを確認するには bun --version を実行します。

JavaScript API

esbuild.build()Bun.build()備考
absWorkingDirn/a常に process.cwd() に設定
aliasn/aサポートされていません
allowOverwriten/a常に false
assetNamesnaming.assetesbuild と同じテンプレート構文を使用しますが、[ext] を明示的に含める必要があります。

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> naming: {<br/> asset: "[name].[ext]",<br/> },<br/>});<br/>
bannern/aサポートされていません
bundlen/a常に true。バンドルなしでトランスパイルするには Bun.Transpiler を使用します。
charsetn/aサポートされていません
chunkNamesnaming.chunkesbuild と同じテンプレート構文を使用しますが、[ext] を明示的に含める必要があります。

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> naming: {<br/> chunk: "[name].[ext]",<br/> },<br/>});<br/>
colorn/aBun はビルド結果の logs プロパティでログを返します。
conditionsn/aサポートされていません。エクスポート条件の優先順位は target によって決定されます。
definedefine
dropn/aサポートされていません
entryNamesnaming または naming.entryBun は文字列またはオブジェクトのいずれかである naming キーをサポートします。esbuild と同じテンプレート構文を使用しますが、[ext] を明示的に含める必要があります。

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> // 文字列の場合、これは entryNames と同等です<br/> naming: "[name].[ext]",<br/><br/> // 細かい命名オプション<br/> naming: {<br/> entry: "[name].[ext]",<br/> asset: "[name].[ext]",<br/> chunk: "[name].[ext]",<br/> },<br/>});<br/>
entryPointsentrypoints大文字小文字の違い
externalexternal違いはありません
footern/aサポートされていません
formatformat現在 "esm" のみをサポートしています。"cjs""iife" のサポートは計画されています。
globalNamen/aサポートされていません
ignoreAnnotationsn/aサポートされていません
injectn/aサポートされていません
jsxjsxJS API ではサポートされていません。tsconfig.json で設定します
jsxDevjsxDevJS API ではサポートされていません。tsconfig.json で設定します
jsxFactoryjsxFactoryJS API ではサポートされていません。tsconfig.json で設定します
jsxFragmentjsxFragmentJS API ではサポートされていません。tsconfig.json で設定します
jsxImportSourcejsxImportSourceJS API ではサポートされていません。tsconfig.json で設定します
jsxSideEffectsjsxSideEffectsJS API ではサポートされていません。tsconfig.json で設定します
keepNamesn/aサポートされていません
legalCommentsn/aサポートされていません
loaderloaderBun は esbuild とは異なる組み込みローダーのセットをサポートしています。完全なリファレンスについては Bundler > Loaders を参照してください。esbuild ローダーの dataurlbinarybase64copyempty はまだ実装されていません。
logLeveln/aサポートされていません
logLimitn/aサポートされていません
logOverriden/aサポートされていません
mainFieldsn/aサポートされていません
mangleCachen/aサポートされていません
manglePropsn/aサポートされていません
mangleQuotedn/aサポートされていません
metafilen/aサポートされていません
minifyminifyBun では、minify はブール値またはオブジェクトにできます。

ts<br/>await Bun.build({<br/> entrypoints: ['./index.tsx'],<br/> // すべてのミニファイを有効にする<br/> minify: true<br/><br/> // 細かいオプション<br/> minify: {<br/> identifiers: true,<br/> syntax: true,<br/> whitespace: true<br/> }<br/>})<br/>
minifyIdentifiersminify.identifiersminify を参照
minifySyntaxminify.syntaxminify を参照
minifyWhitespaceminify.whitespaceminify を参照
nodePathsn/aサポートされていません
outExtensionn/aサポートされていません
outbaseroot名前が異なります
outdiroutdir違いはありません
outfileoutfile違いはありません
packagesn/aサポートされていません。external を使用します
platformtarget"bun""node""browser"(デフォルト)をサポートしています。"neutral" はサポートされていません。
pluginspluginsBun のプラグイン API は esbuild のサブセットです。一部の esbuild プラグインは Bun ですぐに動作します。
preserveSymlinksn/aサポートされていません
publicPathpublicPath違いはありません
puren/aサポートされていません
reservePropsn/aサポートされていません
resolveExtensionsn/aサポートされていません
sourceRootn/aサポートされていません
sourcemapsourcemap"inline""external""none" をサポート
sourcesContentn/aサポートされていません
splittingsplitting違いはありません
stdinn/aサポートされていません
supportedn/aサポートされていません
targetn/a構文のダウングレードはサポートされていません
treeShakingn/a常に true
tsconfign/aサポートされていません
writen/aoutdir/outfile が設定されている場合は true、それ以外の場合は false

プラグイン API

Bun のプラグイン API は esbuild 互換になるように設計されています。Bun は esbuild のプラグイン API 全体をサポートしているわけではありませんが、コア機能は実装されています。多くのサードパーティ製 esbuild プラグインは、Bun ですぐに動作します。

NOTE

長期的には、esbuild の API と機能の同等性を目指しています。そのため、何か動作しない場合は、優先順位を付けるために issue を作成してください。

Bun と esbuild のプラグインは、ビルダーオブジェクトで定義されます。

ts
import type { BunPlugin } from "bun";

const myPlugin: BunPlugin = {
  name: "my-plugin",
  setup(builder) {
    // プラグインを定義
  },
};

ビルダーオブジェクトは、バンドルプロセスの一部にフックするためのいくつかのメソッドを提供します。Bun は onResolveonLoad を実装しています。esbuild フックの onStartonEndonDispose、および resolve ユーティリティはまだ実装されていません。initialOptions は部分的に実装されており、読み取り専用で esbuild のオプションのサブセットのみを持っています。代わりに config(同じものですが Bun の BuildConfig 形式)を使用してください。

ts
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

options

- 🟢 `filter`
- 🟢 `namespace`

arguments

- 🟢 `path`
- 🟢 `importer`
- 🔴 `namespace`
- 🔴 `resolveDir`
- 🔴 `kind`
- 🔴 `pluginData`

results

- 🟢 `namespace`
- 🟢 `path`
- 🔴 `errors`
- 🔴 `external`
- 🔴 `pluginData`
- 🔴 `pluginName`
- 🔴 `sideEffects`
- 🔴 `suffix`
- 🔴 `warnings`
- 🔴 `watchDirs`
- 🔴 `watchFiles`

onLoad

options

- 🟢 `filter`
- 🟢 `namespace`

arguments

- 🟢 `path`
- 🔴 `namespace`
- 🔴 `suffix`
- 🔴 `pluginData`

results

- 🟢 `contents`
- 🟢 `loader`
- 🔴 `errors`
- 🔴 `pluginData`
- 🔴 `pluginName`
- 🔴 `resolveDir`
- 🔴 `warnings`
- 🔴 `watchDirs`
- 🔴 `watchFiles`

Bun by www.bunjs.com.cn 編集