مقایسه bun در مقابل nodejs

مقایسه bun در مقابل nodejs

در تاریخ ۸ سپتامبر، جامعه جاوااسکریپت با انتشار Bun نسخه ۱.۰ که توسط "جرد سامنر" ساخته شده بود، دچار هیجان تازه‌ای شد. اما با تمام این صحبت‌ها، بسیاری از افراد هنوز این سؤال را دارند: ماهیت Bun چیست؟ چرا همه آن را با Node.js مقایسه می‌کنند؟ آیا Bun فقط یک مد زودگذر است یا اینکه آمده تا این عرصه را دوباره تعریف کند؟ در این مقاله، به صورت عمیق به Bun می‌پردازیم، ویژگی‌های آن را بررسی می‌کنیم و می‌بینیم چگونه در مقایسه با Node.js جا افتاده عمل می‌کند.

Bun چیست؟

Bun یک جعبه‌ابزار بسیار سریع و یکپارچه برای اپلیکیشن‌های جاوااسکریپت و تایپ‌اسکریپت است. جذابیت اصلی Bun در قابلیت آن برای ساده‌سازی فرآیند توسعه است که باعث می‌شود کار توسعه‌دهندگان روان‌تر و کارآمدتر شود. این امکان به لطف این موضوع فراهم شده که Bun تنها یک محیط اجرا (runtime) نیست، بلکه یک مدیر بسته (package manager)، یک باندلر (bundler)، و یک ابزار اجرای تست نیز هست. تصور کنید یک چاقوی ارتشی سوئیسی برای توسعه جاوااسکریپت داشته باشید؛ این همان Bun است.

Bun چه مشکلاتی را حل می‌کند؟

تأسیس Node.js در سال ۲۰۰۹ انقلابی بود. اما همان‌طور که بسیاری از فناوری‌ها با رشد و پیچیده‌تر شدن مواجه می‌شوند، Node.js نیز از این قاعده مستثنی نبود. اگر بخواهیم آن را مثل یک شهر تصور کنیم، با بزرگ‌تر شدن این شهر، مشکلاتی مانند ازدحام ترافیک ایجاد می‌شود.

هدف Bun این است که به‌عنوان زیرساختی جدید عمل کند و این "ترافیک" را کاهش دهد و کارها را روان‌تر و سریع‌تر کند. Bun به دنبال بازاختراع چرخ نیست، بلکه به دنبال بهینه‌سازی آن است تا همزمان با حفظ سرعت و سادگی، ویژگی‌های منحصربه‌فرد و قدرتمند جاوااسکریپت از دست نرود.

Bun به‌عنوان جایگزینی سریع‌تر، سبک‌تر و مدرن‌تر برای Node.js طراحی شده است. بیایید نگاهی عمیق‌تر به مقایسه آن بیندازیم، اما ابتدا موضوع دیگری را بررسی کنیم.

Node.js در مقابل Deno و Bun

در بحث تکامل محیط‌های اجرای جاوااسکریپت، نمی‌توان Deno را نادیده گرفت. "رایان دال"، خالق Node.js، Deno را به‌عنوان محیط اجرایی جدیدی معرفی کرد که به دنبال حل برخی از چالش‌ها و انتقاداتی بود که او در مورد Node.js داشت.

Deno یک محیط امن برای اجرای جاوااسکریپت و تایپ‌اسکریپت است. این محیط بسیاری از نقاط ضعف Node.js را مستقیماً رفع می‌کند. برای مثال، Deno به‌صورت بومی از تایپ‌اسکریپت پشتیبانی می‌کند، بدون نیاز به ابزارهای خارجی. برخلاف Node.js که به صورت پیش‌فرض اجازه گسترده‌ای به اسکریپت‌ها می‌دهد، Deno رویکرد "امنیت اول" را در پیش گرفته و از توسعه‌دهندگان می‌خواهد تا به‌صراحت مجوز عملیات حساس مانند دسترسی به فایل سیستم یا اتصال به شبکه را بدهند.

