Skip to main content
Bun的打包器API深受esbuild的启发。从esbuild迁移到Bun的打包器应该相对轻松。本指南将简要解释为什么您可能考虑迁移到Bun的打包器,并为已经熟悉esbuild API的人提供一个并排API比较参考。 有几个行为差异需要注意。
默认打包。 与esbuild不同,Bun默认总是打包。这就是为什么在Bun示例中不需要--bundle标志的原因。要单独转译每个文件,请使用Bun.Transpiler
它只是一个打包器。 与esbuild不同,Bun的打包器不包含内置的开发服务器或文件监视器。它只是一个打包器。打包器旨在与Bun.serve和其他运行时API结合使用以达到同样的效果。因此,所有与HTTP/文件监视相关的选项都不适用。

性能

凭借注重性能的API和广泛优化的基于Zig的JS/TS解析器,Bun的打包器在esbuild的three.js基准测试中比esbuild快1.75倍。
从头开始打包10份three.js副本,包含源映射和压缩

CLI API

Bun和esbuild都提供命令行界面。
terminal
# esbuild
esbuild <entrypoint> --outdir=out --bundle

# bun
bun build <entrypoint> --outdir=out
在Bun的CLI中,像--minify这样的简单布尔标志不接受参数。其他标志如--outdir <path>确实接受参数;这些标志可以写成--outdir out--outdir=out。有些标志如--define可以指定多次:--define foo=bar --define bar=baz
esbuildbun build注释
--bundlen/aBun始终打包,使用--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不同的内置加载器集合;请参阅打包器>加载器以获得完整参考。esbuild加载器dataurlbinarybase64copyempty尚未实现。

--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为与tsconfig一致重命名为--target。不支持neutral
--serven/a不适用
--sourcemap--sourcemap没有差异
--splitting--splitting没有差异
--targetn/a不支持。Bun的打包器此时不执行语法降级。
--watch--watch没有差异
--allow-overwriten/a永远不允许覆盖
--analyzen/a不支持
--asset-names--asset-naming为与JS API中的命名一致而重命名
--banner--banner仅应用于js包
--footer--footer仅应用于js包
--certfilen/a不适用
--charset=utf8n/a不支持
--chunk-names--chunk-naming为与JS API中的命名一致而重命名
--colorn/a始终启用
--drop--drop
n/a--featureBun特定。通过import { feature } from "bun:bundle"启用编译时死代码消除的功能标志
--entry-names--entry-naming为与JS API中的命名一致而重命名
--global-namen/a不适用,Bun此时不支持iife输出
--ignore-annotations--ignore-dce-annotations
--injectn/a不支持
--jsx--jsx-runtime <runtime>支持"automatic"(使用jsx转换)和"classic"(使用React.createElement
--jsx-devn/aBun从tsconfig.json中读取compilerOptions.jsx以确定默认值。如果compilerOptions.jsx"react-jsx",或者如果NODE_ENV=production,Bun将使用jsx转换。否则,它使用jsxDEV。打包器不支持preserve
--jsx-factory--jsx-factory
--jsx-fragment--jsx-fragment
--jsx-import-source--jsx-import-source
--jsx-side-effectsn/aJSX始终假定为无副作用
--keep-namesn/a不支持
--keyfilen/a不适用
--legal-commentsn/a不支持
--log-leveln/a不支持。这可以在bunfig.toml中设置为logLevel
--log-limitn/a不支持
--log-override:X=Yn/a不支持
--main-fieldsn/a不支持
--mangle-cachen/a不支持
--mangle-propsn/a不支持
--mangle-quotedn/a不支持
--metafilen/a不支持
--minify-whitespace--minify-whitespace
--minify-identifiers--minify-identifiers
--minify-syntax--minify-syntax
--out-extensionn/a不支持
--outbase--root
--preserve-symlinksn/a不支持
--public-path--public-path
--puren/a不支持
--reserve-propsn/a不支持
--resolve-extensionsn/a不支持
--servedirn/a不适用
--source-rootn/a不支持
--sourcefilen/a不支持。Bun还不支持stdin输入。
--sourcemap--sourcemap没有差异
--sources-contentn/a不支持
--supportedn/a不支持
--tree-shakingn/a始终为true
--tsconfig--tsconfig-override
--versionn/a运行bun --version查看Bun版本。

JavaScript API

esbuild.build()Bun.build()注释
absWorkingDirn/a始终设置为process.cwd()
aliasn/a不支持
allowOverwriten/a始终为false
assetNamesnaming.asset使用与esbuild相同的模板语法,但必须显式包含[ext]

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> naming: {<br/> asset: "[name].[ext]",<br/> },<br/>});<br/>
bannern/a不支持
bundlen/a始终为true。使用Bun.Transpiler在不打包的情况下转译。
charsetn/a不支持
chunkNamesnaming.chunk使用与esbuild相同的模板语法,但必须显式包含[ext]

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> naming: {<br/> chunk: "[name].[ext]",<br/> },<br/>});<br/>
colorn/aBun在构建结果的logs属性中返回日志。
conditionsn/a不支持。导出条件优先级由target确定。
definedefine
dropn/a不支持
entryNamesnamingnaming.entryBun支持一个naming键,它可以是字符串或对象。使用与esbuild相同的模板语法,但必须显式包含[ext]

