Skip to content

L'API du bundler de Bun est fortement inspirée par esbuild. La migration vers le bundler de Bun depuis esbuild devrait être relativement indolore. Ce guide expliquera brièvement pourquoi vous pourriez envisager de migrer vers le bundler de Bun et fournira une référence API côte à côte pour ceux qui sont déjà familiers avec l'API d'esbuild.

Il y a quelques différences de comportement à noter.

NOTE

**Bundling par défaut.** Contrairement à esbuild, Bun effectue toujours le bundling par défaut. C'est pourquoi l'option `--bundle` n'est pas nécessaire dans l'exemple Bun. Pour transpiler chaque fichier individuellement, utilisez `Bun.Transpiler`.

NOTE

**C'est juste un bundler.** Contrairement à esbuild, le bundler de Bun n'inclut pas de serveur de développement intégré ni de surveilleur de fichiers. C'est juste un bundler. Le bundler est destiné à être utilisé en conjonction avec `Bun.serve` et d'autres API d'exécution pour obtenir le même effet. En tant que tel, toutes les options relatives au HTTP/surveillance de fichiers ne sont pas applicables.

Performance

Avec une API axée sur la performance couplée à l'analyseur JS/TS en Zig largement optimisé, le bundler de Bun est 1,75x plus rapide qu'esbuild sur le benchmark three.js d'esbuild.

API CLI

Bun et esbuild fournissent tous deux une interface de ligne de commande.

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

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

Dans la CLI de Bun, les options booléennes simples comme --minify n'acceptent pas d'argument. D'autres options comme --outdir <path> acceptent un argument ; ces options peuvent être écrites comme --outdir out ou --outdir=out. Certaines options comme --define peuvent être spécifiées plusieurs fois : --define foo=bar --define bar=baz.

esbuildbun buildNotes
--bundlen/aBun effectue toujours le bundling, utilisez --no-bundle pour désactiver ce comportement.
--define:K=V--define K=VPetite différence de syntaxe ; pas de deux-points.
esbuild --define:foo=bar
bun build --define foo=bar
--external:<pkg>--external <pkg>Petite différence de syntaxe ; pas de deux-points.
esbuild --external:react
bun build --external react
--format--formatBun prend en charge "esm" et "cjs" actuellement, mais plus de formats de modules sont prévus. esbuild utilise "iife" par défaut.
--loader:.ext=loader--loader .ext:loaderBun prend en charge un ensemble différent de chargeurs intégrés par rapport à esbuild ; consultez Bundler > Chargeurs pour une référence complète. Les chargeurs esbuild dataurl, binary, base64, copy, et empty ne sont pas encore implémentés.

