Skip to content

L'API del bundler di Bun è fortemente ispirata da esbuild. Migrare al bundler di Bun da esbuild dovrebbe essere relativamente indolore. Questa guida spiegherà brevemente perché potresti considerare la migrazione al bundler di Bun e fornirà un riferimento di confronto API fianco a fianco per coloro che hanno già familiarità con l'API di esbuild.

Ci sono alcune differenze comportamentali da notare.

NOTE

**Bundling di default.** A differenza di esbuild, Bun esegue sempre il bundling di default. Questo è il motivo per cui il flag `--bundle` non è necessario nell'esempio Bun. Per transpilare ogni file individualmente, usa `Bun.Transpiler`.

NOTE

**È solo un bundler.** A differenza di esbuild, il bundler di Bun non include un development server integrato o un file watcher. È solo un bundler. Il bundler è inteso per essere usato in congiunzione con `Bun.serve` e altre API runtime per ottenere lo stesso effetto. Come tale, tutte le opzioni relative a HTTP/file watching non sono applicabili.

Prestazioni

Con un'API orientata alle prestazioni accoppiata con il parser JS/TS basato su Zig estesamente ottimizzato, il bundler di Bun è 1.75x più veloce di esbuild sul benchmark three.js di esbuild.

CLI API

Sia Bun che esbuild forniscono un'interfaccia a riga di comando.

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

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

Nella CLI di Bun, flag booleani semplici come --minify non accettano un argomento. Altri flag come --outdir <path> accettano un argomento; questi flag possono essere scritti come --outdir out o --outdir=out. Alcuni flag come --define possono essere specificati più volte: --define foo=bar --define bar=baz.

esbuildbun buildNote
--bundlen/aBun esegue sempre il bundling, usa --no-bundle per disabilitare questo comportamento.
--define:K=V--define K=VPiccola differenza di sintassi; nessun due punti.
esbuild --define:foo=bar
bun build --define foo=bar
--external:<pkg>--external <pkg>Piccola differenza di sintassi; nessun due punti.
esbuild --external:react
bun build --external react
--format--formatBun supporta "esm" e "cjs" attualmente, ma sono pianificati più formati di modulo. esbuild usa "iife" di default.
--loader:.ext=loader--loader .ext:loaderBun supporta un set diverso di loader built-in rispetto a esbuild; vedi Bundler > Loaders per un riferimento completo. I loader esbuild dataurl, binary, base64, copy, e empty non sono ancora implementati.

La sintassi per --loader è leggermente diversa.
esbuild app.ts --bundle --loader:.svg=text
bun build app.ts --loader .svg:text
--minify--minifyNessuna differenza
--outdir--outdirNessuna differenza
--outfile--outfileNessuna differenza
--packages--packagesNessuna differenza
--platform--targetRinominato in --target per coerenza con tsconfig. Non supporta neutral.
--serven/aNon applicabile
--sourcemap--sourcemapNessuna differenza
--splitting--splittingNessuna differenza
--targetn/aNon supportato. Il bundler di Bun non esegue down-leveling sintattico al momento.
--watch--watchNessuna differenza
--allow-overwriten/aLa sovrascrittura non è mai consentita
--analyzen/aNon supportato
--asset-names--asset-namingRinominato per coerenza con il naming nella JS API
--banner--bannerSi applica solo ai bundle js
--footer--footerSi applica solo ai bundle js
--certfilen/aNon applicabile
--charset=utf8n/aNon supportato
--chunk-names--chunk-namingRinominato per coerenza con il naming nella JS API
--colorn/aSempre abilitato
--drop--drop
--entry-names--entry-namingRinominato per coerenza con il naming nella JS API
--global-namen/aNon applicabile, Bun non supporta output iife al momento
--ignore-annotations--ignore-dce-annotations
--injectn/aNon supportato
--jsx--jsx-runtime <runtime>Supporta "automatic" (usa transform jsx) e "classic" (usa React.createElement)
--jsx-devn/aBun legge compilerOptions.jsx da tsconfig.json per determinare un default. Se compilerOptions.jsx è "react-jsx", o se NODE_ENV=production, Bun userà il transform jsx. Altrimenti, usa jsxDEV. Il bundler non supporta preserve.
--jsx-factory--jsx-factory
--jsx-fragment--jsx-fragment
--jsx-import-source--jsx-import-source
--jsx-side-effectsn/aJSX è sempre assunto come privo di effetti collaterali
--keep-namesn/aNon supportato
--keyfilen/aNon applicabile
--legal-commentsn/aNon supportato
--log-leveln/aNon supportato. Questo può essere impostato in bunfig.toml come logLevel.
--log-limitn/aNon supportato
--log-override:X=Yn/aNon supportato
--main-fieldsn/aNon supportato
--mangle-cachen/aNon supportato
--mangle-propsn/aNon supportato
--mangle-quotedn/aNon supportato
--metafilen/aNon supportato
--minify-whitespace--minify-whitespace
--minify-identifiers--minify-identifiers
--minify-syntax--minify-syntax
--out-extensionn/aNon supportato
--outbase--root
--preserve-symlinksn/aNon supportato
--public-path--public-path
--puren/aNon supportato
--reserve-propsn/aNon supportato
--resolve-extensionsn/aNon supportato
--servedirn/aNon applicabile
--source-rootn/aNon supportato
--sourcefilen/aNon supportato. Bun non supporta ancora input stdin.
--sourcemap--sourcemapNessuna differenza
--sources-contentn/aNon supportato
--supportedn/aNon supportato
--tree-shakingn/aSempre true
--tsconfig--tsconfig-override
--versionn/aEsegui bun --version per vedere la versione di Bun.