ts<br/>Bun.build({<br/> entrypoints: ["./index.tsx"],<br/> // 当为字符串时,这相当于entryNames<br/> naming: "[name].[ext]",<br/><br/> // 详细的命名选项<br/> naming: {<br/> entry: "[name].[ext]",<br/> asset: "[name].[ext]",<br/> chunk: "[name].[ext]",<br/> },<br/>});<br/>
entryPointsentrypoints大小写差异
externalexternal没有差异
footern/a不支持
formatformat目前仅支持"esm"。计划支持"cjs""iife"
globalNamen/a不支持
ignoreAnnotationsn/a不支持
injectn/a不支持
jsxjsxJS API中不支持,在tsconfig.json中配置
jsxDevjsxDevJS API中不支持,在tsconfig.json中配置
jsxFactoryjsxFactoryJS API中不支持,在tsconfig.json中配置
jsxFragmentjsxFragmentJS API中不支持,在tsconfig.json中配置
jsxImportSourcejsxImportSourceJS API中不支持,在tsconfig.json中配置
jsxSideEffectsjsxSideEffectsJS API中不支持,在tsconfig.json中配置
keepNamesn/a不支持
legalCommentsn/a不支持
loaderloaderBun支持与esbuild不同的内置加载器集合;请参阅打包器>加载器以获得完整参考。esbuild加载器dataurlbinarybase64copyempty尚未实现。
logLeveln/a不支持
logLimitn/a不支持
logOverriden/a不支持
mainFieldsn/a不支持
mangleCachen/a不支持
manglePropsn/a不支持
mangleQuotedn/a不支持
metafilen/a不支持
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
nodePathsn/a不支持
outExtensionn/a不支持
outbaseroot不同名称
outdiroutdir没有差异
outfileoutfile没有差异
packagesn/a不支持,使用external
platformtarget支持"bun""node""browser"(默认)。不支持"neutral"
pluginspluginsBun的插件API是esbuild的一个子集。一些esbuild插件将在Bun中开箱即用。
preserveSymlinksn/a不支持
publicPathpublicPath没有差异
puren/a不支持
reservePropsn/a不支持
resolveExtensionsn/a不支持
sourceRootn/a不支持
sourcemapsourcemap支持"inline""external""none"
sourcesContentn/a不支持
splittingsplitting没有差异
stdinn/a不支持
supportedn/a不支持
targetn/a不支持语法降级
treeShakingn/a始终为true
tsconfign/a不支持
writen/a如果设置了outdir/outfile则为true,否则为false

插件API

Bun的插件API设计为与esbuild兼容。Bun不支持esbuild的整个插件API表面,但已实现核心功能。许多第三方esbuild插件将在Bun中开箱即用。
从长远来看,我们的目标是与esbuild的API实现功能对等,所以如果某些功能不起作用,请提交问题以帮助我们确定优先级。
Bun和esbuild中的插件使用构建器对象定义。
https://mintcdn.com/teemo/2s-4Z6VdGqiCeBNX/icons/typescript.svg?fit=max&auto=format&n=2s-4Z6VdGqiCeBNX&q=85&s=087b260066909db1cd3e9c7292bc34b2myPlugin.ts
import type { BunPlugin } from "bun";

const myPlugin: BunPlugin = {
  name: "my-plugin",
  setup(builder) {
    // 定义插件
  },
};
构建器对象提供了一些方法,用于挂钩到打包过程的某些部分。Bun实现了onResolveonLoad;尚未实现esbuild钩子onStartonEndonDispose,以及resolve工具。initialOptions部分实现,只读且仅有esbuild选项的子集;使用config(相同的东西但使用Bun的BuildConfig格式)代替。
https://mintcdn.com/teemo/2s-4Z6VdGqiCeBNX/icons/typescript.svg?fit=max&auto=format&n=2s-4Z6VdGqiCeBNX&q=85&s=087b260066909db1cd3e9c7292bc34b2myPlugin.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

  • 🟢 filter
  • 🟢 namespace

onLoad

  • 🟢 filter
  • 🟢 namespace