Skip to content

La API del empaquetador de Bun está fuertemente inspirada en esbuild. Migrar al empaquetador de Bun desde esbuild debería ser relativamente indoloro. Esta guía explicará brevemente por qué podrías considerar migrar al empaquetador de Bun y proporcionará una referencia de comparación de API lado a lado para aquellos que ya están familiarizados con la API de esbuild.

Hay algunas diferencias de comportamiento a tener en cuenta.

NOTE

**Empaquetado por defecto.** A diferencia de esbuild, Bun siempre empaqueta por defecto. Esta es la razón por la que la bandera `--bundle` no es necesaria en el ejemplo de Bun. Para transpilar cada archivo individualmente, usa `Bun.Transpiler`.

NOTE

**Es solo un empaquetador.** A diferencia de esbuild, el empaquetador de Bun no incluye un servidor de desarrollo integrado o vigilante de archivos. Es solo un empaquetador. El empaquetador está destinado a usarse en conjunto con `Bun.serve` y otras APIs de runtime para lograr el mismo efecto. Como tal, todas las opciones relacionadas con HTTP/vigilancia de archivos no son aplicables.

Rendimiento

Con una API orientada al rendimiento acoplada con el parser JS/TS basado en Zig extensamente optimizado, el empaquetador de Bun es 1.75x más rápido que esbuild en el benchmark three.js de esbuild.

API de CLI

Tanto Bun como esbuild proporcionan una interfaz de línea de comandos.

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

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

En el CLI de Bun, banderas booleanas simples como --minify no aceptan un argumento. Otras banderas como --outdir <path> sí aceptan un argumento; estas banderas pueden escribirse como --outdir out o --outdir=out. Algunas banderas como --define pueden especificarse varias veces: --define foo=bar --define bar=baz.

esbuildbun buildNotas
--bundlen/aBun siempre empaqueta, usa --no-bundle para deshabilitar este comportamiento.
--define:K=V--define K=VPequeña diferencia de sintaxis; sin dos puntos.
esbuild --define:foo=bar
bun build --define foo=bar
--external:<pkg>--external <pkg>Pequeña diferencia de sintaxis; sin dos puntos.
esbuild --external:react
bun build --external react
--format--formatBun soporta "esm" y "cjs" actualmente, pero hay más formatos de módulo planificados. esbuild usa "iife" por defecto.
--loader:.ext=loader--loader .ext:loaderBun soporta un conjunto diferente de loaders integrados que esbuild; consulta Bundler > Loaders para una referencia completa. Los loaders de esbuild dataurl, binary, base64, copy, y empty aún no están implementados.

La sintaxis para --loader es ligeramente diferente.
esbuild app.ts --bundle --loader:.svg=text
bun build app.ts --loader .svg:text
--minify--minifySin diferencias
--outdir--outdirSin diferencias
--outfile--outfileSin diferencias
--packages--packagesSin diferencias
--platform--targetRenombrado a --target para consistencia con tsconfig. No soporta neutral.
--serven/aNo aplicable
--sourcemap--sourcemapSin diferencias
--splitting--splittingSin diferencias
--targetn/aNo soportado. El empaquetador de Bun no realiza down-leveling sintáctico en este momento.
--watch--watchSin diferencias
--allow-overwriten/aSobrescribir nunca está permitido
--analyzen/aNo soportado
--asset-names--asset-namingRenombrado para consistencia con naming en la API de JS
--banner--bannerSolo aplica a bundles js
--footer--footerSolo aplica a bundles js
--certfilen/aNo aplicable
--charset=utf8n/aNo soportado
--chunk-names--chunk-namingRenombrado para consistencia con naming en la API de JS
--colorn/aSiempre habilitado
--drop--drop
--entry-names--entry-namingRenombrado para consistencia con naming en la API de JS
--global-namen/aNo aplicable, Bun no soporta salida iife en este momento
--ignore-annotations--ignore-dce-annotations
--injectn/aNo soportado
--jsx--jsx-runtime <runtime>Soporta "automatic" (usa transformación jsx) y "classic" (usa React.createElement)
--jsx-devn/aBun lee compilerOptions.jsx de tsconfig.json para determinar un valor por defecto. Si compilerOptions.jsx es "react-jsx", o si NODE_ENV=production, Bun usará la transformación jsx. De lo contrario, usa jsxDEV. El empaquetador no soporta preserve.
--jsx-factory--jsx-factory
--jsx-fragment--jsx-fragment
--jsx-import-source--jsx-import-source
--jsx-side-effectsn/aJSX siempre se asume libre de efectos secundarios
--keep-namesn/aNo soportado
--keyfilen/aNo aplicable
--legal-commentsn/aNo soportado
--log-leveln/aNo soportado. Esto puede establecerse en bunfig.toml como logLevel.
--log-limitn/aNo soportado
--log-override:X=Yn/aNo soportado
--main-fieldsn/aNo soportado
--mangle-cachen/aNo soportado
--mangle-propsn/aNo soportado
--mangle-quotedn/aNo soportado
--metafilen/aNo soportado
--minify-whitespace--minify-whitespace
--minify-identifiers--minify-identifiers
--minify-syntax--minify-syntax
--out-extensionn/aNo soportado
--outbase--root
--preserve-symlinksn/aNo soportado
--public-path--public-path
--puren/aNo soportado
--reserve-propsn/aNo soportado
--resolve-extensionsn/aNo soportado
--servedirn/aNo aplicable
--source-rootn/aNo soportado
--sourcefilen/aNo soportado. Bun aún no soporta entrada stdin.
--sourcemap--sourcemapSin diferencias
--sources-contentn/aNo soportado
--supportedn/aNo soportado
--tree-shakingn/aSiempre verdadero
--tsconfig--tsconfig-override
--versionn/aEjecuta bun --version para ver la versión de Bun.