JavaScript API

esbuild.build()Bun.build()Note
absWorkingDirn/aSempre impostato su process.cwd()
aliasn/aNon supportato
allowOverwriten/aSempre false
assetNamesnaming.assetUsa la stessa sintassi di templating di esbuild, ma [ext] deve essere incluso esplicitamente.

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> naming: {<br/> asset: "[name].[ext]",<br/> },<br/>});<br/>
bannern/aNon supportato
bundlen/aSempre true. Usa Bun.Transpiler per transpilare senza bundling.
charsetn/aNon supportato
chunkNamesnaming.chunkUsa la stessa sintassi di templating di esbuild, ma [ext] deve essere incluso esplicitamente.

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> naming: {<br/> chunk: "[name].[ext]",<br/> },<br/>});<br/>
colorn/aBun restituisce i log nella proprietà logs del risultato della build.
conditionsn/aNon supportato. La priorità delle condizioni di export è determinata da target.
definedefine
dropn/aNon supportato
entryNamesnaming o naming.entryBun supporta una chiave naming che può essere una stringa o un oggetto. Usa la stessa sintassi di templating di esbuild, ma [ext] deve essere inclusa esplicitamente.

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> // quando stringa, questo è equivalente a entryNames<br/> naming: "[name].[ext]",<br/><br/> // opzioni naming granulari<br/> naming: {<br/> entry: "[name].[ext]",<br/> asset: "[name].[ext]",<br/> chunk: "[name].[ext]",<br/> },<br/>});<br/>
entryPointsentrypointsDifferenza di capitalizzazione
externalexternalNessuna differenza
footern/aNon supportato
formatformatSupporta solo "esm" attualmente. Il supporto per "cjs" e "iife" è pianificato.
globalNamen/aNon supportato
ignoreAnnotationsn/aNon supportato
injectn/aNon supportato
jsxjsxNon supportato nella JS API, configura in tsconfig.json
jsxDevjsxDevNon supportato nella JS API, configura in tsconfig.json
jsxFactoryjsxFactoryNon supportato nella JS API, configura in tsconfig.json
jsxFragmentjsxFragmentNon supportato nella JS API, configura in tsconfig.json
jsxImportSourcejsxImportSourceNon supportato nella JS API, configura in tsconfig.json
jsxSideEffectsjsxSideEffectsNon supportato nella JS API, configura in tsconfig.json
keepNamesn/aNon supportato
legalCommentsn/aNon supportato
loaderloaderBun supporta un set diverso di loader built-in rispetto a esbuild; vedi Bundler > Loaders per un riferimento completo. I loader esbuild dataurl, binary, base64, copy, e empty non sono ancora implementati.
logLeveln/aNon supportato
logLimitn/aNon supportato
logOverriden/aNon supportato
mainFieldsn/aNon supportato
mangleCachen/aNon supportato
manglePropsn/aNon supportato
mangleQuotedn/aNon supportato
metafilen/aNon supportato
minifyminifyIn Bun, minify può essere un booleano o un oggetto.

ts<br/>await Bun.build({<br/> entrypoints: ['./index.tsx'],<br/> // abilita tutta la minificazione<br/> minify: true<br/><br/> // opzioni granulari<br/> minify: {<br/> identifiers: true,<br/> syntax: true,<br/> whitespace: true<br/> }<br/>})<br/>
minifyIdentifiersminify.identifiersVedi minify
minifySyntaxminify.syntaxVedi minify
minifyWhitespaceminify.whitespaceVedi minify
nodePathsn/aNon supportato
outExtensionn/aNon supportato
outbaserootNome diverso
outdiroutdirNessuna differenza
outfileoutfileNessuna differenza
packagesn/aNon supportato, usa external
platformtargetSupporta "bun", "node" e "browser" (il default). Non supporta "neutral".
pluginspluginsL'API plugin di Bun è un sottoinsieme di quella di esbuild. Alcuni plugin esbuild funzioneranno out of the box con Bun.
preserveSymlinksn/aNon supportato
publicPathpublicPathNessuna differenza
puren/aNon supportato
reservePropsn/aNon supportato
resolveExtensionsn/aNon supportato
sourceRootn/aNon supportato
sourcemapsourcemapSupporta "inline", "external", e "none"
sourcesContentn/aNon supportato
splittingsplittingNessuna differenza
stdinn/aNon supportato
supportedn/aNon supportato
targetn/aNessun supporto per downleveling sintattico
treeShakingn/aSempre true
tsconfign/aNon supportato
writen/aImpostato su true se outdir/outfile è impostato, altrimenti false

Plugin API

L'API plugin di Bun è progettata per essere compatibile con esbuild. Bun non supporta l'intera superficie API plugin di esbuild, ma la funzionalità core è implementata. Molti plugin esbuild di terze parti funzioneranno out of the box con Bun.

NOTE

A lungo termine, miriamo alla parità di funzionalità con l'API di esbuild, quindi se qualcosa non funziona per favore apri una issue per aiutarci a dare priorità.

I plugin in Bun e esbuild sono definiti con un oggetto builder.

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

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

L'oggetto builder fornisce alcuni metodi per agganciarsi a parti del processo di bundling. Bun implementa onResolve e onLoad; non implementa ancora gli hook esbuild onStart, onEnd, e onDispose, e le utility resolve. initialOptions è parzialmente implementato, essendo read-only e avendo solo un sottoinsieme delle opzioni di esbuild; usa config (la stessa cosa ma con il formato BuildConfig di Bun) invece.

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

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 a cura di www.bunjs.com.cn