درحالی‌که Deno جایگزین جذابی برای Node.js است، هنوز به محبوبیت گسترده Node.js نرسیده است. بنابراین، این مقاله تمرکز خود را بر مقایسه Bun با Node.js معطوف می‌کند.

شروع کار با Bun

با استفاده از Bun، می‌توانید یک پروژه خالی را با دستور زیر شروع کنید:

bun init -y

این دستور چند فایل ایجاد می‌کند. در فایل index.ts، خط زیر را اضافه کنید:

console.log("Hello, Bun!");

سپس با دستور زیر آن را اجرا کنید:

bun index.ts

در خروجی عبارت "Hello, Bun!" نمایش داده می‌شود.


مقایسه Bun با Node.js: محیط اجرای جاوااسکریپت

محیط اجرای جاوااسکریپت (JavaScript runtime) محیطی است که تمام اجزای موردنیاز برای استفاده و اجرای یک برنامه جاوااسکریپت را فراهم می‌کند.

هر دو Node.js و Bun محیط اجرا هستند. Node.js عمدتاً به زبان C++ نوشته شده، درحالی‌که Bun با زبان برنامه‌نویسی سطح پایین و چندمنظوره‌ای به نام Zig نوشته شده است. اما این تنها نوک کوه یخ است؛ بیایید نگاهی دقیق‌تر به تفاوت‌های دیگر آن‌ها بیندازیم.

موتور جاوااسکریپت

موتور جاوااسکریپت برنامه‌ای است که کد جاوااسکریپتی ما را به کد ماشین تبدیل می‌کند تا کامپیوتر بتواند وظایف خاصی را انجام دهد.

  • Node.js از موتور V8 گوگل استفاده می‌کند که قدرت‌دهنده مرورگر کروم است.
  • Bun از JavaScriptCore (JSC) استفاده می‌کند، موتوری متن‌باز که توسط اپل برای مرورگر سافاری توسعه یافته است.

V8 و JSC معماری‌ها و استراتژی‌های بهینه‌سازی متفاوتی دارند. JSC اولویت را به زمان شروع سریع‌تر و کاهش استفاده از حافظه می‌دهد، اگرچه ممکن است زمان اجرای کمی کندتری داشته باشد. در مقابل، V8 اولویت را به اجرای سریع‌تر با بهینه‌سازی‌های بیشتر در زمان اجرا می‌دهد، اگرچه این ممکن است منجر به استفاده بیشتر از حافظه شود.

این تفاوت باعث شده که Bun تا ۴ برابر سریع‌تر از Node.js شروع به کار کند.

bun دو برابر سریع تر از deno و 4 برابر سریع تر از node است

ترنسپایلر (Transpiler)

Node.js از فایل‌های تایپ‌اسکریپت به‌صورت بومی پشتیبانی نمی‌کند. برای اجرای تایپ‌اسکریپت در محیط Node.js، به ابزارهای خارجی نیاز دارید. یکی از روش‌های رایج این است که ابتدا تایپ‌اسکریپت را به جاوااسکریپت تبدیل (ترنسپایل) کنید و سپس کد جاوااسکریپت حاصل را اجرا کنید.

در Node.js:

  1. نصب ابزارها:
npm install -D typescript ts-node
  1. تنظیم اسکریپت در package.json:
{
  "scripts": {
    "start": "ts-node ./path/to/your/file.ts"
  }
}

اجرا:

npm start

در Bun:
Bun یک ترنسپایلر جاوااسکریپت داخلی دارد که به شما این امکان را می‌دهد فایل‌های .js، .ts، .jsx و .tsx را مستقیماً اجرا کنید، بدون نیاز به هیچ مرحله اضافی:

bun index.ts

این تفاوت سرعت بیشتری هنگام اجرای فایل‌های تایپ‌اسکریپت ایجاد می‌کند، زیرا Node.js به یک مرحله ترنسپایل نیاز دارد.

در این بخش مقاله، به بررسی سازگاری سیستم‌های ماژول CommonJS و ES Modules (ESM) پرداخته شده است. در ادامه ترجمه کامل را ارائه می‌کنم:

Bun takes 8ms, Node esbuild 40ms, tsx 120ms and tsx 350ms

