BunJS چیست ؟

Bun js چیست
؟
Bun js چیستو آیا میتوان به عنوان جایگزینی برای نود جی اس روی آن حساب ویژهای باز کرد؟
بان جی اسدر اصل ابزار جدیدی شبیه Node.js و Deno برای اجرای کد جاوا اسکریپت است. Bun نوعی جعبه ابزار جامع جاوا اسکریپت ارائه میدهد که به عنوان یک فایل اجرایی به نام bun بستهبندی شده است.
این نوع محیط زمان اجرا از JavaScriptCore، موتوری که سافاری را تأمین میکند، استفاده کرده که معمولاً سریع شروع میشود و در مقایسه با V8 از حافظه کارآمدتر استفاده میکند. اگر در توسعه سمت سرور کار میکنید، یکی از مهمترین مفاهیم آموزشی که بعد از
آموزش جاوا اسکریپتو
آموزش نود جی اسباید به سراغ آن بروید، یادگیری بان جی اس است.
در این مطلب از مجله سبز لرن در رابطه با این موضوع که
Bun js چیست، تاریخچه آن به کجا بازمیگردد، چگونه عمل میکند، نحوه نصب و غیره اطلاعاتی جامع ارائه خواهیم داد.
Bun js چیست و تاریخچه آن به کجا و کی بازمیگردد؟
قبل از اینکه در رابطه با اینکه
Bun js چیستو تاریخچه آن حرف بزنیم، مروری بر نود جی اس (Node.js) و دنو (Deno) و رسالت آنها برای درک بهتر موضوع خالی لطف نیست. Node.js توسط رایان دال در سال 2009 معرفی شد و با وجود اینکه اولین محیط زمان اجرای
جاوا اسکریپتسمت سرور نبود، به سرعت محبوبیت پیدا کرد و
نقش جاوا اسکریپت در بکاندرا با دگرگونیهایی روبهرو ساخت. همانطور که توسط npmjs.com گزارش شده است تا سال 2023، نسخه 20 از آن منتشر شد و دارای بزرگترین اکوسیستم توسعه با بیش از 3.2 میلیون ماژول بود که منجر به نزدیک به 500 میلیارد بارگیری در هفته شد.
در سال 2020، رایان دال Deno را به عنوان یک نسخه مدرن Node.js راهاندازی کرد و به مسائلی مانند امنیت، سازگاری API، ابزار و مدیریت ماژول پرداخت. در حالی که Deno بازخورد مثبت دریافت کرد هنوز هم دلایل قابلتوجهی برای جایگزین شدن نود جی اس ارائه نکرده است.
در سال 2023 شخصی به نام Jarred Sumner، Bun را به دلیل ناامیدی از سرعت Node.js در حین کار بر روی پروژه Next.js ایجاد کرد. برخلاف Node.js و Deno که از موتور V8 استفاده میکنند، Bun از موتور JavaScriptCore استفاده میکند که در مرورگرهای WebKit مانند Safari یافت میشود.
Bun عملکرد و تجربه توسعهدهنده را در اولویت قرار میدهد و هدف آن سادهسازی توسعه جاوا اسکریپت بدون هدر دادن نقاط قوت آن است. بان جی اس میتواند سریعتر از Node.js تکامل یابد زیرا به حفظ سازگاری با اکوسیستم جاوا اسکریپت و npm موجود وابسته نیست. مشابه Deno، Bun به طور بومی از جاوا اسکریپت و
تایپ اسکریپتبدون نیاز به پیکربندی اضافی یا ابزارهای شخص ثالث پشتیبانی میکند.
Bun به عنوان نوعی جایگزین همهکاره برای ابزارهای توسعه و زمان اجرا مختلف، از جمله npm، npx، yarn، کامپایلرهای TypeScript، dotenv، nodemon، pm2، Webpack، Babel و Jest قرار گرفته است. در اصل بان جی اس راهحل جامع و واحد برای توسعه برنامه ارائه میدهد.
مزایای Bun js چیست؟
بان جی اس به خودی خود مزایای قابلتوجهی ارائه میدهد که این مزایا به محبوبیت آن روز به روز اضافه میکنند. بیایید برخی از مزایای کلیدی استفاده از Bun را بررسی کنیم:
- انتخاب موتور کارآمد
- نوشته شده به زبان Zig
- پشتیبانی بومی از جاوا اسکریپت و تایپ اسکریپت
- پشتیبانی از WebAssembly
- مدیریت و ذخیرهسازی ماژول
- مدیریت بسته
- دارای باندلر
- JavaScript API برای گزینههای CLI
قابلدسترسی هستند که امکان ایجاد اسکریپتهای ساخت پیشرفته را بدون اجراکننده وظیفه اختصاصی فراهم میکند.
- تست و مانیتورینگ
- مدیریت متغیرهای محیطی
- پشتیبانی از API
- پشتیبانی از کلاینت بومی SQLite3
و کجا به درد کاربران میخورد توضیحاتی کامل ارائه دادیم. در ادامه نحوه نصب Bun js را در سیستمهای مختلف مورد بررسی قرار خواهیم داد.
نحوه نصب Bun js
برای نصب Bun، بر اساس سیستمعامل خود چندین گزینه دارید:
١. استفاده از curl: برای نصب Bun در لینوکس، macOS یا Windows WSL، دستور زیر را در ترمینال خود اجرا کنید:
curl -fsSL https://bun.sh/install | bash
- استفاده از Node Package Manager (npm): با اجرای این دستور Bun را به صورت سراسری نصب کنید:
npm install -g bun
- استفاده از Brew در macOS: اگر از macOS استفاده میکنید، میتوانید Bun را از طریق Brew با این دستورات نصب کنید:
brew tap oven-sh/bun
brew install bun
- استفاده از داکر: Bun را میتوان از طریق Docker نیز نصب کرد. برای این هدف باید دستورات زیر را اجرا کنید:
docker pull oven/bun
docker run --rm --init --ulimit memlock=-1:-1 oven/bun
پس از نصب Bun، میتوانید به راحتی آن را با دستور زیر ارتقا دهید:
bun upgrade
برای حذف نصب Bun مراحل زیر را دنبال کنید:
- دایرکتوری باینری و کش Bun را با اجرای دستور زیر حذف کنید:
rm -rf ~/.bun
- پس از حذف باید فایل پیکربندی پوسته خود را (مانند.bashrc یا.zshrc) بهروز کنید تا هرگونه ارجاع به ~/.bun/bin را از متغیر $PATH حذف کرده باشید.
مقایسه Bun، Deno و Node.js
ممکن است برای کاربران این سؤال پیش باید که تفاوت اصلی نود جی اس، دنو و Bun js چیست؟ بیایید Bun، Deno و Node.js را با هم مقایسه کنیم:
Deno برخی از محدودیتهای Node را برطرف کرد، اما توسعهدهندگان لزوماً مشتاق استفاده از دنو به جی نود جی اس نیستند که نیستند که دلایل زیر از مهمترین علتهایی هستند که کاربران نود جی اس را ترجیح میدهند:
1 | Deno در ابتدا از ماژولهای شخص ثالث Node پشتیبانی نمیکرد.
2 | انتقال از js به Deno نیازمند یادگیری روشها و تکنیکهای جدید بود.
3 | در حالی که Deno تجربه توسعه بهبودیافتهای را ارائه کرد، بسیاری از توسعهدهندگان js را برای نیازهای آنها کافی دانستند.
4 | برای ترغیب توسعهدهندگان به سوییچ به سمت دنو، Deno درنهایت گزینههای سازگاری را برای js اضافه کرد. با این حال، در طول این مدت، Node.js برخی از ویژگیهای Deno مانند ماژولهای ES، اجراکننده تست داخلی و حالت تماشا (—watch mode) را نیز در خود جای داده است.
از طرفی دیگر Bun با تلاش برای تبدیل شدن به نوعی موتور سریع سازگار با Node.js در حالی که پیشرفتهای Deno را در خود جای داده است، رویکرد متفاوتی دارد. بان جی اس پتانسیل امیدوارکنندهای نسبت به دنو دارد اما هنوز با چالشهایی مانند موارد زیر روبرو است:
1 | عملکرد بان جی اس چشمگیر است اما از آنجایی که توسعهدهندگان کمی در مورد سرعت js نارضایتی دارند، ممکن است این مزیت بهاندازه کافی قانعکننده نباشد.
2 | در حالی که سازگاری بان جی اس با js خوب است اما پشتیبانی کامل از همه ماژولهای Node.js در یک موتور جاوا اسکریپت متفاوت چالشی مهم است. باید دید که آیا JavaScriptCore با سرمایهگذاری کمتر میتواند با پیشرفتهای V8 همگام شود یا خیر.
Bun قصد دارد به کل جایگزین نود جی اس شود اما هنوز طیف گستردهای از ویژگیهای موجود در Deno را ارائه نکرده است.
منظور از سازگاری Node.js با Bun js چیست؟
یکی دیگر از مفاهیم حول محیط زمان اجرای بان جی اس، سازگاری آن با نود جی است اما دقیقاً منظور از سازگاری Node.js با Bun js چیست؟ Bun به طور کلی با Node.js برای پروژههای کوچکتر و ساده کار میکند. حتی در پروژههای عملی ممکن است متوجه شوید که میتوانید برخی از اسکریپتها را با استفاده از bun start به جای npm start بدون نیاز به ایجاد هیچ تغییری نیز اجرا کنید. در کل سازگاری نود جی اس با بان جی اس را میتوان در موارد زیر خلاصه کرد:
1 | ماژولها و APIهای داخلی js مانند fs، path، http، console و assert با بان جی اس سازگار هستند.
2 | متغیرها و اشیاء جهانی مانند __dirname و process در بان جی اس نیز کاربرد دارند.
3 | الگوریتم تفکیک ماژول js که به مکانیابی فایلها در دایرکتوری node_modules کمک میکند در بان جی اس مورد استفاده قرار میگیرد.
اگرچه Bun 1.0 ادعا میکند که میتواند تقریباً هر برنامه Node.js را اجرا کند اما بسیاری از توسعهدهندگان به این ادعا شک دارند. در این رابطه برنامههای پیچیده میتوانند با مشکلاتی مواجه شوند و پیامهای خطای مرموز را از عمق ماژولهای شخص ثالث تولید کنند.
ماژول ES و سازگاری CommonJS در بان جی اس
Bun از هر دو سیستم ماژول ES (ESM) و ماژول CommonJS، همراه با قابلیت انتظار سطح بالا پشتیبانی میکند. در حالی که ESM مدتی طول کشید تا در Node.js معرفی شود، اکوسیستم آن هنوز تا حد زیادی به CommonJS متکی است. با این حال، با Bun، نیازی نیست پسوندهای فایل مانند.js،.cjs، یا.mjs را مشخص کنید، همچنین نیازی نیست که type: module را در فایل package.json خود وارد کنید. شما میتوانید آزادانه از دستورات import و require به صورت مترادف در هر فایلی استفاده کنید.
Bun همه ماژولها را به CommonJS ترجمه کرده و از الگوریتم وضوح node_modules Node پیروی میکند. همچنین ترتیب اجرا میتواند در برخی از برنامهها بسیار مهم باشد، به همین دلیل است که Node.js استفاده از ESM و CommonJS را در یک فایل محدود میکند.
APIهای وب در Bun js
یکی دیگر از ابهامات در مورد بان جی اس، APIهای وب هستند؛ اما دقیقاً منظور از APIهای وب در Bun
js چیستو آیا بان جی اس APIهای وب خود را دارد یا خیر؟ Bun با پشتیبانی داخلی از APIهای وب استاندارد که معمولاً در مرورگرهای وب استفاده میشوند، عملکردی ایدهآل ارائه میدهد. اینها شامل عملکردهایی مانند fetch، Request، Response، URL، blob، WebSocket، JSON handling، setTimeout و ReadableStream میشود. Deno نیز این APIها را به زمان اجرا سرور خود معرفی کرد که منجر به سازگاری بیشتر در توسعه وب شد. Node.js نیز هم اکنون در حال پیشرفت بوده و ویژگیهایی مانند fetch اخیراً در نسخه 18 معرفی کرده است.
علاوه بر این، Bun مجموعهای از APIهای استاندارد بهینه شده خود را برای کارهای رایج مختلف مانند عملیات فایل، سرویسدهی HTTP، پرس و جوی SQLite و هش رمز عبور ارائه میدهد.
WebSocket ها مستقیماً در کنار HTTP در Bun پشتیبانی میشوند و نیاز به ماژولهای شخص ثالث مانند ws را از بین میبرند. در زیر مثالی از نحوه استفاده از WebSockets در Bun آورده شده است:
Bun.serve({
port: 8000,
fetch(request) {
return new Response('Hello from the Bun server!');
},
websocket: {
open(ws) { ... },
message(ws, data) { ... },
close(ws, code, reason) { ... },
}
});
تایپ اسکریپت و فرمت های رایج در بان جی اس
مشابه Deno، Bun شامل نوعی ترانسپایلر جاوا اسکریپت در زمان اجرا است. این بدان معنی است که میتوانید فایلهای جاوا اسکریپت، تایپ اسکریپت، JSX یا TSX را مستقیماً بدون نیاز به هیچگونه وابستگی اضافی اجرا کنید. برای مثال:
bun index.ts bun index.jsx bun index.tsx
این قابلیت اجازه میدهد تا بدون دردسر نصب ابزارها یا کتابخانههای اضافی، انواع مختلف فایلها را در Bun اجرا کنید.
مدیریت بسته در بان جی اس
منظور از مدیریت بسته در
Bun js چیستو آیا این فناوری از قابلیت مدیریت بسته پشتیبانی میکند؟ بله میتوانید مستقیماً از Bun به عنوان جایگزینی برای npm در هر پروژه Node.js استفاده کنید. در اینجا چند نمونه از نحوه استفاده از Bun برای مدیریت بسته آورده شده است:
برای نصب پکیجها:
bun install
برای افزودن بسته:
bun add[--dev|--production|--peer]
برای حذف بسته:
bun remove
برای بهروز رسانی بسته:
bun update
Bun ماژولهای کش را در پوشه یا فهرست ~/.bun/install/cache/ ذخیره کرده و از پیوندهای سخت برای کپی کردن آنها در دایرکتوری node_modules پروژه استفاده میکند. این بدان معناست که همه پروژههای روی سیستم شما به نمونهای واحد از کتابخانه ارجاع میدهند که این ویژگی استفاده از فضای دیسک را کاهش میدهد و عملکرد نصب را تا 30 برابر بهبود میبخشد.
منظور از راهاندازی مجدد زنده در Bun js چیست؟
در بان جی اس شما به ابزارهای اضافی مانند nodemon نیاز ندارید زیرا فایل اجرایی bun شامل نوعی فلگ یا پرچم -watch است. این پرچم به اسکریپتها یا تستها اجازه میدهد تا وقتی تغییراتی در فایل ایجاد میکنید، بهطور خودکار راهاندازی مجدد شوند.
علاوه بر این، Bun نوعی ویژگی مشابه به نام حالت داغ (—hot mode) ارائه میدهد. در این حالت، Bun تغییرات را مانیتور کرده و به آرامی ماژولها را بارگذاری میکند. در حالی که همه فایلها دوباره ارزیابی میشوند، وضعیت سراسری دستنخورده باقی میماند.
تست با بان جی اس
Bun نوعی تست رانر به نام bun:test ارائه میدهد که با Jest سازگار است. این فناوری از تست ایمیج فوری (snapshot)، mocking و پوشش کد (code coverage) پشتیبانی میکند. مثال زیر برای بیان این هدف است:
import { test, expect } from "bun:test";
test('2 + 2', () => {
expect(2 + 2).toBe(4);
});
مهاجرت از Jest یا Vitest ساده است زیرا واردات (دستورات ایمپورت) از @jest/globals یا vitest به طور خودکار به bun:test نگاشت میشوند؛ بنابراین، شما نباید هیچ تغییری در کد خود ایجاد کنید. برای اجرای تستها با Bun، اسکریپتهایی را با الگوهای نامگذاری زیر اجرا کنید:
*.test.{js|jsx|ts|tsx}
*_test.{js|jsx|ts|tsx}
*.spec.{js|jsx|ts|tsx}
*_spec.{js|jsx|ts|tsx}
بستهبندی اسکریپت در بان جی اس
یکی دیگر از سؤالات رایجی که برای کاربران در کار با بان جی اس پیش میآید، بستهبندی اسکریپت است؛ اما منظور از بستهبندی اسکریپت در
Bun js چیستدقیقاً؟ Bun بهعنوان نوعی بستهبندیکننده و مینیفایر برای جاوا اسکریپت و تایپ اسکریپت عمل میکند و قادر به هدفگیری کد برای پلتفرمهای مختلف مانند مرورگر و Node.js است. این قابلیت بان جی اس از esbuild الهام گرفته و نوعی API پلاگین سازگار برای این هدف ارائه میدهد. برای ساخت بسته اولیه، میتوانید از دستور زیر استفاده کنید:
Bun.build({
entrypoints: ['index.js'],
outdir: 'build'
});
با توجه به معیارها، Bun عملکردی دو برابر سریعتر از esbuild کامپایل شده Go را نشان میدهد و در عین حال به صرفهجویی نیز دست مییابد. برخلاف esbuild، Bun در حال حاضر از بستهبندی CSS پشتیبانی نمیکند ولی احتمالاً در آینده پلاگینهایی برای این هدف ارائه شود.
Plugin API در بان جی اس
API پلاگین Bun نوعی ابزار همهکاره است، زیرا میتوان از آن هم برای باندلر و هم برای زمان اجرا استفاده کرد. شما میتوانید پلاگینهایی برای رهگیری واردات و اجرای منطق بارگیری سفارشی ایجاد کنید. در اینجا مثالی آورده شده است که واردات فایلهای.yaml را نشان میدهد:
import { plugin } from "bun";
plugin({
name: 'YAML',
async setup(build) {
const { load } = await import('js-yaml');
const { readFileSync } = await import('fs');
build.onLoad({ filter: /\.(yaml|yml)$/ }, (args) => {
const text = readFileSync(args.path, 'utf8');
const exports = load(text) as Record;
return { exports, loader: 'object' };
});
},
});
در مثال فوق، افزونه موجود ارائه فایلهای.yaml را قطع میکند و منطق بارگیری سفارشی را با استفاده از کتابخانه js-yaml انجام میدهد. سپس با استفاده از ماژول fs فایل را به صورت همزمان میخواند، محتوا را با استفاده از js-yaml بارگیری کرده و دادههای صادر شده را بازمیگراند.
سرعت راهاندازی و اجرا در بان جی اس
هنگام استفاده از bun run