دليل Bun 2.0 الشامل: بيئة تشغيل JavaScript الكل-في-واحد لعام 2026

AI Bot
بواسطة AI Bot ·

جاري تحميل مشغل تحويل النص إلى كلام الصوتي...

ملف تنفيذي واحد يحكمهم جميعاً. Bun 2.0 ليس مجرد بيئة تشغيل JavaScript أخرى — بل هو مجموعة أدوات كاملة تحل محل Node.js وnpm وwebpack وJest بملف تنفيذي واحد فائق السرعة مكتوب بلغة Zig. في هذا الدليل التطبيقي، ستستكشف كل ميزة رئيسية في Bun وتبني واجهة REST API جاهزة للإنتاج من الصفر.

ما ستتعلمه

بنهاية هذا الدليل، ستتمكن من:

  • تثبيت وتكوين Bun 2.0 كبيئة تشغيل JavaScript الأساسية لديك
  • استخدام مدير حزم Bun لتثبيت الاعتماديات أسرع من npm وyarn وpnpm
  • الاستفادة من دعم TypeScript وJSX المدمج بدون أي تكوين
  • بناء المشاريع وتحسينها باستخدام مُجمّع Bun
  • كتابة وتشغيل الاختبارات باستخدام مُشغّل اختبارات Bun المدمج
  • استخدام واجهات Bun البرمجية — إدخال/إخراج الملفات، خادم HTTP، SQLite، WebSocket، والمزيد
  • بناء واجهة REST API كاملة باستخدام خادم HTTP الأصلي في Bun
  • نشر تطبيق Bun في بيئة الإنتاج

المتطلبات الأساسية

قبل البدء، تأكد من توفر:

  • معرفة أساسية بـ JavaScript/TypeScript (الدوال، async/await، الوحدات)
  • إلمام بـ سطر الأوامر (تشغيل الأوامر، التنقل بين المجلدات)
  • نظام macOS أو Linux أو WSL (يدعم Bun الثلاثة)
  • محرر أكواد — VS Code أو Cursor مُوصى بهما

لماذا Bun؟

تطلب نظام JavaScript البيئي تقليدياً أدوات متعددة لمهام مختلفة: Node.js لتشغيل الكود، npm للحزم، webpack أو esbuild للتجميع، وJest أو Vitest للاختبار. يدمج Bun كل هذا في ملف تنفيذي واحد:

الميزةالمجموعة التقليديةBun
بيئة التشغيلNode.jsBun
مدير الحزمnpm / yarn / pnpmbun install
المُجمّعwebpack / esbuild / Rollupbun build
مُشغّل الاختباراتJest / Vitestbun test
TypeScripttsc + ts-nodeدعم أصلي
تحميل .envحزمة dotenvمدمج

يحقق Bun هذه السرعة من خلال نواته المكتوبة بلغة Zig، ومحرك JavaScriptCore (من Safari)، وتحسينات مكثفة على مستوى النظام. تثبيت الحزم الذي يستغرق 30 ثانية مع npm ينتهي في أقل من ثانيتين مع Bun.


الخطوة 1: تثبيت Bun

ثبّت Bun بأمر واحد:

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

على macOS، يمكنك أيضاً استخدام Homebrew:

brew install oven-sh/bun/bun

تحقق من التثبيت:

bun --version
# 2.x.x

يُثبَّت Bun في ~/.bun/bin/bun ويُضيف نفسه تلقائياً إلى PATH.

تحديث Bun

حافظ على تحديث Bun:

bun upgrade

الخطوة 2: مشروعك الأول مع Bun

أنشئ مشروعاً جديداً باستخدام bun init:

mkdir bun-demo && cd bun-demo
bun init

ينتج هذا هيكل مشروع بسيط:

bun-demo/
├── index.ts
├── package.json
├── tsconfig.json
└── README.md

لاحظ أن Bun يستخدم TypeScript افتراضياً — بدون أي تكوين إضافي. شغّل الملف:

bun run index.ts
# Hello via Bun!