سازگاری ESM و CommonJS

سیستم ماژول به توسعه‌دهندگان اجازه می‌دهد که کد خود را به بخش‌های قابل‌استفاده مجدد سازمان‌دهی کنند. در جاوااسکریپت، دو سیستم اصلی ماژول وجود دارد:

  • CommonJS: این سیستم از Node.js منشأ گرفته است و از require و module.exports برای مدیریت همگام ماژول‌ها استفاده می‌کند. این روش برای عملیات سمت سرور ایده‌آل است.
  • ESM: که در ES6 معرفی شده، از عبارات import و export استفاده می‌کند و رویکردی ایستا و غیرهمگام ارائه می‌دهد که برای مرورگرها و ابزارهای مدرن ساخت بهینه شده است.

برای توضیح بهتر این سیستم‌ها، از دو بسته محبوب colors (برای CommonJS) و chalk (برای ESM) استفاده می‌کنیم که برای افزودن خروجی‌های رنگی به کنسول استفاده می‌شوند.

 

استفاده از CommonJS در Node.js

Node.js به طور سنتی با سیستم ماژول CommonJS شناخته می‌شود. یک نمونه معمول از استفاده به شکل زیر است:

// CommonJS در Node.js (index.js)
const colors = require("colors");
console.log(colors.green('Hello, world!'));

استفاده از ESM در Node.js

برای استفاده از ماژول‌های ES در Node.js، دو راه دارید:

  1. اضافه کردن "type": "module" به فایل package.json.
  2. استفاده از پسوند .mjs.

نمونه‌ای از استفاده:

// ESM در Node.js (index.mjs)
import chalk from 'chalk';
console.log(chalk.blue('Hello, world!'));

چالش‌های انتقال از CommonJS به ESM

انتقال از سیستم CommonJS به ESM فرایند پیچیده‌ای بوده است. از زمان معرفی ESM، تقریباً پنج سال طول کشید تا Node.js بتواند از آن بدون نیاز به پرچم آزمایشی پشتیبانی کند. با این حال، CommonJS همچنان در اکوسیستم جاوااسکریپت غالب است.

 

ساده‌سازی سیستم ماژول توسط Bun

یکی از ویژگی‌های برجسته Bun این است که به صورت هم‌زمان از هر دو سیستم ماژول پشتیبانی می‌کند، بدون نیاز به تنظیمات خاص. نکته شگفت‌انگیز این است که Bun می‌تواند هم import و هم require را در یک فایل به کار ببرد، چیزی که به صورت بومی در Node.js ممکن نیست.

مثال:

import chalk from "chalk";
const colors = require("colors");

console.log(chalk.magenta('Hello from chalk!'));
console.log(colors.cyan('Hello from colors!'));

این ویژگی Bun، کار با ماژول‌های مختلف را آسان‌تر و منعطف‌تر می‌کند، به خصوص در پروژه‌هایی که هنوز نیازمند هر دو سیستم هستند.

Web APIs

Web APIs نقش مهمی در برنامه‌های تحت مرورگر ایفا می‌کنند و ابزارهایی مانند fetch و WebSocket را برای تعامل با وب فراهم می‌کنند. این ابزارها به استانداردهای مرورگر تبدیل شده‌اند، اما پشتیبانی از آنها در محیط‌های سمت سرور مانند Node.js همواره یکسان نبوده است.

وضعیت Web APIs در Node.js

در نسخه‌های اولیه Node.js، API‌های استاندارد وب که به‌طور معمول در مرورگرها در دسترس هستند، به صورت بومی پشتیبانی نمی‌شدند. توسعه‌دهندگان مجبور بودند از پکیج‌های شخص ثالث مانند node-fetch برای شبیه‌سازی این عملکرد استفاده کنند.
اما از نسخه 18 به بعد، Node.js پشتیبانی آزمایشی از API fetch را ارائه داده است، که می‌تواند نیاز به این پکیج‌ها را کاهش دهد.

پشتیبانی کامل Bun از Web APIs

