Skip to content

واجهة برمجة تطبيقات حزمة Bun مستوحاة بشدة من esbuild. الترحيل إلى حزمة Bun من esbuild يجب أن يكون غير مؤلم نسبيًا. هذا الدليل سيشرح بإيجاز لماذا قد تفكر في الترحيل إلى حزمة Bun ويوفر مرجع مقارنة واجهة برمجة تطبيقات جنبًا إلى جنب لأولئك الذين هم على دراية بواجهة برمجة تطبيقات esbuild.

هناك بعض الاختلافات السلوكية التي يجب ملاحظتها.

NOTE

**الحزمة افتراضيًا.** على عكس esbuild، Bun يحزم دائمًا افتراضيًا. هذا هو السبب في أن العلم `--bundle` ليس ضروريًا في مثال Bun. لترجمة كل ملف على حدة، استخدم `Bun.Transpiler`.

NOTE

**إنها مجرد حزمة.** على عكس esbuild، حزمة Bun لا تتضمن خادم تطوير مدمج أو مراقب ملفات. إنها مجرد حزمة. الحزمة مخصصة للاستخدام بالاقتران مع `Bun.serve` وواجهات برمجة التطبيقات الأخرى وقت التشغيل لتحقيق نفس التأثير. على هذا النحو، جميع الخيارات المتعلقة بـ HTTP/مراقبة الملفات غير قابلة للتطبيق.

الأداء

مع واجهة برمجة تطبيقات مراعية للأداء مقترنة بمحلل JS/TS القائم على Zig المحسن بشكل كبير، حزمة Bun أسرع بمقدار 1.75x من esbuild في معيار three.js الخاص بـ esbuild.

واجهة سطر الأوامر

كل من Bun و esbuild يوفران واجهة سطر أوامر.

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

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

في واجهة سطر أوامر Bun، الأعلام البسيطة المنطقية مثل --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؛ راجع 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.
--serven/aغير قابل للتطبيق
--sourcemap--sourcemapلا توجد اختلافات
--splitting--splittingلا توجد اختلافات
--targetn/aغير مدعوم. حزمة Bun لا تقوم بخفض البنية النحوية في هذا الوقت.
--watch--watchلا توجد اختلافات
--allow-overwriten/aالكتابة فوق غير مسموح بها أبدًا
--analyzen/aغير مدعوم
--asset-names--asset-namingتم تغيير الاسم للاتساق مع التسمية في واجهة برمجة تطبيقات JS
--banner--bannerينطبق فقط على حزم js
--footer--footerينطبق فقط على حزم js
--certfilen/aغير قابل للتطبيق
--charset=utf8n/aغير مدعوم
--chunk-names--chunk-namingتم تغيير الاسم للاتساق مع التسمية في واجهة برمجة تطبيقات JS
--colorn/aمفعل دائمًا
--drop--drop
--entry-names--entry-namingتم تغيير الاسم للاتساق مع التسمية في واجهة برمجة تطبيقات JS
--global-namen/aغير قابل للتطبيق، Bun لا يدعم مخرجات iife في هذا الوقت
--ignore-annotations--ignore-dce-annotations
--injectn/aغير مدعوم
--jsx--jsx-runtime <runtime>يدعم "automatic" (يستخدم تحويل jsx) و "classic" (يستخدم React.createElement)
--jsx-devn/aBun يقرأ compilerOptions.jsx من tsconfig.json لتحديد الافتراضي. إذا كان 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صحيح دائمًا
--tsconfig--tsconfig-override
--versionn/aشغّل bun --version لرؤية إصدار Bun.

واجهة برمجة تطبيقات JavaScript

esbuild.build()Bun.build()ملاحظات
absWorkingDirn/aمضبوط دائمًا على process.cwd()
aliasn/aغير مدعوم
allowOverwriten/aخاطئ دائمًا
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صحيح دائمًا. استخدم 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غير مدعوم
entryNamesnaming أو naming.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غير مدعوم
jsxjsxغير مدعوم في واجهة برمجة تطبيقات JS، اضبط في tsconfig.json
jsxDevjsxDevغير مدعوم في واجهة برمجة تطبيقات JS، اضبط في tsconfig.json
jsxFactoryjsxFactoryغير مدعوم في واجهة برمجة تطبيقات JS، اضبط في tsconfig.json
jsxFragmentjsxFragmentغير مدعوم في واجهة برمجة تطبيقات JS، اضبط في tsconfig.json
jsxImportSourcejsxImportSourceغير مدعوم في واجهة برمجة تطبيقات JS، اضبط في tsconfig.json
jsxSideEffectsjsxSideEffectsغير مدعوم في واجهة برمجة تطبيقات JS، اضبط في tsconfig.json
keepNamesn/aغير مدعوم
legalCommentsn/aغير مدعوم
loaderloaderBun يدعم مجموعة مختلفة من المحملات المدمجة عن esbuild؛ راجع Bundler > Loaders للحصول على مرجع كامل. محملات esbuild dataurl و binary و base64 و copy و empty لم يتم تنفيذها بعد.
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".
pluginspluginsواجهة برمجة تطبيقات المكونات الإضافية في Bun هي مجموعة فرعية من 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صحيح دائمًا
tsconfign/aغير مدعوم
writen/aمضبوط على صحيح إذا تم تعيين outdir/outfile، وإلا خاطئ

واجهة برمجة تطبيقات المكونات الإضافية

واجهة برمجة تطبيقات المكونات الإضافية في Bun مصممة لتكون متوافقة مع esbuild. Bun لا يدعم كامل سطح واجهة برمجة تطبيقات المكونات الإضافية في esbuild، لكن الوظيفة الأساسية تم تنفيذها. العديد من مكونات esbuild الإضافية التابعة لجهات خارجية ستعمل مباشرة مع Bun.

NOTE

على المدى الطويل، نهدف إلى تكافؤ الميزات مع واجهة برمجة تطبيقات esbuild، لذا إذا كان شيء ما لا يعمل يرجى تقديم مشكلة لمساعدتنا في تحديد الأولويات.

المكونات الإضافية في Bun و esbuild محددة بكائن منشئ.

myPlugin.ts
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) بدلاً من ذلك.

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

الخيارات

- 🟢 `filter`
- 🟢 `namespace`

الوسائط

- 🟢 `path`
- 🟢 `importer`
- 🔴 `namespace`
- 🔴 `resolveDir`
- 🔴 `kind`
- 🔴 `pluginData`

النتائج

- 🟢 `namespace`
- 🟢 `path`
- 🔴 `errors`
- 🔴 `external`
- 🔴 `pluginData`
- 🔴 `pluginName`
- 🔴 `sideEffects`
- 🔴 `suffix`
- 🔴 `warnings`
- 🔴 `watchDirs`
- 🔴 `watchFiles`

onLoad

الخيارات

- 🟢 `filter`
- 🟢 `namespace`

الوسائط

- 🟢 `path`
- 🔴 `namespace`
- 🔴 `suffix`
- 🔴 `pluginData`

النتائج

- 🟢 `contents`
- 🟢 `loader`
- 🔴 `errors`
- 🔴 `pluginData`
- 🔴 `pluginName`
- 🔴 `resolveDir`
- 🔴 `warnings`
- 🔴 `watchDirs`
- 🔴 `watchFiles`

Bun بواسطة www.bunjs.com.cn تحرير