معرفی کامل Bun - سه برار سریع تر از NodeJS

Bun - Fast JavaScript Runtime
Bun - Fast JavaScript Runtime

پی نوشت: الان که این متن رو دارم مینویسم تقریبا ۲ روز از انتشار نسخه آزمایشی Bun میگذره. بعد از ساعات اولیه انتشار، خیلی سریع شروع به ترند شدن کرده و بخاطر سرعت و پرفورمنس عجیبی که داره خیلی تو کامیونیتی برنامه نویسای جاواسکریپت معروف/محبوب شده!

معرفی Bun خیلی کوتاه و مختصر

بان (Bun) یه Runtime مدرن برای زبان جاواسکریپت محسوب میشه که سرعت و پرفورمنس خیلی بیشتری نسبت به NodeJS و Deno داره و ادعا میکنه ۳ برابر از اونها سریع تره! با زبان سطح پایین Ziglang نوشته شده و مدیریت حافظه توی سطح پایین رو به خوبی انجام داده. همچنین برخلاف نود و دینو بجای V8 از engine قدرتمند JavaScriptCore (JSC) استفاده میکنه که کمپانی بزرگ Apple اون رو توسعه میده. تقریبا برعکس Deno توی این Runtime میشه پکیج های NPM رو نصب و استفاده کنیم. یه قابلیت عجیب دیگه ای ام داره که امکان اجرای ماژول های native نود مثل fs یا path رو به ما میده و از TypeScript و JSX هم built-in پشتیبانی میکنه ( یه Transpiler داخلی خیلی قدرتمند داره‌ ). و یه Bundler قوی و سریع ام داره که توی ادامه بیشتر با این تکنولوژی نوظهور آشنا میشیم. ( این تیکه واسه تنبلا بود... )

بررسی عملکرد عمیق Bun

این Runtime سریع و قدرتمند روی ۳ اصل مهم و اساسی تمرکز کرده:

  • ابعاد جدیدی از پرفورمنس و سرعت بالاتر به کمک موتور JavaScriptCore
  • توسعه ابزار های قدرتمند مثل Transpiler و Bundler ها و پکیج منیجر
  • سرعت بخشیدن به فرایند توسعه

برای ساخت NodeJS از زبان ++C و برای Deno از زبان Rust استفاده شده ولی Bun با تفاوت خیلی زیادی از زبان سطح پایین و قدرتمند Ziglang که رقیب مهم C به حساب میاد کمک گرفته. توی این زبان مدیریت حافظه به صورت دستی انجام میشه، جالبه بدونید که از سال ۲۰۱۶ درحال توسعه ست و هنوز ورژن پایداری از این زبان منتشر نشده، اما توی دنیای برنامه نویسی ازش استفاده میشه و کامیونیتی خوبی داره.

موتور یا Engine این Runtime برخلاف نود و دینو V8 نیست! و از JSC یا JavaScriptCore استفاده کردن که نسبت به V8 عملکرد بهتری داره، کمپانی Apple توسعه اش میده و همچنین Engine مرورگر Saffari ام هست! به گفته سازنده Bun اکثر قسمت ها از صفر نوشته شده و مستقیما بدون هیچ پکیج خارجی میتونیم فایل های ts و jsx رو اجرا کنیم و سرعت خیلی بالایی رو توی فرایند توسعه ببینیم.

آقای Jarred Sumner توسعه دهنده اصلی Bun توی توییتر اعلام کرده که پکیج منیجر این Runtime برای نصب Next.js نسبت به npm حدود ۴۰ برابر سریع تر کار میکنه و نسبت به yarn هم ۲۰ برابر سرعت بیشتری داره! توی ۱ ثانیه میتونه یک میلیون خط جاواسکریپت رو bundler داخلی خودش باندل کنه. ( لینک توییت )

تعدادی از ویژگی های مهم این Runtime :

  • سرعت و پرفورمنس خیلی بالا - ۳ برابر سریع تر از NodeJS و Deno
  • پکیج منیجر قدرتمند و پرسرعت بصورت built-in و امکان دانلود و استفاده از پکیج های npm
  • قابلیت اجرایی ماژول های native نود مثل fs و os توسط Runtime
  • دارای Transpiler قدرتمند برای TypeScript و JSX بصورت built-in
  • دارای تابع های قدرتمند و سریع سیستمی
  • دسترسی به متغیر های .env بدون پکیج خارجی مثل dotenv
  • دارای SQLite Client قدرتمند و ۳ برابر سریع تر نسبت به Deno و NodeJS بصورت built-in
  • دارای Bundler قدرتمند بصورت built-in و حذف سرطانی به نام Webpack
  • دارای قابلیت هایی مثل Fetch و WebSocket و ReadableStream بصورت built-in


مقایسه پرفورمنس Bun رو Linux و macOS
مقایسه پرفورمنس Bun رو Linux و macOS


جالب تر از همه اینه که روی سیستم عامل macOS نسبت به Linux بهتر کار میکنه!
[ فک میکنم بخاطر JavaScriptCore باشه، چون خود Apple توسعه داده با macOS سازگاری بهتری داره ]