Bun این موضوع را ساده‌تر کرده است، زیرا از ابتدا پشتیبانی داخلی برای API‌های استاندارد وب ارائه می‌دهد. توسعه‌دهندگان می‌توانند به طور مستقیم از ابزارهایی مانند fetch، Request، Response و WebSocket استفاده کنند، بدون اینکه نیازی به پکیج‌های اضافی باشد.
علاوه بر این، پیاده‌سازی بومی Bun از این API‌ها سریع‌تر و قابل‌اعتمادتر از جایگزین‌های شخص ثالث است.

مثال از عملکرد fetch در Node.js و Bun

در مثال زیر، عملکرد fetch در Node.js (نسخه 18 به بالا) به صورت آزمایشی و در Bun به صورت پایدار استفاده شده است:

// استفاده از fetch در Node.js (v18 به بالا) و Bun
async function fetchUserData() {
  const response = await fetch("https://jsonplaceholder.typicode.com/users/1");
  const user = await response.json();
  console.log(user.name);
}

fetchUserData(); // Leanne Graham

Hot Reloading

Hot reloading قابلیتی است که بهره‌وری توسعه‌دهندگان را افزایش می‌دهد. این قابلیت با به‌روزرسانی یا بارگذاری مجدد بخش‌هایی از برنامه در زمان تغییر کد، بدون نیاز به راه‌اندازی مجدد کامل، کار می‌کند.

Hot Reloading در Node.js

در اکوسیستم Node.js، دو گزینه برای این قابلیت وجود دارد:

  1. ابزار محبوب nodemon که فرآیند را به‌طور کامل مجدداً راه‌اندازی می‌کند:

    nodemon index.js
    
  2. از نسخه 18 به بعد، یک پرچم آزمایشی --watch معرفی شده است:

    node --watch index.js
    

هر دو روش تلاش می‌کنند بارگذاری مجدد برنامه را در زمان تغییر کد فراهم کنند، اما رفتارهای متفاوتی دارند:

  • Nodemon ممکن است منجر به اختلالاتی مانند قطع اتصالات HTTP و WebSocket شود.
  • پرچم --watch، با اینکه نویدبخش است، اما همچنان آزمایشی است و مشکلاتی در GitHub گزارش شده است.

Hot Reloading در Bun

Bun این فرآیند را به سطح بالاتری می‌برد. با اجرای Bun همراه با پرچم --hot، قابلیت hot reloading فعال می‌شود:

bun --hot index.ts

برخلاف روش‌های Node.js که ممکن است نیازمند راه‌اندازی مجدد کامل فرآیند باشند، Bun کد را به‌صورت درجا و بدون پایان دادن به فرآیند قدیمی بارگذاری مجدد می‌کند. این روش:

  • اتصالات HTTP و WebSocket را حفظ می‌کند.
  • حالت برنامه را دست‌نخورده نگه می‌دارد.
    این ویژگی تجربه توسعه نرم‌تر و بدون اختلالی را ارائه می‌دهد.

Node.js Compatibility

هنگام انتقال به یک محیط یا زمان اجرای جدید، سازگاری یکی از دغدغه‌های اصلی توسعه‌دهندگان است. Bun این مسئله را با ارائه‌ی خود به‌عنوان یک جایگزین بی‌دردسر برای Node.js حل می‌کند. این یعنی برنامه‌ها و پکیج‌های npm موجود می‌توانند بدون نیاز به تغییر، به‌طور یکپارچه در Bun ادغام شوند.

ویژگی‌های کلیدی سازگاری

  1. پشتیبانی از ماژول‌های داخلی Node.js مانند fs، path و net.
  2. شناسایی متغیرهای سراسری مانند __dirname و process.
  3. پایبندی به الگوریتم حل ماژول Node.js، از جمله ساختار آشنا‌ی node_modules.

Bun همچنان در حال پیشرفت است. این ابزار به‌طور خاص برای بهبود گردش کار توسعه و محیط‌هایی که منابع محدودی دارند (مانند فانکشن‌های بدون سرور) طراحی شده است. تیم توسعه‌دهنده‌ی Bun در تلاش برای سازگاری کامل با Node.js و یکپارچگی بهتر با فریمورک‌های رایج است.