La syntaxe pour --loader est légèrement différente.
esbuild app.ts --bundle --loader:.svg=text
bun build app.ts --loader .svg:text
--minify--minifyAucune différence
--outdir--outdirAucune différence
--outfile--outfileAucune différence
--packages--packagesAucune différence
--platform--targetRenommé en --target pour la cohérence avec tsconfig. Ne prend pas en charge neutral.
--serven/aNon applicable
--sourcemap--sourcemapAucune différence
--splitting--splittingAucune différence
--targetn/aNon pris en charge. Le bundler de Bun n'effectue aucun abaissement syntaxique pour le moment.
--watch--watchAucune différence
--allow-overwriten/aL'écrasement n'est jamais autorisé
--analyzen/aNon pris en charge
--asset-names--asset-namingRenommé pour la cohérence avec le nommage dans l'API JS
--banner--bannerS'applique uniquement aux bundles js
--footer--footerS'applique uniquement aux bundles js
--certfilen/aNon applicable
--charset=utf8n/aNon pris en charge
--chunk-names--chunk-namingRenommé pour la cohérence avec le nommage dans l'API JS
--colorn/aToujours activé
--drop--drop
--entry-names--entry-namingRenommé pour la cohérence avec le nommage dans l'API JS
--global-namen/aNon applicable, Bun ne prend pas en charge la sortie iife pour le moment
--ignore-annotations--ignore-dce-annotations
--injectn/aNon pris en charge
--jsx--jsx-runtime <runtime>Prend en charge "automatic" (utilise la transformation jsx) et "classic" (utilise React.createElement)
--jsx-devn/aBun lit compilerOptions.jsx depuis tsconfig.json pour déterminer une valeur par défaut. Si compilerOptions.jsx est "react-jsx", ou si NODE_ENV=production, Bun utilisera la transformation jsx. Sinon, il utilise jsxDEV. Le bundler ne prend pas en charge preserve.
--jsx-factory--jsx-factory
--jsx-fragment--jsx-fragment
--jsx-import-source--jsx-import-source
--jsx-side-effectsn/aJSX est toujours considéré comme sans effet de bord
--keep-namesn/aNon pris en charge
--keyfilen/aNon applicable
--legal-commentsn/aNon pris en charge
--log-leveln/aNon pris en charge. Cela peut être défini dans bunfig.toml comme logLevel.
--log-limitn/aNon pris en charge
--log-override:X=Yn/aNon pris en charge
--main-fieldsn/aNon pris en charge
--mangle-cachen/aNon pris en charge
--mangle-propsn/aNon pris en charge
--mangle-quotedn/aNon pris en charge
--metafilen/aNon pris en charge
--minify-whitespace--minify-whitespace
--minify-identifiers--minify-identifiers
--minify-syntax--minify-syntax
--out-extensionn/aNon pris en charge
--outbase--root
--preserve-symlinksn/aNon pris en charge
--public-path--public-path
--puren/aNon pris en charge
--reserve-propsn/aNon pris en charge
--resolve-extensionsn/aNon pris en charge
--servedirn/aNon applicable
--source-rootn/aNon pris en charge
--sourcefilen/aNon pris en charge. Bun ne prend pas encore en charge l'entrée stdin.
--sourcemap--sourcemapAucune différence
--sources-contentn/aNon pris en charge
--supportedn/aNon pris en charge
--tree-shakingn/aToujours vrai
--tsconfig--tsconfig-override
--versionn/aExécutez bun --version pour voir la version de Bun.

API JavaScript

esbuild.build()Bun.build()Notes
absWorkingDirn/aToujours défini sur process.cwd()
aliasn/aNon pris en charge
allowOverwriten/aToujours faux
assetNamesnaming.assetUtilise la même syntaxe de modèle qu'esbuild, mais [ext] doit être inclus explicitement.

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> naming: {<br/> asset: "[name].[ext]",<br/> },<br/>});<br/>
bannern/aNon pris en charge
bundlen/aToujours vrai. Utilisez Bun.Transpiler pour transpiler sans bundling.
charsetn/aNon pris en charge
chunkNamesnaming.chunkUtilise la même syntaxe de modèle qu'esbuild, mais [ext] doit être inclus explicitement.

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> naming: {<br/> chunk: "[name].[ext]",<br/> },<br/>});<br/>
colorn/aBun retourne les journaux dans la propriété logs du résultat de construction.
conditionsn/aNon pris en charge. La priorité des conditions d'exportation est déterminée par target.
definedefine
dropn/aNon pris en charge
entryNamesnaming ou naming.entryBun prend en charge une clé naming qui peut être soit une chaîne soit un objet. Utilise la même syntaxe de modèle qu'esbuild, mais [ext] doit être inclus explicitement.

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> // quand chaîne, c'est équivalent à entryNames<br/> naming: "[name].[ext]",<br/><br/> // options de nommage granulaires<br/> naming: {<br/> entry: "[name].[ext]",<br/> asset: "[name].[ext]",<br/> chunk: "[name].[ext]",<br/> },<br/>});<br/>
entryPointsentrypointsDifférence de capitalisation
externalexternalAucune différence
footern/aNon pris en charge
formatformatPrend uniquement en charge "esm" actuellement. Le support pour "cjs" et "iife" est prévu.
globalNamen/aNon pris en charge
ignoreAnnotationsn/aNon pris en charge
injectn/aNon pris en charge
jsxjsxNon pris en charge dans l'API JS, configurez dans tsconfig.json
jsxDevjsxDevNon pris en charge dans l'API JS, configurez dans tsconfig.json
jsxFactoryjsxFactoryNon pris en charge dans l'API JS, configurez dans tsconfig.json
jsxFragmentjsxFragmentNon pris en charge dans l'API JS, configurez dans tsconfig.json
jsxImportSourcejsxImportSourceNon pris en charge dans l'API JS, configurez dans tsconfig.json
jsxSideEffectsjsxSideEffectsNon pris en charge dans l'API JS, configurez dans tsconfig.json
keepNamesn/aNon pris en charge
legalCommentsn/aNon pris en charge
loaderloaderBun prend en charge un ensemble différent de chargeurs intégrés par rapport à esbuild ; consultez Bundler > Chargeurs pour une référence complète. Les chargeurs esbuild dataurl, binary, base64, copy, et empty ne sont pas encore implémentés.
logLeveln/aNon pris en charge
logLimitn/aNon pris en charge
logOverriden/aNon pris en charge
mainFieldsn/aNon pris en charge
mangleCachen/aNon pris en charge
manglePropsn/aNon pris en charge
mangleQuotedn/aNon pris en charge
metafilen/aNon pris en charge
minifyminifyDans Bun, minify peut être un booléen ou un objet.