API de JavaScript

esbuild.build()Bun.build()Notas
absWorkingDirn/aSiempre establecido a process.cwd()
aliasn/aNo soportado
allowOverwriten/aSiempre falso
assetNamesnaming.assetUsa la misma sintaxis de plantillas que esbuild, pero [ext] debe incluirse explícitamente.

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> naming: {<br/> asset: "[name].[ext]",<br/> },<br/>});<br/>
bannern/aNo soportado
bundlen/aSiempre verdadero. Usa Bun.Transpiler para transpilar sin empaquetar.
charsetn/aNo soportado
chunkNamesnaming.chunkUsa la misma sintaxis de plantillas que esbuild, pero [ext] debe incluirse explícitamente.

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> naming: {<br/> chunk: "[name].[ext]",<br/> },<br/>});<br/>
colorn/aBun devuelve logs en la propiedad logs del resultado de construcción.
conditionsn/aNo soportado. La prioridad de condiciones de exportación está determinada por target.
definedefine
dropn/aNo soportado
entryNamesnaming o naming.entryBun soporta una clave naming que puede ser una cadena o un objeto. Usa la misma sintaxis de plantillas que esbuild, pero [ext] debe incluirse explícitamente.

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> // cuando es cadena, esto es equivalente a entryNames<br/> naming: "[name].[ext]",<br/><br/> // opciones de naming granulares<br/> naming: {<br/> entry: "[name].[ext]",<br/> asset: "[name].[ext]",<br/> chunk: "[name].[ext]",<br/> },<br/>});<br/>
entryPointsentrypointsDiferencia de capitalización
externalexternalSin diferencias
footern/aNo soportado
formatformatSolo soporta "esm" actualmente. El soporte para "cjs" e "iife" está planificado.
globalNamen/aNo soportado
ignoreAnnotationsn/aNo soportado
injectn/aNo soportado
jsxjsxNo soportado en la API de JS, configura en tsconfig.json
jsxDevjsxDevNo soportado en la API de JS, configura en tsconfig.json
jsxFactoryjsxFactoryNo soportado en la API de JS, configura en tsconfig.json
jsxFragmentjsxFragmentNo soportado en la API de JS, configura en tsconfig.json
jsxImportSourcejsxImportSourceNo soportado en la API de JS, configura en tsconfig.json
jsxSideEffectsjsxSideEffectsNo soportado en la API de JS, configura en tsconfig.json
keepNamesn/aNo soportado
legalCommentsn/aNo soportado
loaderloaderBun soporta un conjunto diferente de loaders integrados que esbuild; consulta Bundler > Loaders para una referencia completa. Los loaders de esbuild dataurl, binary, base64, copy, y empty aún no están implementados.
logLeveln/aNo soportado
logLimitn/aNo soportado
logOverriden/aNo soportado
mainFieldsn/aNo soportado
mangleCachen/aNo soportado
manglePropsn/aNo soportado
mangleQuotedn/aNo soportado
metafilen/aNo soportado
minifyminifyEn Bun, minify puede ser un booleano o un objeto.

ts<br/>await Bun.build({<br/> entrypoints: ['./index.tsx'],<br/> // habilitar toda la minificación<br/> minify: true<br/><br/> // opciones granulares<br/> minify: {<br/> identifiers: true,<br/> syntax: true,<br/> whitespace: true<br/> }<br/>})<br/>
minifyIdentifiersminify.identifiersVer minify
minifySyntaxminify.syntaxVer minify
minifyWhitespaceminify.whitespaceVer minify
nodePathsn/aNo soportado
outExtensionn/aNo soportado
outbaserootNombre diferente
outdiroutdirSin diferencias
outfileoutfileSin diferencias
packagesn/aNo soportado, usa external
platformtargetSoporta "bun", "node" y "browser" (el predeterminado). No soporta "neutral".
pluginspluginsLa API de plugins de Bun es un subconjunto de la de esbuild. Algunos plugins de esbuild funcionarán directamente con Bun.
preserveSymlinksn/aNo soportado
publicPathpublicPathSin diferencias
puren/aNo soportado
reservePropsn/aNo soportado
resolveExtensionsn/aNo soportado
sourceRootn/aNo soportado
sourcemapsourcemapSoporta "inline", "external", y "none"
sourcesContentn/aNo soportado
splittingsplittingSin diferencias
stdinn/aNo soportado
supportedn/aNo soportado
targetn/aSin soporte para downleveling de sintaxis
treeShakingn/aSiempre verdadero
tsconfign/aNo soportado
writen/aEstablecido a verdadero si outdir/outfile está establecido, de lo contrario falso

API de Plugins

La API de plugins de Bun está diseñada para ser compatible con esbuild. Bun no soporta toda la superficie de la API de plugins de esbuild, pero la funcionalidad principal está implementada. Muchos plugins de terceros de esbuild funcionarán directamente con Bun.

NOTE

A largo plazo, apuntamos a paridad de características con la API de esbuild, así que si algo no funciona, por favor reporta un problema para ayudarnos a priorizar.

Los plugins en Bun y esbuild se definen con un objeto builder.

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

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

El objeto builder proporciona algunos métodos para conectarse a partes del proceso de empaquetado. Bun implementa onResolve y onLoad; aún no implementa los hooks de esbuild onStart, onEnd, y onDispose, y utilidades resolve. initialOptions está parcialmente implementado, siendo de solo lectura y teniendo solo un subconjunto de las opciones de esbuild; usa config (lo mismo pero con el formato BuildConfig de Bun) en su lugar.

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 por www.bunjs.com.cn editar