Hono vs Fastify
Hono (edge-first, Cloudflare Workers) et Fastify (performance Node.js) — comparatif des frameworks web JavaScript modernes. Performance, compatibilité edge, écosystème.
Le choix par défaut de l'écosystème Node : flexible, mature, immense catalogue de middlewares
Basé sur les schémas, orienté performance : chaque route est un contrat
Le benchmark officiel de Fastify (avec la mention « illustrative ») le place en tête avec 1,6× en débit et 1,7× en latence, porté par la sérialisation basée sur les schémas et le plugin OpenAPI officiel. Le gain d'Express 5 est la capture automatique des erreurs dans les handlers async. Sur GitHub, Express est largement en tête (69 478 contre 37 195 étoiles). Nouveau service critique en performance → Fastify ; base de code Express existante + équipe habituée → reste sur Express 5, aucun outil de migration officiel n'existe.
| Catégorie | Express 5 | Fastify |
|---|---|---|
| Performance | 6/10 | 9/10 |
| Facilité d'apprentissage | 9/10 | 7/10 |
| Écosystème | 9/10 | 7/10 |
| Communauté | 10/10 | 7/10 |
| Marché de l'emploi | 8/10 | 6/10 |
| Pérennité | 7/10 | 8/10 |
// Express 5 - Gestionnaire de route async + capture automatique des erreurs
import express from 'express';
const app = express();
app.use(express.json());
// Classe d'erreur simple — pour un message clair à la frontière de l'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 : si le handler async rejette ou lève une erreur, next(err) est appelé automatiquement.
// N'oublie pas de retourner la Promise — sinon le rejet peut rester non géré (unhandled).
app.get('/api/users/:id', async (req, res) => {
const user = await getUser(req.params.id);
res.json(user);
});
// Middleware d'erreur centralisé — ajouté à la fin de la pile globale
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 - Validation de schéma + sérialisation automatique
import Fastify from 'fastify';
const fastify = Fastify({ logger: true });
// Schéma de réponse : fast-json-stringify génère à partir de ce schéma
// une fonction de sérialisation compilée — plus rapide que le JSON.stringify générique.
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 : les hooks/decorators enregistrés dans ce plugin
// ne s'appliquent qu'aux routes de ce contexte.
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 });Le benchmark officiel de Fastify (avec la mention « illustrative ») le place en tête avec 1,6× en débit et 1,7× en latence, porté par la sérialisation basée sur les schémas et le plugin OpenAPI officiel. Le gain d'Express 5 est la capture automatique des erreurs dans les handlers async. Sur GitHub, Express est largement en tête (69 478 contre 37 195 étoiles). Nouveau service critique en performance → Fastify ; base de code Express existante + équipe habituée → reste sur Express 5, aucun outil de migration officiel n'existe.
Obtenir une consultation gratuiteSi tu construis un nouveau service critique en performance avec validation par schéma, choisis Fastify ; si tu as un investissement Express existant et une équipe habituée, reste sur Express 5. Les deux sont activement maintenus — sur le registre npm, express@latest est en 5.2.1, fastify@latest en 5.12.5 (Fastify v6 est en alpha mais la version stable reste 5.x) — donc ne décide pas sur l'argument « Express est mort ». Si tu as besoin d'un large écosystème de middlewares tiers, la balance penche encore vers Express.