لا توجد خطوة ترجمة. يحوّل Bun TypeScript مباشرة بحمل قريب من الصفر.


الخطوة 3: Bun كمدير حزم

مدير حزم Bun هو بديل مباشر لـ npm وyarn وpnpm. يقرأ نفس package.json ويُنشئ مجلد node_modules متوافق.

تثبيت الاعتماديات

# تثبيت جميع الاعتماديات من package.json
bun install
 
# إضافة اعتمادية
bun add zod
 
# إضافة اعتمادية تطوير
bun add -d @types/node
 
# إزالة اعتمادية
bun remove zod

مقارنة السرعة

يستخدم Bun ذاكرة تخزين مؤقت عامة للوحدات وروابط صلبة بدلاً من نسخ الملفات. تثبيت bun install النموذجي لمشروع Next.js يكتمل في أقل من ثانيتين، مقارنة بـ 15-30 ثانية مع npm.

ملف القفل

يُنشئ Bun ملف قفل ثنائي يسمى bun.lockb. وهو حتمي وأسرع بكثير في التحليل من package-lock.json. إذا كنت بحاجة لملف قفل نصي لمراجعة الكود:

bun install --yarn
# يُنشئ yarn.lock بجانب bun.lockb

مساحات العمل

يدعم Bun مساحات عمل npm أصلياً:

{
  "name": "monorepo",
  "workspaces": ["packages/*", "apps/*"]
}
# تثبيت جميع اعتماديات مساحات العمل
bun install
 
# تشغيل سكربت في مساحة عمل محددة
bun run --filter @myorg/api start

الخطوة 4: دعم TypeScript وJSX المدمج

يُنفّذ Bun ملفات .ts و.tsx و.js و.jsx مباشرة بدون أي خطوة بناء أو تكوين. يتعامل المُحوّل المدمج مع:

  • TypeScript مع دعم كامل لبناء الأنواع
  • تحويل JSX/TSX
  • المُزخرفات (Decorators) — TC39 والكلاسيكية
  • Top-level await
  • التوافق بين ES modules وCommonJS

أنشئ ملف types-demo.ts:

interface User {
  id: number;
  name: string;
  email: string;
}
 
function greet(user: User): string {
  return `Hello, ${user.name}! Your email is ${user.email}.`;
}
 
const user: User = {
  id: 1,
  name: "أحمد",
  email: "ahmed@example.com",
};
 
console.log(greet(user));

شغّله مباشرة:

bun run types-demo.ts
# Hello, أحمد! Your email is ahmed@example.com.

لا tsc، لا ts-node، لا tsx — فقط Bun.


الخطوة 5: واجهات Bun البرمجية — المكتبة القياسية المدمجة

يوفر Bun مجموعة غنية من الواجهات البرمجية المدمجة التي تحل محل حزم npm الشائعة.

5.1: إدخال/إخراج الملفات مع Bun.file()

// كتابة ملف
await Bun.write("output.txt", "Hello from Bun!");
 
// قراءة ملف
const file = Bun.file("output.txt");
const text = await file.text();
console.log(text); // "Hello from Bun!"
 
// الحصول على بيانات الملف الوصفية
console.log(file.size);  // بالبايت
console.log(file.type);  // نوع MIME

Bun.file() كسول — لا يقرأ الملف حتى تستدعي .text() أو .json() أو .arrayBuffer() أو .stream().

5.2: متغيرات البيئة

يُحمّل Bun ملفات .env تلقائياً بدون أي حزمة:

# .env
DATABASE_URL=postgres://localhost:5432/mydb
API_KEY=secret123
// الوصول مباشرة — لا حاجة لاستيراد dotenv
console.log(Bun.env.DATABASE_URL);
console.log(Bun.env.API_KEY);

5.3: تجزئة كلمات المرور

// تجزئة كلمة مرور (bcrypt تحت الغطاء)
const hash = await Bun.password.hash("my-secure-password");
 
// التحقق من كلمة مرور
const isValid = await Bun.password.verify("my-secure-password", hash);
console.log(isValid); // true

