Skip to content

Buns Bundler-API ist stark von esbuild inspiriert. Die Migration von esbuild zu Buns Bundler sollte relativ schmerzlos sein. Dieser Leitfaden erklärt kurz, warum Sie eine Migration zu Buns Bundler in Betracht ziehen könnten, und bietet einen API-Vergleich für diejenigen, die bereits mit der esbuild-API vertraut sind.

Es gibt einige Verhaltensunterschiede zu beachten.

NOTE

**Standardmäßiges Bündeln.** Im Gegensatz zu esbuild bündelt Bun standardmäßig immer. Deshalb ist die `--bundle`-Flagge im Bun-Beispiel nicht erforderlich. Um jede Datei einzeln zu transpilieren, verwenden Sie `Bun.Transpiler`.

NOTE

**Es ist nur ein Bundler.** Im Gegensatz zu esbuild enthält Buns Bundler keinen integrierten Entwicklungsserver oder Datei-Watcher. Es ist nur ein Bundler. Der Bundler ist für die Verwendung in Verbindung mit `Bun.serve` und anderen Runtime-APIs vorgesehen, um den gleichen Effekt zu erzielen. Daher sind alle Optionen im Zusammenhang mit HTTP/Datei-Überwachung nicht anwendbar.

Leistung

Mit einer leistungsorientierten API, gekoppelt mit dem umfassend optimierten Zig-basierten JS/TS-Parser, ist Buns Bundler 1,75x schneller als esbuild im esbuild three.js-Benchmark.

CLI-API

Sowohl Bun als auch esbuild bieten eine Befehlszeilenschnittstelle.

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

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

In Buns CLI akzeptieren einfache boolesche Flags wie --minify kein Argument. Andere Flags wie --outdir <path> akzeptieren ein Argument; diese Flags können als --outdir out oder --outdir=out geschrieben werden. Einige Flags wie --define können mehrmals angegeben werden: --define foo=bar --define bar=baz.

esbuildbun buildHinweise
--bundlen/aBun bündelt immer, verwenden Sie --no-bundle, um dieses Verhalten zu deaktivieren.
--define:K=V--define K=VKleiner Syntaxunterschied; kein Doppelpunkt.
esbuild --define:foo=bar
bun build --define foo=bar
--external:<pkg>--external <pkg>Kleiner Syntaxunterschied; kein Doppelpunkt.
esbuild --external:react
bun build --external react
--format--formatBun unterstützt derzeit "esm" und "cjs", aber weitere Modulformate sind geplant. esbuild standardmäßig auf "iife".
--loader:.ext=loader--loader .ext:loaderBun unterstützt einen anderen Satz eingebauter Loader als esbuild; siehe Bundler > Loader für eine vollständige Referenz. Die esbuild-Loader dataurl, binary, base64, copy und empty sind noch nicht implementiert.

