Skip to content

A API do bundler do Bun é fortemente inspirada pelo esbuild. Migrar para o bundler do Bun a partir do esbuild deve ser relativamente simples. Este guia explicará brevemente por que você pode considerar migrar para o bundler do Bun e fornecerá uma referência de API lado a lado para aqueles que já estão familiarizados com a API do esbuild.

Há algumas diferenças comportamentais a serem observadas.

NOTE

**Bundling por padrão.** Diferentemente do esbuild o Bun sempre faz bundling por padrão. É por isso que a flag `--bundle` não é necessária no exemplo do Bun. Para transpilar cada arquivo individualmente use `Bun.Transpiler`.

NOTE

**É apenas um bundler.** Diferentemente do esbuild o bundler do Bun não inclui um development server ou file watcher built-in. É apenas um bundler. O bundler é destinado a ser usado em conjunto com `Bun.serve` e outras APIs de runtime para alcançar o mesmo efeito. Como tal todas as opções relacionadas a HTTP/file watching não se aplicam.

Desempenho

Com uma API orientada a desempenho acoplada com o parser JS/TS baseado em Zig extensivamente otimizado o bundler do Bun é 1,75x mais rápido que o esbuild no benchmark three.js do esbuild.

CLI API

Tanto o Bun quanto o esbuild fornecem uma interface de linha de comando.

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

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

Na CLI do Bun flags booleanas simples como --minify não aceitam um argumento. Outras flags como --outdir <path> aceitam um argumento; estas flags podem ser escritas como --outdir out ou --outdir=out. Algumas flags como --define podem ser especificadas várias vezes: --define foo=bar --define bar=baz.

esbuildbun buildNotas
--bundlen/aO Bun sempre faz bundling use --no-bundle para desabilitar este comportamento.
--define:K=V--define K=VPequena diferença de sintaxe sem dois pontos.
esbuild --define:foo=bar
bun build --define foo=bar
--external:<pkg>--external <pkg>Pequena diferença de sintaxe sem dois pontos.
esbuild --external:react
bun build --external react
--format--formatO Bun suporta "esm" e "cjs" atualmente mas mais formatos de módulo são planejados. esbuild usa como padrão "iife".
--loader:.ext=loader--loader .ext:loaderO Bun suporta um conjunto diferente de loaders built-in que o esbuild; veja Bundler > Loaders para uma referência completa. Os loaders do esbuild dataurl, binary, base64, copy e empty ainda não estão implementados.

A sintaxe para --loader é ligeiramente diferente.
esbuild app.ts --bundle --loader:.svg=text
bun build app.ts --loader .svg:text
--minify--minifySem diferenças
--outdir--outdirSem diferenças
--outfile--outfileSem diferenças
--packages--packagesSem diferenças
--platform--targetRenomeado para --target para consistência com tsconfig. Não suporta neutral.
--serven/aNão se aplica
--sourcemap--sourcemapSem diferenças
--splitting--splittingSem diferenças
--targetn/aNão suportado. O bundler do Bun não faz syntactic down-leveling neste momento.
--watch--watchSem diferenças
--allow-overwriten/aOverwriting nunca é permitido
--analyzen/aNão suportado
--asset-names--asset-namingRenomeado para consistência com naming na API JS
--banner--bannerApenas se aplica a bundles js
--footer--footerApenas se aplica a bundles js
--certfilen/aNão se aplica
--charset=utf8n/aNão suportado
--chunk-names--chunk-namingRenomeado para consistência com naming na API JS
--colorn/aSempre habilitado
--drop--drop
--entry-names--entry-namingRenomeado para consistência com naming na API JS
--global-namen/aNão se aplica o Bun não suporta output iife neste momento
--ignore-annotations--ignore-dce-annotations
--injectn/aNão suportado
--jsx--jsx-runtime <runtime>Suporta "automatic" (usa jsx transform) e "classic" (usa React.createElement)
--jsx-devn/aO Bun lê compilerOptions.jsx de tsconfig.json para determinar um padrão. Se compilerOptions.jsx for "react-jsx" ou se NODE_ENV=production o Bun usará o jsx transform. Caso contrário usa jsxDEV. O bundler não suporta preserve.
--jsx-factory--jsx-factory
--jsx-fragment--jsx-fragment
--jsx-import-source--jsx-import-source
--jsx-side-effectsn/aJSX é sempre assumido como side-effect-free
--keep-namesn/aNão suportado
--keyfilen/aNão se aplica
--legal-commentsn/aNão suportado
--log-leveln/aNão suportado. Isso pode ser definido em bunfig.toml como logLevel.
--log-limitn/aNão suportado
--log-override:X=Yn/aNão suportado
--main-fieldsn/aNão suportado
--mangle-cachen/aNão suportado
--mangle-propsn/aNão suportado
--mangle-quotedn/aNão suportado
--metafilen/aNão suportado
--minify-whitespace--minify-whitespace
--minify-identifiers--minify-identifiers
--minify-syntax--minify-syntax
--out-extensionn/aNão suportado
--outbase--root
--preserve-symlinksn/aNão suportado
--public-path--public-path
--puren/aNão suportado
--reserve-propsn/aNão suportado
--resolve-extensionsn/aNão suportado
--servedirn/aNão se aplica
--source-rootn/aNão suportado
--sourcefilen/aNão suportado. O Bun ainda não suporta entrada stdin.
--sourcemap--sourcemapSem diferenças
--sources-contentn/aNão suportado
--supportedn/aNão suportado
--tree-shakingn/aSempre true
--tsconfig--tsconfig-override
--versionn/aExecute bun --version para ver a versão do Bun.