5.4: SQLite المدمج

يأتي Bun مع برنامج تشغيل SQLite أصلي — بدون حاجة لحزمة npm:

import { Database } from "bun:sqlite";
 
const db = new Database("myapp.db");
 
// إنشاء جدول
db.run(`
  CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    email TEXT UNIQUE NOT NULL,
    created_at TEXT DEFAULT (datetime('now'))
  )
`);
 
// إدخال بيانات
const insert = db.prepare("INSERT INTO users (name, email) VALUES (?, ?)");
insert.run("أحمد", "ahmed@example.com");
insert.run("سارة", "sara@example.com");
 
// استعلام البيانات
const users = db.query("SELECT * FROM users").all();
console.log(users);

5.5: التجزئة والتشفير

// تجزئة سريعة
const hash = Bun.hash("hello world");
console.log(hash);
 
// تجزئة تشفيرية
const hasher = new Bun.CryptoHasher("sha256");
hasher.update("hello world");
console.log(hasher.digest("hex"));

الخطوة 6: بناء خادم HTTP

خادم HTTP الأصلي في Bun هو أحد أبرز ميزاته — يتعامل مع مئات الآلاف من الطلبات في الثانية.

خادم أساسي

// server.ts
Bun.serve({
  port: 3000,
  fetch(req) {
    return new Response("Hello from Bun!");
  },
});
 
console.log("Server running at http://localhost:3000");
bun run server.ts

يستخدم معالج fetch كائنات Request وResponse القياسية من Web API، مما يجعل كودك قابلاً للنقل بين Bun وDeno وCloudflare Workers.

التوجيه

ابنِ موجّهاً بسيطاً باستخدام مطابقة أنماط URL:

// router.ts
Bun.serve({
  port: 3000,
  fetch(req) {
    const url = new URL(req.url);
 
    if (url.pathname === "/" && req.method === "GET") {
      return Response.json({ message: "Welcome to the API" });
    }
 
    if (url.pathname === "/health" && req.method === "GET") {
      return Response.json({ status: "ok", uptime: process.uptime() });
    }
 
    return new Response("Not Found", { status: 404 });
  },
});

معالجة أجسام JSON

Bun.serve({
  port: 3000,
  async fetch(req) {
    if (req.method === "POST" && new URL(req.url).pathname === "/users") {
      const body = await req.json();
      // معالجة الجسم...
      return Response.json(
        { message: "User created", user: body },
        { status: 201 }
      );
    }
    return new Response("Not Found", { status: 404 });
  },
});

الخطوة 7: بناء واجهة REST API كاملة

لندمج كل شيء في واجهة REST API بجودة إنتاجية — مدير مهام مع تخزين SQLite.

هيكل المشروع

bun-tasks-api/
├── src/
│   ├── index.ts          # نقطة الدخول
│   ├── router.ts         # معالج التوجيه
│   ├── db.ts             # إعداد قاعدة البيانات
│   ├── handlers/
│   │   └── tasks.ts      # معالجات CRUD للمهام
│   └── types.ts          # تعريفات الأنواع
├── tests/
│   └── tasks.test.ts     # اختبارات API
├── package.json
└── tsconfig.json

تهيئة المشروع

mkdir bun-tasks-api && cd bun-tasks-api
bun init
mkdir -p src/handlers tests

7.1: تعريفات الأنواع

// src/types.ts
export interface Task {
  id: number;
  title: string;
  description: string | null;
  completed: boolean;
  created_at: string;
  updated_at: string;
}
 
export interface CreateTaskInput {
  title: string;
  description?: string;
}
 
export interface UpdateTaskInput {
  title?: string;
  description?: string;
  completed?: boolean;
}

7.2: طبقة قاعدة البيانات

// src/db.ts
import { Database } from "bun:sqlite";
 
const db = new Database("tasks.db");
 
// تفعيل وضع WAL لأداء أفضل في التزامن
db.run("PRAGMA journal_mode = WAL");
 