Die Syntax für --loader ist leicht unterschiedlich.
esbuild app.ts --bundle --loader:.svg=text
bun build app.ts --loader .svg:text
--minify--minifyKeine Unterschiede
--outdir--outdirKeine Unterschiede
--outfile--outfileKeine Unterschiede
--packages--packagesKeine Unterschiede
--platform--targetUmbenannt in --target für Konsistenz mit tsconfig. Unterstützt neutral nicht.
--serven/aNicht anwendbar
--sourcemap--sourcemapKeine Unterschiede
--splitting--splittingKeine Unterschiede
--targetn/aNicht unterstützt. Buns Bundler führt zu diesem Zeitpunkt kein syntaktisches Down-Leveling durch.
--watch--watchKeine Unterschiede
--allow-overwriten/aÜberschreiben ist nie erlaubt
--analyzen/aNicht unterstützt
--asset-names--asset-namingUmbenannt für Konsistenz mit der Benennung in der JS-API
--banner--bannerGilt nur für JS-Bundles
--footer--footerGilt nur für JS-Bundles
--certfilen/aNicht anwendbar
--charset=utf8n/aNicht unterstützt
--chunk-names--chunk-namingUmbenannt für Konsistenz mit der Benennung in der JS-API
--colorn/aImmer aktiviert
--drop--drop
--entry-names--entry-namingUmbenannt für Konsistenz mit der Benennung in der JS-API
--global-namen/aNicht anwendbar, Bun unterstützt derzeit keine iife-Ausgabe
--ignore-annotations--ignore-dce-annotations
--injectn/aNicht unterstützt
--jsx--jsx-runtime <runtime>Unterstützt "automatic" (verwendet JSX-Transform) und "classic" (verwendet React.createElement)
--jsx-devn/aBun liest compilerOptions.jsx aus tsconfig.json, um einen Standardwert zu bestimmen. Wenn compilerOptions.jsx "react-jsx" ist oder wenn NODE_ENV=production, verwendet Bun die JSX-Transform. Andernfalls verwendet es jsxDEV. Der Bundler unterstützt preserve nicht.
--jsx-factory--jsx-factory
--jsx-fragment--jsx-fragment
--jsx-import-source--jsx-import-source
--jsx-side-effectsn/aJSX wird immer als nebenwirkungsfrei angenommen
--keep-namesn/aNicht unterstützt
--keyfilen/aNicht anwendbar
--legal-commentsn/aNicht unterstützt
--log-leveln/aNicht unterstützt. Dies kann in bunfig.toml als logLevel festgelegt werden.
--log-limitn/aNicht unterstützt
--log-override:X=Yn/aNicht unterstützt
--main-fieldsn/aNicht unterstützt
--mangle-cachen/aNicht unterstützt
--mangle-propsn/aNicht unterstützt
--mangle-quotedn/aNicht unterstützt
--metafilen/aNicht unterstützt
--minify-whitespace--minify-whitespace
--minify-identifiers--minify-identifiers
--minify-syntax--minify-syntax
--out-extensionn/aNicht unterstützt
--outbase--root
--preserve-symlinksn/aNicht unterstützt
--public-path--public-path
--puren/aNicht unterstützt
--reserve-propsn/aNicht unterstützt
--resolve-extensionsn/aNicht unterstützt
--servedirn/aNicht anwendbar
--source-rootn/aNicht unterstützt
--sourcefilen/aNicht unterstützt. Bun unterstützt noch keine stdin-Eingabe.
--sourcemap--sourcemapKeine Unterschiede
--sources-contentn/aNicht unterstützt
--supportedn/aNicht unterstützt
--tree-shakingn/aImmer wahr
--tsconfig--tsconfig-override
--versionn/aFühren Sie bun --version aus, um die Version von Bun zu sehen.

JavaScript-API

esbuild.build()Bun.build()Hinweise
absWorkingDirn/aImmer auf process.cwd() gesetzt
aliasn/aNicht unterstützt
allowOverwriten/aImmer falsch
assetNamesnaming.assetVerwendet die gleiche Templating-Syntax wie esbuild, aber [ext] muss explizit enthalten sein.

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> naming: {<br/> asset: "[name].[ext]",<br/> },<br/>});<br/>
bannern/aNicht unterstützt
bundlen/aImmer wahr. Verwenden Sie Bun.Transpiler, um ohne Bündelung zu transpilieren.
charsetn/aNicht unterstützt
chunkNamesnaming.chunkVerwendet die gleiche Templating-Syntax wie esbuild, aber [ext] muss explizit enthalten sein.

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> naming: {<br/> chunk: "[name].[ext]",<br/> },<br/>});<br/>
colorn/aBun gibt Logs in der logs-Eigenschaft des Build-Ergebnisses zurück.
conditionsn/aNicht unterstützt. Die Priorität der Export-Bedingungen wird durch target bestimmt.
definedefine
dropn/aNicht unterstützt
entryNamesnaming oder naming.entryBun unterstützt einen naming-Schlüssel, der entweder ein String oder ein Objekt sein kann. Verwendet die gleiche Templating-Syntax wie esbuild, aber [ext] muss explizit enthalten sein.

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> // wenn String, ist dies äquivalent zu entryNames<br/> naming: "[name].[ext]",<br/><br/> // granulare Benennungsoptionen<br/> naming: {<br/> entry: "[name].[ext]",<br/> asset: "[name].[ext]",<br/> chunk: "[name].[ext]",<br/> },<br/>});<br/>
entryPointsentrypointsGroßschreibungsunterschied
externalexternalKeine Unterschiede
footern/aNicht unterstützt
formatformatUnterstützt derzeit nur "esm". Unterstützung für "cjs" und "iife" ist geplant.
globalNamen/aNicht unterstützt
ignoreAnnotationsn/aNicht unterstützt
injectn/aNicht unterstützt
jsxjsxNicht in der JS-API unterstützt, in tsconfig.json konfigurieren
jsxDevjsxDevNicht in der JS-API unterstützt, in tsconfig.json konfigurieren
jsxFactoryjsxFactoryNicht in der JS-API unterstützt, in tsconfig.json konfigurieren
jsxFragmentjsxFragmentNicht in der JS-API unterstützt, in tsconfig.json konfigurieren
jsxImportSourcejsxImportSourceNicht in der JS-API unterstützt, in tsconfig.json konfigurieren
jsxSideEffectsjsxSideEffectsNicht in der JS-API unterstützt, in tsconfig.json konfigurieren
keepNamesn/aNicht unterstützt
legalCommentsn/aNicht unterstützt
loaderloaderBun unterstützt einen anderen Satz eingebauter Loader als esbuild; siehe Bundler > Loader für eine vollständige Referenz. Die esbuild-Loader dataurl, binary, base64, copy und empty sind noch nicht implementiert.
logLeveln/aNicht unterstützt
logLimitn/aNicht unterstützt
logOverriden/aNicht unterstützt
mainFieldsn/aNicht unterstützt
mangleCachen/aNicht unterstützt
manglePropsn/aNicht unterstützt
mangleQuotedn/aNicht unterstützt
metafilen/aNicht unterstützt
minifyminifyIn Bun kann minify ein boolescher Wert oder ein Objekt sein.

