Skip to content

API бандлера Bun в значительной степени вдохновлен esbuild. Миграция на бандлер Bun с esbuild должна быть относительно безболезненной. Это руководство кратко объяснит почему вы можете рассмотреть миграцию на бандлер Bun и предоставит справочник API для тех кто уже знаком с API esbuild.

Есть несколько поведенческих различий о которых следует отметить.

NOTE

**Связывание по умолчанию.** В отличие от esbuild Bun всегда связывает по умолчанию. Вот почему флаг `--bundle` не необходим в примере Bun. Для транспиляции каждого файла индивидуально используйте `Bun.Transpiler`.

NOTE

**Это просто бандлер.** В отличие от esbuild бандлер Bun не включает встроенный сервер разработки или наблюдатель файлов. Это просто бандлер. Бандлер предназначен для использования в сочетании с `Bun.serve` и другими API времени выполнения для достижения того же эффекта. Таким образом все опции связанные с HTTP/наблюдением за файлами не применимы.

Производительность

С API ориентированным на производительность в сочетании с чрезвычайно оптимизированным парсером JS/TS на Zig бандлер Bun в 1,75 раза быстрее esbuild на бенчмарке three.js от esbuild.

CLI API

И Bun и esbuild предоставляют интерфейс командной строки.

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

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

В CLI Bun простые булевы флаги такие как --minify не принимают аргумент. Другие флаги такие как --outdir <path> принимают аргумент; эти флаги могут быть записаны как --outdir out или --outdir=out. Некоторые флаги такие как --define могут быть указаны несколько раз: --define foo=bar --define bar=baz.

esbuildbun buildПримечания
--bundleн/дBun всегда связывает используйте --no-bundle для отключения этого поведения.
--define:K=V--define K=VНебольшое различие в синтаксисе; без двоеточия.
esbuild --define:foo=bar
bun build --define foo=bar
--external:<pkg>--external <pkg>Небольшое различие в синтаксисе; без двоеточия.
esbuild --external:react
bun build --external react
--format--formatBun поддерживает "esm" и "cjs" в настоящее время но планируется больше форматов модулей. esbuild по умолчанию использует "iife".
--loader:.ext=loader--loader .ext:loaderBun поддерживает другой набор встроенных загрузчиков чем esbuild; полный справочник смотрите на странице Bundler > Loaders. Загрузчики esbuild dataurl binary base64 copy и empty еще не реализованы.

Синтаксис для --loader немного отличается.
esbuild app.ts --bundle --loader:.svg=text
bun build app.ts --loader .svg:text
--minify--minifyНет различий
--outdir--outdirНет различий
--outfile--outfileНет различий
--packages--packagesНет различий
--platform--targetПереименовано в --target для согласованности с tsconfig. Не поддерживает neutral.
--serveн/дНе применимо
--sourcemap--sourcemapНет различий
--splitting--splittingНет различий
--targetн/дНе поддерживается. Бандлер Bun в настоящее время не выполняет синтаксическое понижение.
--watch--watchНет различий
--allow-overwriteн/дПерезапись никогда не разрешается
--analyzeн/дНе поддерживается
--asset-names--asset-namingПереименовано для согласованности с naming в JS API
--banner--bannerПрименяется только к js бандлам
--footer--footerПрименяется только к js бандлам
--certfileн/дНе применимо
--charset=utf8н/дНе поддерживается
--chunk-names--chunk-namingПереименовано для согласованности с naming в JS API
--colorн/дВсегда включено
--drop--drop
--entry-names--entry-namingПереименовано для согласованности с naming в JS API
--global-nameн/дНе применимо Bun в настоящее время не поддерживает вывод iife
--ignore-annotations--ignore-dce-annotations
--injectн/дНе поддерживается
--jsx--jsx-runtime <runtime>Поддерживает "automatic" (использует jsx transform) и "classic" (использует React.createElement)
--jsx-devн/дBun читает compilerOptions.jsx из tsconfig.json для определения значения по умолчанию. Если compilerOptions.jsx равен "react-jsx" или если NODE_ENV=production Bun будет использовать jsx transform. В противном случае он использует jsxDEV. Бандлер не поддерживает preserve.
--jsx-factory--jsx-factory
--jsx-fragment--jsx-fragment
--jsx-import-source--jsx-import-source
--jsx-side-effectsн/дВсегда предполагается что JSX не имеет побочных эффектов
--keep-namesн/дНе поддерживается
--keyfileн/дНе применимо
--legal-commentsн/дНе поддерживается
--log-levelн/дНе поддерживается. Это можно установить в bunfig.toml как logLevel.
--log-limitн/дНе поддерживается
--log-override:X=Yн/дНе поддерживается
--main-fieldsн/дНе поддерживается
--mangle-cacheн/дНе поддерживается
--mangle-propsн/дНе поддерживается
--mangle-quotedн/дНе поддерживается
--metafileн/дНе поддерживается
--minify-whitespace--minify-whitespace
--minify-identifiers--minify-identifiers
--minify-syntax--minify-syntax
--out-extensionн/дНе поддерживается
--outbase--root
--preserve-symlinksн/дНе поддерживается
--public-path--public-path
--pureн/дНе поддерживается
--reserve-propsн/дНе поддерживается
--resolve-extensionsн/дНе поддерживается
--servedirн/дНе применимо
--source-rootн/дНе поддерживается
--sourcefileн/дНе поддерживается. Bun еще не поддерживает ввод из stdin.
--sourcemap--sourcemapНет различий
--sources-contentн/дНе поддерживается
--supportedн/дНе поддерживается
--tree-shakingн/дВсегда true
--tsconfig--tsconfig-override
--versionн/дВыполните bun --version чтобы увидеть версию Bun.