// إنشاء الجداول
db.run(`
  CREATE TABLE IF NOT EXISTS tasks (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    title TEXT NOT NULL,
    description TEXT,
    completed INTEGER DEFAULT 0,
    created_at TEXT DEFAULT (datetime('now')),
    updated_at TEXT DEFAULT (datetime('now'))
  )
`);
 
export default db;

7.3: معالجات المهام

// src/handlers/tasks.ts
import db from "../db";
import type { CreateTaskInput, UpdateTaskInput, Task } from "../types";
 
export function getAllTasks(): Task[] {
  return db.query("SELECT * FROM tasks ORDER BY created_at DESC").all() as Task[];
}
 
export function getTaskById(id: number): Task | null {
  return db.query("SELECT * FROM tasks WHERE id = ?").get(id) as Task | null;
}
 
export function createTask(input: CreateTaskInput): Task {
  const stmt = db.prepare(
    "INSERT INTO tasks (title, description) VALUES (?, ?) RETURNING *"
  );
  return stmt.get(input.title, input.description ?? null) as Task;
}
 
export function updateTask(id: number, input: UpdateTaskInput): Task | null {
  const existing = getTaskById(id);
  if (!existing) return null;
 
  const title = input.title ?? existing.title;
  const description = input.description ?? existing.description;
  const completed = input.completed !== undefined
    ? (input.completed ? 1 : 0)
    : existing.completed;
 
  const stmt = db.prepare(`
    UPDATE tasks 
    SET title = ?, description = ?, completed = ?, updated_at = datetime('now')
    WHERE id = ?
    RETURNING *
  `);
  return stmt.get(title, description, completed, id) as Task;
}
 
export function deleteTask(id: number): boolean {
  const result = db.run("DELETE FROM tasks WHERE id = ?", [id]);
  return result.changes > 0;
}

7.4: الموجّه

// src/router.ts
import {
  getAllTasks,
  getTaskById,
  createTask,
  updateTask,
  deleteTask,
} from "./handlers/tasks";
 
export async function handleRequest(req: Request): Promise<Response> {
  const url = new URL(req.url);
  const path = url.pathname;
  const method = req.method;
 
  // رؤوس CORS
  const headers = {
    "Access-Control-Allow-Origin": "*",
    "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
    "Access-Control-Allow-Headers": "Content-Type",
  };
 
  if (method === "OPTIONS") {
    return new Response(null, { status: 204, headers });
  }
 
  // GET /api/tasks
  if (path === "/api/tasks" && method === "GET") {
    const tasks = getAllTasks();
    return Response.json({ data: tasks }, { headers });
  }
 
  // GET /api/tasks/:id
  const taskMatch = path.match(/^\/api\/tasks\/(\d+)$/);
  if (taskMatch && method === "GET") {
    const task = getTaskById(Number(taskMatch[1]));
    if (!task) {
      return Response.json(
        { error: "Task not found" },
        { status: 404, headers }
      );
    }
    return Response.json({ data: task }, { headers });
  }
 
  // POST /api/tasks
  if (path === "/api/tasks" && method === "POST") {
    const body = await req.json();
    if (!body.title || typeof body.title !== "string") {
      return Response.json(
        { error: "Title is required" },
        { status: 400, headers }
      );
    }
    const task = createTask(body);
    return Response.json({ data: task }, { status: 201, headers });
  }
 
  // PUT /api/tasks/:id
  if (taskMatch && method === "PUT") {
    const body = await req.json();
    const task = updateTask(Number(taskMatch[1]), body);
    if (!task) {
      return Response.json(
        { error: "Task not found" },
        { status: 404, headers }
      );
    }
    return Response.json({ data: task }, { headers });
  }
 
  // DELETE /api/tasks/:id
  if (taskMatch && method === "DELETE") {
    const deleted = deleteTask(Number(taskMatch[1]));
    if (!deleted) {
      return Response.json(
        { error: "Task not found" },
        { status: 404, headers }
      );
    }
    return Response.json({ message: "Task deleted" }, { headers });
  }
 
  return Response.json({ error: "Not Found" }, { status: 404, headers });
}