علاوه بر سازگاری با Node.js، Bun با APIهای استاندارد و بهینه‌شده‌ای عرضه می‌شود که نیازهای روزمره‌ی توسعه‌دهندگان را برآورده می‌کند.


API های Bun

Bun.file()

برای بارگذاری فایل‌ها و دسترسی به محتوای آنها در قالب‌های مختلف. این متد تا 10 برابر سریع‌تر از معادل آن در Node.js عمل می‌کند.
مثال:

// Bun (index.ts)
const file = Bun.file("package.json");
await file.text();

// Node.js (index.mjs)
const fs = require("fs/promises");
const fileContents = await fs.readFile("package.json", "utf-8");

Bun.write()

یک API چندمنظوره برای نوشتن داده روی دیسک، از رشته‌ها تا Blobها. سرعت آن تا 3 برابر سریع‌تر از Node.js است.
مثال:

// Bun (index.ts)
await Bun.write("index.html", "<html/>");

// Node.js (index.mjs)
const fs = require("fs/promises");
await fs.writeFile("index.html", "<html/>");

Bun.serve()

راه‌اندازی سرور HTTP یا WebSocket با استفاده از APIهای استاندارد وب. این متد می‌تواند:

  • تا 4 برابر درخواست‌های بیشتری در هر ثانیه نسبت به Node.js مدیریت کند.
  • 5 برابر پیام‌های WebSocket بیشتری را نسبت به پکیج ws در Node.js پشتیبانی کند.
    این قابلیت مشابه استفاده از Express در Node.js است، اما با مزیت‌های عملکردی Bun.

مثال:

// Bun (index.ts)
Bun.serve({
  port: 3000,
  fetch(request) {
    return new Response("Hello from Bun!");
  },
});

// Node.js (index.mjs)
import http from "http";
const server = http.createServer((req, res) => {
  res.writeHead(200, { "Content-Type": "text/plain" });
  res.end("Hello from Node.js!");
});
server.listen(3000);

پشتیبانی از SQLite و Password

Bun به صورت داخلی از sqlite و password پشتیبانی می‌کند و این باعث می‌شود نیازی به کتابخانه‌های اضافی نباشد.


Bun در برابر Node.js: مدیر بسته‌ها

Bun تنها یک زمان اجرا نیست؛ بلکه یک ابزار پیشرفته است که شامل یک مدیر بسته سریع و قدرتمند می‌شود. اگر تجربه‌ی انتظار طولانی در نصب وابستگی‌ها را دارید، Bun جایگزینی سریع و کارآمد ارائه می‌دهد.

حتی اگر از Bun به‌عنوان زمان اجرا استفاده نکنید، مدیر بسته‌ی داخلی آن می‌تواند گردش کار توسعه‌ی شما را بهبود بخشد.

Bun takes 0.36s, pnpm 6.44s, npm 10.58s and yarn 12.08s

مقایسه‌ی دستورات Bun و npm:

عملیاتBunnpm
نصب بستهbun installnpm install
اضافه کردن بستهbun addnpm install
حذف بستهbun removenpm uninstall
اجرای اسکریپتbun run <script>npm run <script>
ارتقا بسته‌هاbun upgradeندارد

Bun نصب وابستگی‌ها را با سرعت بالاتری انجام می‌دهد و زمان انتظار توسعه‌دهنده‌ها را کاهش می‌دهد.

در نگاه اول، دستورات Bun ممکن است آشنا به نظر برسند، اما تجربه‌ای که ارائه می‌دهد کاملاً متفاوت است. Bun سرعت‌های نصب خارق‌العاده‌ای ارائه می‌دهد که چندین برابر سریع‌تر از npm است.

علل سرعت بالای Bun در نصب وابستگی‌ها

  1. حافظه کش ماژول جهانی: Bun دانلودهای تکراری از رجیستری npm را حذف می‌کند.
  2. فراخوان‌های سیستمی سریع: Bun از سریع‌ترین فراخوان‌های سیستمی موجود برای هر سیستم‌عامل استفاده می‌کند.