JavaScript API

esbuild.build()Bun.build()Примечания
absWorkingDirн/дВсегда установлено в process.cwd()
aliasн/дНе поддерживается
allowOverwriteн/дВсегда false
assetNamesnaming.assetИспользует тот же синтаксис шаблонов что и esbuild но [ext] должен быть включен явно.

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> naming: {<br/> asset: "[name].[ext]",<br/> },<br/>});<br/>
bannerн/дНе поддерживается
bundleн/дВсегда true. Используйте Bun.Transpiler для транспиляции без связывания.
charsetн/дНе поддерживается
chunkNamesnaming.chunkИспользует тот же синтаксис шаблонов что и esbuild но [ext] должен быть включен явно.

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> naming: {<br/> chunk: "[name].[ext]",<br/> },<br/>});<br/>
colorн/дBun возвращает логи в свойстве logs результата сборки.
conditionsн/дНе поддерживается. Приоритет условий экспорта определяется target.
definedefine
dropн/дНе поддерживается
entryNamesnaming или naming.entryBun поддерживает ключ naming который может быть строкой или объектом. Использует тот же синтаксис шаблонов что и esbuild но [ext] должен быть включен явно.

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> // когда строка это эквивалентно entryNames<br/> naming: "[name].[ext]",<br/><br/> // гранулярные опции naming<br/> naming: {<br/> entry: "[name].[ext]",<br/> asset: "[name].[ext]",<br/> chunk: "[name].[ext]",<br/> },<br/>});<br/>
entryPointsentrypointsРазличие в капитализации
externalexternalНет различий
footerн/дНе поддерживается
formatformatВ настоящее время поддерживает только "esm". Поддержка "cjs" и "iife" планируется.
globalNameн/дНе поддерживается
ignoreAnnotationsн/дНе поддерживается
injectн/дНе поддерживается
jsxjsxНе поддерживается в JS API настраивается в tsconfig.json
jsxDevjsxDevНе поддерживается в JS API настраивается в tsconfig.json
jsxFactoryjsxFactoryНе поддерживается в JS API настраивается в tsconfig.json
jsxFragmentjsxFragmentНе поддерживается в JS API настраивается в tsconfig.json
jsxImportSourcejsxImportSourceНе поддерживается в JS API настраивается в tsconfig.json
jsxSideEffectsjsxSideEffectsНе поддерживается в JS API настраивается в tsconfig.json
keepNamesн/дНе поддерживается
legalCommentsн/дНе поддерживается
loaderloaderBun поддерживает другой набор встроенных загрузчиков чем esbuild; полный справочник смотрите на странице Bundler > Loaders. Загрузчики esbuild dataurl binary base64 copy и empty еще не реализованы.
logLevelн/дНе поддерживается
logLimitн/дНе поддерживается
logOverrideн/дНе поддерживается
mainFieldsн/дНе поддерживается
mangleCacheн/дНе поддерживается
manglePropsн/дНе поддерживается
mangleQuotedн/дНе поддерживается
metafileн/дНе поддерживается
minifyminifyВ Bun minify может быть булевым или объектом.

ts<br/>await Bun.build({<br/> entrypoints: ['./index.tsx'],<br/> // включить всю минификацию<br/> minify: true<br/><br/> // гранулярные опции<br/> minify: {<br/> identifiers: true,<br/> syntax: true,<br/> whitespace: true<br/> }<br/>})<br/>
minifyIdentifiersminify.identifiersСмотрите minify
minifySyntaxminify.syntaxСмотрите minify
minifyWhitespaceminify.whitespaceСмотрите minify
nodePathsн/дНе поддерживается
outExtensionн/дНе поддерживается
outbaserootДругое имя
outdiroutdirНет различий
outfileoutfileНет различий
packagesн/дНе поддерживается используйте external
platformtargetПоддерживает "bun" "node" и "browser" (по умолчанию). Не поддерживает "neutral".
pluginspluginsAPI плагинов Bun является подмножеством API esbuild. Некоторые плагины esbuild будут работать из коробки с Bun.
preserveSymlinksн/дНе поддерживается
publicPathpublicPathНет различий
pureн/дНе поддерживается
reservePropsн/дНе поддерживается
resolveExtensionsн/дНе поддерживается
sourceRootн/дНе поддерживается
sourcemapsourcemapПоддерживает "inline" "external" и "none"
sourcesContentн/дНе поддерживается
splittingsplittingНет различий
stdinн/дНе поддерживается
supportedн/дНе поддерживается
targetн/дНет поддержки понижения синтаксиса
treeShakingн/дВсегда true
tsconfigн/дНе поддерживается
writeн/дУстановлено в true если установлен outdir/outfile в противном случае false

Plugin API

API плагинов Bun разработан для совместимости с esbuild. Bun не поддерживает всю поверхность API плагинов esbuild но основная функциональность реализована. Многие сторонние плагины esbuild будут работать из коробки с Bun.

NOTE

В долгосрочной перспективе мы стремимся к паритету функций с API esbuild поэтому если что-то не работает пожалуйста создайте issue чтобы помочь нам определить приоритеты.

Плагины в Bun и esbuild определяются с объектом-билдером.

ts
import type { BunPlugin } from "bun";

const myPlugin: BunPlugin = {
  name: "my-plugin",
  setup(builder) {
    // определить плагин
  },
};

Объект-билдер предоставляет некоторые методы для подключения к частям процесса связывания. Bun реализует onResolve и onLoad; он еще не реализует хуки esbuild onStart onEnd и onDispose и утилиты resolve. initialOptions реализован частично будучи доступным только для чтения и имея только подмножество опций esbuild; используйте вместо этого config (то же самое но с форматом BuildConfig от Bun).

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 от www.bunjs.com.cn