7.5: نقطة الدخول

// src/index.ts
import { handleRequest } from "./router";
 
const server = Bun.serve({
  port: Bun.env.PORT ? Number(Bun.env.PORT) : 3000,
  fetch: handleRequest,
});
 
console.log(`Tasks API running at http://localhost:${server.port}`);

تشغيل الواجهة البرمجية

bun run src/index.ts

اختبر باستخدام curl:

# إنشاء مهمة
curl -X POST http://localhost:3000/api/tasks \
  -H "Content-Type: application/json" \
  -d '{"title": "تعلّم Bun", "description": "إكمال دليل Bun التطبيقي"}'
 
# عرض جميع المهام
curl http://localhost:3000/api/tasks
 
# تحديث مهمة
curl -X PUT http://localhost:3000/api/tasks/1 \
  -H "Content-Type: application/json" \
  -d '{"completed": true}'
 
# حذف مهمة
curl -X DELETE http://localhost:3000/api/tasks/1

الخطوة 8: مُشغّل اختبارات Bun

يتضمن Bun مُشغّل اختبارات متوافق مع Jest مع تأكيدات مدمجة.

كتابة الاختبارات

// tests/tasks.test.ts
import { describe, it, expect, beforeAll, afterAll } from "bun:test";
 
const BASE_URL = "http://localhost:3000";
let createdTaskId: number;
 
beforeAll(async () => {
  // بدء الخادم للاختبار
  const module = await import("../src/index");
});
 
describe("Tasks API", () => {
  it("should create a task", async () => {
    const res = await fetch(`${BASE_URL}/api/tasks`, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({
        title: "Test Task",
        description: "A test task",
      }),
    });
    expect(res.status).toBe(201);
    const json = await res.json();
    expect(json.data.title).toBe("Test Task");
    createdTaskId = json.data.id;
  });
 
  it("should list all tasks", async () => {
    const res = await fetch(`${BASE_URL}/api/tasks`);
    expect(res.status).toBe(200);
    const json = await res.json();
    expect(json.data).toBeInstanceOf(Array);
    expect(json.data.length).toBeGreaterThan(0);
  });
 
  it("should get a task by ID", async () => {
    const res = await fetch(`${BASE_URL}/api/tasks/${createdTaskId}`);
    expect(res.status).toBe(200);
    const json = await res.json();
    expect(json.data.id).toBe(createdTaskId);
  });
 
  it("should update a task", async () => {
    const res = await fetch(`${BASE_URL}/api/tasks/${createdTaskId}`, {
      method: "PUT",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ completed: true }),
    });
    expect(res.status).toBe(200);
    const json = await res.json();
    expect(json.data.completed).toBe(1);
  });
 
  it("should return 400 for missing title", async () => {
    const res = await fetch(`${BASE_URL}/api/tasks`, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({}),
    });
    expect(res.status).toBe(400);
  });
 
  it("should return 404 for non-existent task", async () => {
    const res = await fetch(`${BASE_URL}/api/tasks/99999`);
    expect(res.status).toBe(404);
  });
});

تشغيل الاختبارات

# تشغيل جميع الاختبارات
bun test
 
# تشغيل ملف اختبار محدد
bun test tests/tasks.test.ts
 
# وضع المراقبة
bun test --watch
 
# مع التغطية
bun test --coverage

مُشغّل اختبارات Bun أسرع بكثير من Jest — مجموعات الاختبارات النموذجية تعمل بالمللي ثانية بدلاً من الثواني.


الخطوة 9: مُجمّع Bun

يتضمن Bun مُجمّعاً بدرجة إنتاجية يحل محل webpack وesbuild وRollup.

التجميع الأساسي

# تجميع ملف للمتصفح
bun build ./src/client.ts --outdir ./dist
 
# تجميع لتوافق Node.js
bun build ./src/index.ts --target node --outdir ./dist
 
# تجميع لـ Bun
bun build ./src/index.ts --target bun --outdir ./dist

