Bun مقابل Deno
Bun (بيئة تشغيل مبنية على Zig، أسرع بثلاث مرات) مقابل Deno (بيئة تشغيل مبنية على Rust، تركز على TypeScript) — مقارنة بدائل Node.js الحديثة. الأداء، التوافق، النظام البيئي.
وقت تشغيل JS/TS سريع وشامل بنواة مكتوبة بلغة Rust
معيار وقت تشغيل JavaScript على مستوى المؤسسات منذ عام 2009
لا توجد إجابة قاطعة، لكن هناك إطار قرار واضح. إذا كنت تكتب خدمة HTTP جديدة تعتمد فقط على JS/TS نقي، وتريد السرعة وأدوات متكاملة، فإن Bun 1.4 أصبح الآن خيارًا جادًا — واجتيازه 1,517 اختبارًا في التوافق مع Node 26.3.0 يجسّد ذلك. لكن إذا كنت تعتمد على وحدات native N-API (مثل sharp، وnative bcrypt، وبعض برامج تشغيل قواعد البيانات)، أو تُشغّل نظام SSR/API مؤسسيًا طويل الأمد، فإن التزام الدعم الرسمي لمدة 30 شهرًا في Node 24 LTS ونظامه البيئي الضخم من الوحدات native لا يزالان الخيار الافتراضي الأكثر أمانًا. النهج الهجين في المشروع نفسه — "Bun = الأدوات (install/test/build)، Node = وقت تشغيل الإنتاج" — مشروع أيضًا وينتشر بشكل متزايد، إذ يقلل من مخاطر التبني التدريجي. اتخذ قرارك ليس بناءً على أرقام "req/s" الاصطناعية، بل باختبار قائمة تبعياتك الخاصة عبر `bun install` وبناءً على ملف الحمل الحقيقي.
| الفئة | Bun 1.4 | Node.js 26 / 24 LTS |
|---|---|---|
| الأداء | 9/10 | 7/10 |
| سهولة التعلّم | 8/10 | 7/10 |
| النظام البيئي | 6/10 | 10/10 |
| المجتمع | 6/10 | 10/10 |
| سوق العمل | 5/10 | 10/10 |
| الاستدامة المستقبلية | 8/10 | 9/10 |
// Bun 1.4 — خادم أصلي (native) يدعم HTTP/2 (Bun.serve) + عميل SQL مدمج
// يتم تشغيل TypeScript مباشرة عبر bun run server.ts، دون خطوة transpile
import { SQL } from "bun";
// عميل SQL المدمج في Bun: تُكتب الاستعلامات كـ tagged template
const db = new SQL(process.env.DATABASE_URL!);
const server = Bun.serve({
port: 3000,
// منذ Bun v1.4.1، تدعم Bun.serve بروتوكول HTTP/2 بشكل أصلي (native)
http2: true,
async fetch(req: Request): Promise<Response> {
const url = new URL(req.url);
if (url.pathname === "/api/users" && req.method === "GET") {
const users = await db`SELECT id, name FROM users LIMIT 20`;
return Response.json(users);
}
if (url.pathname === "/api/upload" && req.method === "POST") {
const body = await req.formData();
const file = body.get("file") as File;
// تقوم Bun.write بالبث (stream) إلى القرص مباشرة، دون الحاجة لنسخ buffer إضافي
await Bun.write(`./uploads/${file.name}`, file);
return Response.json({ ok: true, size: file.size });
}
return new Response("Not Found", { status: 404 });
},
});
console.log(`Bun sunucusu ${server.port} portunda dinliyor (HTTP/2 aktif)`);
// تثبيت التبعيات عبر bun install — يُنتج node_modules متوافقًا مع npm
// $ bun install
// $ bun test
// $ bun build ./server.ts --outdir ./dist --target bun// Node.js 24 LTS — وحدة http الأصلية (native) + TypeScript مباشرة عبر type-stripping
// إزالة الأنواع (type stripping) افتراضية منذ v23.6.0/v22.18.0، ومستقرة منذ v25.2.0/v24.12.0: دعم TypeScript يقتصر على "erasable syntax"
// node server.ts (يعمل دون أي علامة (flag) في 24.12+ وv26.x؛ للتعطيل استخدم --no-strip-types)
import { createServer } from "node:http";
import { readFile, writeFile } from "node:fs/promises";
import { Pool } from "pg";
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
const server = createServer(async (req, res) => {
const url = new URL(req.url ?? "/", `http://${req.headers.host}`);
if (url.pathname === "/api/users" && req.method === "GET") {
const result = await pool.query("SELECT id, name FROM users LIMIT 20");
res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify(result.rows));
return;
}
if (url.pathname === "/api/report" && req.method === "GET") {
// تشغيل المهام كثيفة المعالجة (CPU-heavy) عبر worker_threads دون حجب الـ thread الرئيسي
const { Worker } = await import("node:worker_threads");
const worker = new Worker("./report-worker.js");
worker.once("message", (report) => {
res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify(report));
});
return;
}
res.writeHead(404);
res.end("Not Found");
});
server.listen(3000, () => {
console.log("Node.js sunucusu 3000 portunda dinliyor");
});
// تثبيت التبعيات عبر npm install
// $ npm install
// $ node --testلا توجد إجابة قاطعة، لكن هناك إطار قرار واضح. إذا كنت تكتب خدمة HTTP جديدة تعتمد فقط على JS/TS نقي، وتريد السرعة وأدوات متكاملة، فإن Bun 1.4 أصبح الآن خيارًا جادًا — واجتيازه 1,517 اختبارًا في التوافق مع Node 26.3.0 يجسّد ذلك. لكن إذا كنت تعتمد على وحدات native N-API (مثل sharp، وnative bcrypt، وبعض برامج تشغيل قواعد البيانات)، أو تُشغّل نظام SSR/API مؤسسيًا طويل الأمد، فإن التزام الدعم الرسمي لمدة 30 شهرًا في Node 24 LTS ونظامه البيئي الضخم من الوحدات native لا يزالان الخيار الافتراضي الأكثر أمانًا. النهج الهجين في المشروع نفسه — "Bun = الأدوات (install/test/build)، Node = وقت تشغيل الإنتاج" — مشروع أيضًا وينتشر بشكل متزايد، إذ يقلل من مخاطر التبني التدريجي. اتخذ قرارك ليس بناءً على أرقام "req/s" الاصطناعية، بل باختبار قائمة تبعياتك الخاصة عبر `bun install` وبناءً على ملف الحمل الحقيقي.
احصل على استشارة مجانيةنعم بالنسبة لمعظم خدمات HTTP API/الويب — اجتاز Bun 1.4 عدد 1,517 اختبارًا جديدًا في حزمة التوافق مع Node.js 26.3.0، وتعمل أطر عمل مثل Express وFastify وNext.js دون مشاكل. لكن إذا كنت تعتمد على إضافات native N-API (مثل sharp، وnative bcrypt) أو لديك عمليات (processes) طويلة الأمد تعمل لأكثر من 72 ساعة، فإن سلوك جامع القمامة (GC) القائم على V8 في Node لا يزال أكثر إثباتًا. الإجابة المختصرة: خدمة جديدة + تبعيات JS نقية = Bun مناسب؛ نظام قديم/ثقيل بالوحدات native = Node.