ts<br/>await Bun.build({<br/> entrypoints: ['./index.tsx'],<br/> // activer toute la minification<br/> minify: true<br/><br/> // options granulaires<br/> minify: {<br/> identifiers: true,<br/> syntax: true,<br/> whitespace: true<br/> }<br/>})<br/>
minifyIdentifiersminify.identifiersVoir minify
minifySyntaxminify.syntaxVoir minify
minifyWhitespaceminify.whitespaceVoir minify
nodePathsn/aNon pris en charge
outExtensionn/aNon pris en charge
outbaserootNom différent
outdiroutdirAucune différence
outfileoutfileAucune différence
packagesn/aNon pris en charge, utilisez external
platformtargetPrend en charge "bun", "node" et "browser" (la valeur par défaut). Ne prend pas en charge "neutral".
pluginspluginsL'API de plugin de Bun est un sous-ensemble de celle d'esbuild. Certains plugins esbuild fonctionneront directement avec Bun.
preserveSymlinksn/aNon pris en charge
publicPathpublicPathAucune différence
puren/aNon pris en charge
reservePropsn/aNon pris en charge
resolveExtensionsn/aNon pris en charge
sourceRootn/aNon pris en charge
sourcemapsourcemapPrend en charge "inline", "external", et "none"
sourcesContentn/aNon pris en charge
splittingsplittingAucune différence
stdinn/aNon pris en charge
supportedn/aNon pris en charge
targetn/aAucun support pour l'abaissement de syntaxe
treeShakingn/aToujours vrai
tsconfign/aNon pris en charge
writen/aDéfini sur vrai si outdir/outfile est défini, sinon faux

API de plugin

L'API de plugin de Bun est conçue pour être compatible avec esbuild. Bun ne prend pas en charge toute la surface de l'API de plugin d'esbuild, mais les fonctionnalités de base sont implémentées. De nombreux plugins esbuild tiers fonctionneront directement avec Bun.

NOTE

À long terme, nous visons la parité fonctionnelle avec l'API d'esbuild, donc si quelque chose ne fonctionne pas, veuillez ouvrir un problème pour nous aider à prioriser.

Les plugins dans Bun et esbuild sont définis avec un objet builder.

ts
import type { BunPlugin } from "bun";

const myPlugin: BunPlugin = {
  name: "my-plugin",
  setup(builder) {
    // définir le plugin
  },
};

L'objet builder fournit des méthodes pour s'accrocher à différentes parties du processus de bundling. Bun implémente onResolve et onLoad ; il n'implémente pas encore les hooks esbuild onStart, onEnd, et onDispose, et les utilitaires resolve. initialOptions est partiellement implémenté, étant en lecture seule et n'ayant qu'un sous-ensemble des options d'esbuild ; utilisez config (la même chose mais avec le format BuildConfig de Bun) à la place.

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 édité par www.bunjs.com.cn