ts<br/>await Bun.build({<br/> entrypoints: ['./index.tsx'],<br/> // alle Minifizierungen aktivieren<br/> minify: true<br/><br/> // granulare Optionen<br/> minify: {<br/> identifiers: true,<br/> syntax: true,<br/> whitespace: true<br/> }<br/>})<br/>
minifyIdentifiersminify.identifiersSiehe minify
minifySyntaxminify.syntaxSiehe minify
minifyWhitespaceminify.whitespaceSiehe minify
nodePathsn/aNicht unterstützt
outExtensionn/aNicht unterstützt
outbaserootUnterschiedlicher Name
outdiroutdirKeine Unterschiede
outfileoutfileKeine Unterschiede
packagesn/aNicht unterstützt, verwenden Sie external
platformtargetUnterstützt "bun", "node" und "browser" (der Standardwert). Unterstützt "neutral" nicht.
pluginspluginsBuns Plugin-API ist eine Teilmenge von esbuilds. Einige esbuild-Plugins funktionieren sofort mit Bun.
preserveSymlinksn/aNicht unterstützt
publicPathpublicPathKeine Unterschiede
puren/aNicht unterstützt
reservePropsn/aNicht unterstützt
resolveExtensionsn/aNicht unterstützt
sourceRootn/aNicht unterstützt
sourcemapsourcemapUnterstützt "inline", "external" und "none"
sourcesContentn/aNicht unterstützt
splittingsplittingKeine Unterschiede
stdinn/aNicht unterstützt
supportedn/aNicht unterstützt
targetn/aKeine Unterstützung für Syntax-Downleveling
treeShakingn/aImmer wahr
tsconfign/aNicht unterstützt
writen/aAuf wahr gesetzt, wenn outdir/outfile festgelegt ist, andernfalls falsch

Plugin-API

Buns Plugin-API ist darauf ausgelegt, mit esbuild kompatibel zu sein. Bun unterstützt nicht die gesamte Plugin-API-Oberfläche von esbuild, aber die Kernfunktionalität ist implementiert. Viele Drittanbieter-esbuild-Plugins funktionieren sofort mit Bun.

NOTE

Langfristig streben wir Funktionsparität mit der esbuild-API an. Wenn also etwas nicht funktioniert, erstellen Sie bitte ein Issue, um uns bei der Priorisierung zu helfen.

Plugins in Bun und esbuild werden mit einem Builder-Objekt definiert.

myPlugin.ts
ts
import type { BunPlugin } from "bun";

const myPlugin: BunPlugin = {
  name: "my-plugin",
  setup(builder) {
    // Plugin definieren
  },
};

Das Builder-Objekt bietet einige Methoden zum Ankoppeln an Teile des Bündelungsprozesses. Bun implementiert onResolve und onLoad; es implementiert noch nicht die esbuild-Hooks onStart, onEnd und onDispose sowie resolve-Utilities. initialOptions ist teilweise implementiert, schreibgeschützt und hat nur eine Teilmenge der esbuild-Optionen; verwenden Sie stattdessen config (dasselbe, aber mit Buns BuildConfig-Format).

myPlugin.ts
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

Optionen

- 🟢 `filter`
- 🟢 `namespace`

Argumente

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

Ergebnisse

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

onLoad

Optionen

- 🟢 `filter`
- 🟢 `namespace`

Argumente

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

Ergebnisse

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

Bun von www.bunjs.com.cn bearbeitet