Hono vs Fastify
Hono (edge-first، Cloudflare Workers) مقابل Fastify (أداء Node.js) — مقارنة بين أطر عمل الويب الحديثة بلغة JavaScript. الأداء، التوافق مع edge، النظام البيئي.
الافتراضي في نظام Node البيئي: مرن وناضج وله مجمع ضخم من الوسيطات (middleware)
قائم على المخطط (schema)، يركز على الأداء: كل مسار (route) عقد
معيار Fastify الرسمي (مع تحذير "illustrative") يتقدم بـ1.6× في الإنتاجية و1.7× في زمن الاستجابة، مدعومًا بالتسلسل القائم على المخطط وإضافة OpenAPI الرسمية. مكسب Express 5 هو الالتقاط التلقائي للأخطاء في المعالجات غير المتزامنة. على GitHub، يتقدم Express بفارق كبير (69,478 مقابل 37,195 نجمة). خدمة جديدة حساسة للأداء ← Fastify؛ قاعدة كود Express قائمة + فريق معتاد عليها ← ابقَ على Express 5، فلا توجد أداة ترحيل رسمية.
| الفئة | Express 5 | Fastify |
|---|---|---|
| الأداء | 6/10 | 9/10 |
| سهولة التعلّم | 9/10 | 7/10 |
| النظام البيئي | 9/10 | 7/10 |
| المجتمع | 10/10 | 7/10 |
| سوق العمل | 8/10 | 6/10 |
| الاستدامة المستقبلية | 7/10 | 8/10 |
// Express 5 - معالج مسار غير متزامن + التقاط تلقائي للأخطاء
import express from 'express';
const app = express();
app.use(express.json());
// فئة خطأ بسيطة — لرسالة ذات معنى عند حدود API
class NotFoundError extends Error {
status = 404;
}
async function getUser(id) {
const user = await db.users.findById(id);
if (!user) throw new NotFoundError('User not found');
return user;
}
// Express 5: إذا رفض المعالج غير المتزامن (reject) أو رمى (throw) يُستدعى next(err) تلقائيًا.
// لا تنسَ إرجاع (return) الـPromise — وإلا قد يبقى الرفض (rejection) غير معالَج.
app.get('/api/users/:id', async (req, res) => {
const user = await getUser(req.params.id);
res.json(user);
});
// middleware مركزي للأخطاء — يُضاف في نهاية المكدس العام
app.use((err, req, res, next) => {
const status = err.status ?? 500;
res.status(status).json({ error: err.message });
});
app.listen(3000, () => {
console.log('Express server listening on port 3000');
});// Fastify 5 - التحقق من المخطط + التسلسل التلقائي
import Fastify from 'fastify';
const fastify = Fastify({ logger: true });
// مخطط الاستجابة: يُنتج fast-json-stringify دالة تسلسل
// مُجمَّعة من هذا المخطط — أسرع من JSON.stringify العام.
const userSchema = {
type: 'object',
properties: {
id: { type: 'string' },
name: { type: 'string' },
email: { type: 'string' },
},
required: ['id', 'name', 'email'],
};
const getUserOpts = {
schema: {
params: {
type: 'object',
properties: { id: { type: 'string' } },
required: ['id'],
},
response: {
200: userSchema,
},
},
};
// Encapsulation: الـhook/decorator المسجّل داخل هذه الإضافة (plugin)
// يتسرب فقط إلى المسارات (routes) داخل هذا السياق (context).
fastify.register(async function userRoutes(instance) {
instance.get('/api/users/:id', getUserOpts, async (request, reply) => {
const user = await db.users.findById(request.params.id);
if (!user) {
return reply.code(404).send({ error: 'User not found' });
}
request.log.info({ userId: user.id }, 'user fetched');
return user;
});
});
fastify.setErrorHandler((error, request, reply) => {
reply.status(error.statusCode ?? 500).send({ error: error.message });
});
await fastify.listen({ port: 3000 });معيار Fastify الرسمي (مع تحذير "illustrative") يتقدم بـ1.6× في الإنتاجية و1.7× في زمن الاستجابة، مدعومًا بالتسلسل القائم على المخطط وإضافة OpenAPI الرسمية. مكسب Express 5 هو الالتقاط التلقائي للأخطاء في المعالجات غير المتزامنة. على GitHub، يتقدم Express بفارق كبير (69,478 مقابل 37,195 نجمة). خدمة جديدة حساسة للأداء ← Fastify؛ قاعدة كود Express قائمة + فريق معتاد عليها ← ابقَ على Express 5، فلا توجد أداة ترحيل رسمية.
احصل على استشارة مجانيةإذا كنت تبني خدمة جديدة حساسة للأداء وتتطلب التحقق من المخطط (schema)، فـFastify؛ وإذا كان لديك استثمار قائم في Express وفريق معتاد عليه، فـExpress 5. كلاهما في صيانة نشطة — في سجل npm، express@latest هو 5.2.1 وfastify@latest هو 5.12.5 (Fastify v6 في مرحلة alpha لكن الإصدار المستقر ما زال 5.x) — أي لا تقرر بحجة "Express مات". إذا كنت تحتاج تنوعًا واسعًا من middleware الطرف الثالث، تميل الكفة أكثر نحو Express.