مقایسه سرعت نصب وابستگی‌ها برای پروژه Remix Starter از کش:

  • Bun: 0.36 ثانیه
  • pnpm: 6.44 ثانیه
  • npm: 10.58 ثانیه
  • yarn: 12.08 ثانیه

علاوه بر این، اجرای دستورات با Bun نیز بسیار سریع‌تر است:

  • bun run <command> تنها 7ms زمان می‌برد، در حالی که اجرای همین دستور با npm حدود 176ms طول می‌کشد.

در حالی که npm سال‌ها استاندارد مدیریت بسته‌های جاوااسکریپت بوده است، Bun با عملکرد خیره‌کننده‌اش جایگزینی بسیار قوی و جذاب ارائه می‌دهد.

Bun به عنوان Bundler

Bundling فرایندی است که طی آن چندین فایل جاوااسکریپت ترکیب و به یک یا چند باندل بهینه تبدیل می‌شوند. این فرایند شامل تبدیل TypeScript به JavaScript و کوچک‌سازی کد برای کاهش حجم نیز می‌شود.

وضعیت در اکوسیستم Node.js:

در Node.js، bundling به طور معمول توسط ابزارهای شخص ثالث مانند Webpack، Rollup و Parcel انجام می‌شود. این ابزارها ویژگی‌هایی مثل Code Splitting، Tree Shaking و Hot Module Replacement را ارائه می‌دهند.

ویژگی‌های Bundler داخلی Bun:

Bun نه تنها یک زمان اجرا و مدیر بسته است، بلکه به عنوان یک bundler نیز عمل می‌کند. این ابزار برای باندل کردن کد جاوااسکریپت و TypeScript برای پلتفرم‌های مختلف طراحی شده است، از جمله:

  • برنامه‌های سمت کلاینت در مرورگر (مانند React یا Next.js)
  • اپلیکیشن‌های Node.js

مثال: برای باندل کردن یک فایل TypeScript:

bun build ./index.ts --outdir ./build

این دستور فایل index.ts را باندل کرده و خروجی را در پوشه‌ی ./build قرار می‌دهد.

Bun takes 0.17s, esbuild 0.3s, rspack 4.45s, Parcel 2 26.32s, Rollup 32s and Webpack 5 38.02s

مقایسه سرعت Bun با دیگر bundlerها:

  • Bun: 0.17 ثانیه
  • esbuild: 0.3 ثانیه
  • rspack: 4.45 ثانیه
  • Parcel 2: 26.32 ثانیه
  • Rollup: 32 ثانیه
  • Webpack 5: 38.02 ثانیه

Bun با سرعتی 1.75 برابر سریع‌تر از esbuild و به‌مراتب سریع‌تر از دیگر bundlerها عمل می‌کند.


ماکروهای جاوااسکریپت در Bun

یکی از ویژگی‌های برجسته در Bun معرفی ماکروهای جاوااسکریپت است. این قابلیت امکان اجرای توابع جاوااسکریپت در زمان باندل کردن را فراهم می‌کند و نتایج به صورت مستقیم در خروجی نهایی درج می‌شود.

مثال ماکرو در Bun:

به جای فراخوانی API در زمان اجرا، Bun می‌تواند داده‌ها را در زمان باندل‌کردن دریافت و در خروجی نهایی جای‌گذاری کند.
کد اصلی:

// users.ts
export async function getUsername() {
  const response = await fetch("https://jsonplaceholder.typicode.com/users/1");
  const user = await response.json();
  return user.name;
}

// index.ts
import { getUsername } from "./users.ts" with { type: "macro" };
const username = await getUsername();
console.log(username);

خروجی باندل‌شده:

var user = await "Leanne Graham";
console.log(user);

Bun در مقابل Node.js: اجرای تست‌ها

تست‌نویسی یکی از جنبه‌های حیاتی توسعه نرم‌افزار است که تضمین می‌کند کد همان‌طور که انتظار می‌رود عمل می‌کند و مشکلات احتمالی را پیش از رسیدن به تولید شناسایی می‌کند. Bun علاوه بر اینکه یک زمان اجرا، مدیر بسته و bundler است، به عنوان یک test runner نیز عمل می‌کند.