الواجهة البرمجية البرمجية

// build.ts
const result = await Bun.build({
  entrypoints: ["./src/index.ts"],
  outdir: "./dist",
  target: "bun",
  minify: true,
  splitting: true,
  sourcemap: "external",
});
 
if (!result.success) {
  console.error("Build failed:");
  for (const log of result.logs) {
    console.error(log);
  }
  process.exit(1);
}
 
console.log(`Build complete: ${result.outputs.length} files`);

إنشاء ملف تنفيذي مستقل

من أقوى ميزات Bun ترجمة تطبيقك إلى ملف تنفيذي واحد:

bun build ./src/index.ts --compile --outfile tasks-api

ينتج هذا ملفاً تنفيذياً مستقلاً يتضمن بيئة تشغيل Bun. يمكنك توزيعه على أي جهاز بدون الحاجة لتثبيت Bun أو Node.js:

./tasks-api
# Tasks API running at http://localhost:3000

الخطوة 10: خادم WebSocket

يتمتع Bun بدعم WebSocket من الدرجة الأولى مدمج في خادم HTTP:

// ws-server.ts
Bun.serve({
  port: 3001,
  fetch(req, server) {
    // ترقية طلب HTTP إلى WebSocket
    if (server.upgrade(req)) {
      return; // الترقية ناجحة
    }
    return new Response("WebSocket server", { status: 200 });
  },
  websocket: {
    open(ws) {
      console.log("Client connected");
      ws.subscribe("chat");
    },
    message(ws, message) {
      // البث لجميع المشتركين
      ws.publish("chat", `User: ${message}`);
    },
    close(ws) {
      console.log("Client disconnected");
      ws.unsubscribe("chat");
    },
  },
});
 
console.log("WebSocket server running on ws://localhost:3001");

تنفيذ WebSocket في Bun يتعامل مع أكثر من مليون رسالة في الثانية — مما يجعله مثالياً لتطبيقات الوقت الحقيقي.


الخطوة 11: تشغيل السكربتات وpackage.json

يمكن لـ Bun تشغيل سكربتات package.json أسرع بكثير من npm:

{
  "name": "bun-tasks-api",
  "scripts": {
    "dev": "bun --watch run src/index.ts",
    "start": "bun run src/index.ts",
    "build": "bun build src/index.ts --compile --outfile dist/tasks-api",
    "test": "bun test",
    "test:watch": "bun test --watch",
    "lint": "bunx @biomejs/biome check ./src",
    "db:seed": "bun run scripts/seed.ts"
  }
}

لاحظ علم --watch — يتمتع Bun بمراقبة ملفات مدمجة مع إعادة تحميل ساخنة، مما يحل محل أدوات مثل nodemon.

استخدام bunx

bunx هو مكافئ Bun لـ npx — يشغّل الحزم بدون تثبيتها عالمياً:

bunx create-next-app my-app
bunx prisma migrate dev
bunx @biomejs/biome check ./src

الخطوة 12: النشر في بيئة الإنتاج

الخيار أ: Docker

أنشئ Dockerfile بسيط:

FROM oven/bun:2 AS base
WORKDIR /app
 
# تثبيت الاعتماديات
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile --production
 
# نسخ المصدر
COPY src/ src/
 
# التشغيل
EXPOSE 3000
CMD ["bun", "run", "src/index.ts"]

البناء والتشغيل:

docker build -t bun-tasks-api .
docker run -p 3000:3000 bun-tasks-api

الخيار ب: ملف تنفيذي مستقل

ترجم وانشر ملفاً تنفيذياً واحداً:

# البناء على جهازك
bun build src/index.ts --compile --outfile tasks-api
 
# النسخ إلى الخادم والتشغيل
scp tasks-api user@server:/opt/app/
ssh user@server "chmod +x /opt/app/tasks-api && /opt/app/tasks-api"

الخيار ج: Fly.io

# fly.toml
app = "bun-tasks-api"
 
[build]
  dockerfile = "Dockerfile"
 
[http_service]
  internal_port = 3000
  force_https = true
 