اجرای عملیات cat سریع تر از linux
اجرای عملیات cat سریع تر از linux


حتی توی داکیومنت ادعا کرده که با Bun میشه عملیات cat رو ۲ برابر سریع تر از دستور cat لینوکس انجام داد!
و همینطور جا داره بگم که توی تصویر بالا ماژول path از NodeJS ایمپورت شده و براحتی توی Bun اجرا میشه.

آقای Jarred Sumner میگه که سرعت بالای Bun رو مدیون وقت زیادی که روی پروفایلینگ، بنچمارکینگ و بهینه سازی که گذاشتم بدونید. عوامل زیاد دیگه ای هم توی این پرفورمنس تاثیر داشن اما مهم ترین اون ها مدیریت دستی حافظه و hidden control flow توسط زبان Ziglang بوده.

ما توی بنچمارک های زیر خیلی راحت میتونیم سرعت و پرفورمنس بالای Bun رو درک کنیم.

۱. بنچمارک ساخت پروژه React

مقایسه Bun با NPM برای ساخت پروژه React
مقایسه Bun با NPM برای ساخت پروژه React

۲. بنچمارک ساخت پروژه Next.js

مقایسه Bun با NPM برای ساخت پروژه Next
مقایسه Bun با NPM برای ساخت پروژه Next

۳. مقایسه با Babel توی Transpile کردن کد های React

مقایسه سرعت Babel و Bun توی transpile کد های react
مقایسه سرعت Babel و Bun توی transpile کد های react

۴. بنچمارک نصب پکیج با npm

مقایسه سرعت npm و Bun توی نصب پکیج ها
مقایسه سرعت npm و Bun توی نصب پکیج ها

۵. مقایسه با سرعت وحشتناک Vite

مقایسه سرعت vite و Bun توی سرور توسعه
مقایسه سرعت vite و Bun توی سرور توسعه

نصب و اجرای سلام دنیا

نصب این Runtime خیلی ساده ست، دستور زیر روی توی ترمینال کپی/پیست کنید:

curl https://bun.sh/install | bash

صبر کنید تا نصب بشه و بعد دستوراتی که به شما میگه رو بزنید( این مرحله خیلی مهمه! )
با دستور زیر هم نصب بودنش رو چک کنید:

bun help

یه فایل با نام index.js بسازید و کد های زیر رو بنویسید:

const msg = &quotHello World - Bun&quot
console.log(msg);

و بعد با دستور bun run index.js میتونید کد ها رو براحتی اجرا کنید و خروجی رو ببینید!
برای TypeScript و JSX هم همینقدر فرایند ساده ای دارید:

// bun run index.ts
const msg: string = &quotHello World - TS- Bun&quot
console.log(msg);

// bun run index.jsx
const name = &quotJSX - Bun&quot
console.log(<div>{name}</div>)

اگه توی اجرای فایل های JSX به ارور خوردید با دستور bun add react باید react رو نصب کنید
و همچنین برای نصب پکیج از npm دستور ساده زیر رو داریم:

bun install lodash

و برای حذف پکیجی که نصب کردیم میتونیم از bun remove lodash استفاده کنیم.

ساخت http سرور با کمک بان خیلی آسونه، کد های زیر رو توی فایل http.js بنویسید:

// http.js
export default {
  port: 3000,
  fetch(request) {
    return new Response(&quotWelcome to Bun!&quot);
  },
};

با دستور bun run http.js سرور رو استارت کنید و توی مرورگر آدرس localhost:3000 رو هم بالا بیارید.
تبریک میگم، خوش اومدی به بان!

نتیجه گیری و نظر شخصی

همونطور که اول متن نوشتم، الان ( ۱۷ تیر ۱۴۰۱‌ ) فقط ۲ روز از انتشار نسخه آزمایشی این Runtime میگذره! کل توییتر و برنامه نویسای جاواسکریپت داره تازه اون رو بررسی میکنه و هنوز این تکنولوژی هیچ کامیونیتی و داکیومنتی کاملی براش درست نشده. بنظرم Bun پتانسیل خیلی بیشتری نسبت به Deno داره ولی هنوز باید صبر کنیم تا نسخه پایدار اون منتشر بشه تا بتونیم بیشتر تحلیل کنیم.
ودر آخر بگم حتی اگه بتونه NodeJS رو کنار بزنه باید مسیر خیلی طولانی و زمان زیادی رو طی کنه تا این اتفاق بیوفته پس اصلا ذهنتون رو درگیر این مسئله نکنید :)
درضمن این اولین مقاله فارسی درباره Bun محسوب میشه ( پز اینو حتما باید میدادم XD )

باهمدیگه میتونیم چیزای زیادی یاد بگیریم منو توی شبکه های اجتماعی دنبال کن!

the-pesar.github.io

۱۶/۱۷ تیر ۱۴۰۱ - ساعت ۱۴:۴۰