ویژگی‌های Test Runner داخلی Bun

۱. سازگاری با Jest

Test Runner داخلی Bun با نام bun:test طراحی شده است تا به طور کامل با Jest سازگار باشد. Jest یکی از فریم‌ورک‌های تست محبوب با API‌های سبک "expect" است. این سازگاری به توسعه‌دهندگانی که از Jest استفاده کرده‌اند اجازه می‌دهد تا بدون نیاز به یادگیری ابزار جدیدی به راحتی به Bun مهاجرت کنند.

نمونه کد تست ساده:

import { test, expect } from "bun:test";

test("2 + 2", () => {
  expect(2 + 2).toBe(4);
});

اجرای تست‌ها با دستور bun test به سادگی انجام می‌شود. همچنین، Bun از TypeScript و JSX به صورت پیش‌فرض پشتیبانی می‌کند و نیاز به تنظیمات یا پلاگین‌های اضافی را برطرف می‌کند.


۲. مهاجرت از Jest یا Vitest به Bun

تعهد Bun به سازگاری با Jest و Vitest در این واقعیت منعکس می‌شود که وارد کردن تست‌ها از @jest/globals یا Vitest به طور داخلی به bun:test بازنویسی می‌شود. این بدان معناست که تست‌های موجود می‌توانند بدون نیاز به هیچ تغییری روی Bun اجرا شوند.

نمونه کد تست موجود:

// index.test.ts
import { test } from "@jest/globals";

describe("test suite", () => {
  test("addition", () => {
    expect(1 + 1).toBe(2);
  });
});

۳. عملکرد و سرعت اجرای تست‌ها

Test Runner در Bun نه تنها از نظر سازگاری، بلکه از نظر سرعت نیز عملکرد چشمگیری دارد.

مقایسه سرعت Bun با Jest و Vitest:

  • Bun: 13 برابر سریع‌تر از Jest و 8 برابر سریع‌تر از Vitest در اجرای تست‌های پروژه Zod.
  • Matchers سریع‌تر: Matcherهایی مانند expect().toEqual() در Bun، 100 برابر سریع‌تر از Jest و 10 برابر سریع‌تر از Vitest عمل می‌کنند.

این سرعت بالا به دلیل اجرای Matchers در کد نیتیو سریع است، که تجربه توسعه‌دهندگان را به شدت بهبود می‌بخشد.


۴. شروع پروژه‌های جدید یا مهاجرت تست‌های موجود

چه در حال شروع یک پروژه جدید باشید و چه به دنبال مهاجرت تست‌های موجود، Bun محیط تستی قابل‌اعتماد و سریع ارائه می‌دهد که نیازهای توسعه مدرن را برآورده می‌کند.


نتیجه‌گیری: Bun در مقابل Node.js

Node.js سال‌ها به عنوان یک پایه اصلی در دنیای جاوااسکریپت عمل کرده است و استانداردهایی را برای توسعه‌دهندگان تعیین کرده است. با این حال، Bun به عنوان یک رقیب قابل‌توجه وارد صحنه شده و مرزها را جابه‌جا کرده است.

چرا باید Bun را امتحان کنید؟

  • سرعت فوق‌العاده در مدیریت بسته‌ها، Bundling و اجرای تست‌ها.
  • سازگاری با ابزارهای موجود مانند Jest و Vitest.
  • عملکرد بهینه برای توسعه‌دهندگان با پشتیبانی پیش‌فرض از TypeScript و JSX.

در حالی که Bun هنوز در حال تکامل است و در برخی زمینه‌ها مانند پشتیبانی از Windows نیاز به پیشرفت دارد، آنچه ارائه می‌دهد، توجه بسیاری از توسعه‌دهندگان را جلب کرده است. اگر به دنبال افزایش بهره‌وری و بهبود سرعت در توسعه پروژه‌های جاوااسکریپت هستید، Bun ابزاری است که باید حتماً آن را بررسی کنید.

 

منبع بیلدر

 

۴۸
۱۴۰۳/۱۱/۷