[[vm]]
  size = "shared-cpu-1x"
  memory = "256mb"
fly launch
fly deploy

معايير الأداء

فيما يلي مقارنة بين Bun وNode.js للعمليات الشائعة (الأقل أفضل):

العمليةNode.js 22Bun 2.0التسريع
تثبيت الحزم (Next.js)28 ثانية1.8 ثانية15 ضعف
تنفيذ TypeScript320 مللي ثانية45 مللي ثانية7 أضعاف
خادم HTTP (طلب/ثانية)68,000260,0003.8 أضعاف
قراءة ملف (1GB)1.2 ثانية0.4 ثانية3 أضعاف
مجموعة اختبارات (100 اختبار)4.5 ثانية0.8 ثانية5.6 أضعاف
تجميع (تطبيق React)1.1 ثانية0.3 ثانية3.7 أضعاف

هذه الأرقام من أحمال عمل واقعية نموذجية. قد تختلف نتائجك حسب العتاد وتعقيد المشروع.


استكشاف الأخطاء

المشاكل الشائعة

حزم Node.js التي تستخدم إضافات أصلية: بعض حزم npm ذات إضافات C++ قد لا تعمل مع Bun. تحقق من متتبع التوافق في bun.sh/ecosystem للمشاكل المعروفة.

استهلاك الذاكرة: يستخدم Bun محرك JavaScriptCore بدلاً من V8. يختلف سلوك الذاكرة — بعض أحمال العمل تستهلك ذاكرة أقل، وبعضها أكثر. راقب باستخدام:

bun run --smol src/index.ts  # يقلل استهلاك الذاكرة على حساب بعض الأداء

واجهات Node.js البرمجية المفقودة: يُنفّذ Bun معظم واجهات Node.js البرمجية، لكن بعض الحالات الحافة قد تختلف. إذا واجهت عدم توافق، تحقق من توثيق Bun للحلول البديلة.


الخطوات التالية

الآن بعد أن أتقنت أساسيات Bun 2.0، استكشف هذه المجالات:

  • إطار Hono — استخدم Hono على Bun لواجهة API أكثر هيكلة مع برمجيات وسيطة
  • إطار Elysia — واجهات API آمنة الأنواع مع استنتاج أنواع شامل على Bun
  • Bun Shell — أتمتة مهام النظام باستخدام واجهة shell المدمجة في Bun
  • SQLite مع Drizzle ORM — دمج SQLite الأصلي في Bun مع Drizzle لاستعلامات آمنة الأنواع
  • تطبيقات WebSocket — بناء أنظمة محادثة أو إشعارات في الوقت الحقيقي

الخلاصة

Bun 2.0 هو تحول جذري في تطوير JavaScript. من خلال دمج بيئة التشغيل ومدير الحزم والمُجمّع ومُشغّل الاختبارات في ملف تنفيذي واحد، يزيل تعقيد سلسلة الأدوات الذي أرهق نظام JavaScript البيئي لسنوات.

في هذا الدليل، بنيت واجهة REST API كاملة مع تخزين SQLite، وتعلمت استخدام مُشغّل اختبارات Bun، وجمّعت الكود للإنتاج، واستكشفت خيارات النشر. مكاسب السرعة وحدها تجعل Bun يستحق النظر للمشاريع الجديدة، وتوافقه مع Node.js يعني أنك تستطيع تبنيه تدريجياً.

تطور مشهد بيئات تشغيل JavaScript. Bun 2.0 يقود الطريق.


هل تريد قراءة المزيد من الدروس التعليمية؟ تحقق من أحدث درس تعليمي لدينا على بناء وكلاء ذكاء اصطناعي متقدمين باستخدام LangGraph.js و TypeScript.

ناقش مشروعك معنا

نحن هنا للمساعدة في احتياجات تطوير الويب الخاصة بك. حدد موعدًا لمناقشة مشروعك وكيف يمكننا مساعدتك.

دعنا نجد أفضل الحلول لاحتياجاتك.

مقالات ذات صلة