JavaScript API

esbuild.build()Bun.build()Notas
absWorkingDirn/aSempre definido como process.cwd()
aliasn/aNão suportado
allowOverwriten/aSempre false
assetNamesnaming.assetUsa a mesma sintaxe de templating que o esbuild mas [ext] deve ser incluído explicitamente.

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> naming: {<br/> asset: "[name].[ext]",<br/> },<br/>});<br/>
bannern/aNão suportado
bundlen/aSempre true. Use Bun.Transpiler para transpilar sem bundling.
charsetn/aNão suportado
chunkNamesnaming.chunkUsa a mesma sintaxe de templating que o esbuild mas [ext] deve ser incluído explicitamente.

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> naming: {<br/> chunk: "[name].[ext]",<br/> },<br/>});<br/>
colorn/aO Bun retorna logs na propriedade logs do resultado do build.
conditionsn/aNão suportado. A prioridade de condições de export é determinada por target.
definedefine
dropn/aNão suportado
entryNamesnaming ou naming.entryO Bun suporta uma chave naming que pode ser uma string ou um objeto. Usa a mesma sintaxe de templating que o esbuild mas [ext] deve ser incluído explicitamente.

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> // quando string isso é equivalente a entryNames<br/> naming: "[name].[ext]",<br/><br/> // opções granulares de naming<br/> naming: {<br/> entry: "[name].[ext]",<br/> asset: "[name].[ext]",<br/> chunk: "[name].[ext]",<br/> },<br/>});<br/>
entryPointsentrypointsDiferença de capitalização
externalexternalSem diferenças
footern/aNão suportado
formatformatApenas suporta "esm" atualmente. Suporte para "cjs" e "iife" é planejado.
globalNamen/aNão suportado
ignoreAnnotationsn/aNão suportado
injectn/aNão suportado
jsxjsxNão suportado na API JS configure em tsconfig.json
jsxDevjsxDevNão suportado na API JS configure em tsconfig.json
jsxFactoryjsxFactoryNão suportado na API JS configure em tsconfig.json
jsxFragmentjsxFragmentNão suportado na API JS configure em tsconfig.json
jsxImportSourcejsxImportSourceNão suportado na API JS configure em tsconfig.json
jsxSideEffectsjsxSideEffectsNão suportado na API JS configure em tsconfig.json
keepNamesn/aNão suportado
legalCommentsn/aNão suportado
loaderloaderO Bun suporta um conjunto diferente de loaders built-in que o esbuild; veja Bundler > Loaders para uma referência completa. Os loaders do esbuild dataurl, binary, base64, copy e empty ainda não estão implementados.
logLeveln/aNão suportado
logLimitn/aNão suportado
logOverriden/aNão suportado
mainFieldsn/aNão suportado
mangleCachen/aNão suportado
manglePropsn/aNão suportado
mangleQuotedn/aNão suportado
metafilen/aNão suportado
minifyminifyNo Bun minify pode ser um boolean ou um objeto.

ts<br/>await Bun.build({<br/> entrypoints: ['./index.tsx'],<br/> // habilita toda minificação<br/> minify: true<br/><br/> // opções granulares<br/> minify: {<br/> identifiers: true,<br/> syntax: true,<br/> whitespace: true<br/> }<br/>})<br/>
minifyIdentifiersminify.identifiersVeja minify
minifySyntaxminify.syntaxVeja minify
minifyWhitespaceminify.whitespaceVeja minify
nodePathsn/aNão suportado
outExtensionn/aNão suportado
outbaserootNome diferente
outdiroutdirSem diferenças
outfileoutfileSem diferenças
packagesn/aNão suportado use external
platformtargetSuporta "bun", "node" e "browser" (o padrão). Não suporta "neutral".
pluginspluginsA API de plugins do Bun é um subconjunto da API do esbuild. Alguns plugins do esbuild funcionarão imediatamente com o Bun.
preserveSymlinksn/aNão suportado
publicPathpublicPathSem diferenças
puren/aNão suportado
reservePropsn/aNão suportado
resolveExtensionsn/aNão suportado
sourceRootn/aNão suportado
sourcemapsourcemapSuporta "inline", "external" e "none"
sourcesContentn/aNão suportado
splittingsplittingSem diferenças
stdinn/aNão suportado
supportedn/aNão suportado
targetn/aSem suporte para syntax downleveling
treeShakingn/aSempre true
tsconfign/aNão suportado
writen/aDefinido como true se outdir/outfile estiver definido caso contrário false

Plugin API

A API de plugins do Bun é projetada para ser compatível com o esbuild. O Bun não suporta toda a superfície da API de plugins do esbuild mas a funcionalidade principal é implementada. Muitos plugins de terceiros do esbuild funcionarão imediatamente com o Bun.

NOTE

Longo prazo visamos paridade de recursos com a API do esbuild então se algo não funcionar por favor abra uma issue para nos ajudar a priorizar.

Plugins no Bun e esbuild são definidos com um builder object.

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

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

O builder object fornece alguns métodos para hooking em partes do processo de bundling. O Bun implementa onResolve e onLoad; ainda não implementa os hooks do esbuild onStart, onEnd e onDispose e utilitários resolve. initialOptions é parcialmente implementado sendo read-only e tendo apenas um subconjunto das opções do esbuild; use config (a mesma coisa mas com o formato BuildConfig do Bun) em vez disso.

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 by www.bunjs.com.cn edit