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

ملف تنفيذي واحد يحكمهم جميعاً. 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.js | Bun |
| مدير الحزم | npm / yarn / pnpm | bun install |
| المُجمّع | webpack / esbuild / Rollup | bun build |
| مُشغّل الاختبارات | Jest / Vitest | bun test |
| TypeScript | tsc + 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); // نوع MIMEBun.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); // true5.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 tests7.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 22 | Bun 2.0 | التسريع |
|---|---|---|---|
| تثبيت الحزم (Next.js) | 28 ثانية | 1.8 ثانية | 15 ضعف |
| تنفيذ TypeScript | 320 مللي ثانية | 45 مللي ثانية | 7 أضعاف |
| خادم HTTP (طلب/ثانية) | 68,000 | 260,000 | 3.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 يقود الطريق.
ناقش مشروعك معنا
نحن هنا للمساعدة في احتياجات تطوير الويب الخاصة بك. حدد موعدًا لمناقشة مشروعك وكيف يمكننا مساعدتك.
دعنا نجد أفضل الحلول لاحتياجاتك.
مقالات ذات صلة

Biome: استبدال ESLint و Prettier بأداة واحدة فائقة السرعة
تعلّم كيفية الانتقال من ESLint + Prettier إلى Biome، أداة الفحص والتنسيق المكتوبة بلغة Rust فائقة السرعة. الإعداد، القواعد المخصصة، تكامل CI/CD و VS Code — كل ذلك في أداة واحدة.

Vitest و React Testing Library مع Next.js 15: الدليل الشامل لاختبارات الوحدة في 2026
تعلم كيفية إعداد وإتقان Vitest مع React Testing Library في مشروع Next.js 15. يغطي هذا الدليل اختبار المكونات والـ hooks وServer Components ومسارات API والتكامل مع CI/CD.

بناء وكيل ذكاء اصطناعي مستقل باستخدام Agentic RAG و Next.js
تعلم كيف تبني وكيل ذكاء اصطناعي يقرر بشكل مستقل متى وكيف يسترجع المعلومات من قواعد البيانات المتجهية. دليل عملي شامل باستخدام Vercel AI SDK و Next.js مع أمثلة قابلة للتنفيذ.