Skip to main content

Node.js vs. Deno vs. Bun : comparaison des performances des runtimes JavaScript

Écrit par
feature node deno bun

5 septembre 2023

0 minutes de lecture

Pourquoi le choix du bon runtime JavaScript est important

Les runtimes JavaScript vous permettent d’exécuter du code d’application en dehors du navigateur. Vous pouvez ainsi proposer des sites sous forme d’applications hébergées. Vous pouvez également utiliser des runtimes JavaScript pour des scripts à usage général.

Le runtime que vous choisissez a un impact important sur les performances de vos applications : la gestion des requêtes et la vitesse d’accès aux bases de données peuvent varier considérablement. Il influe également sur la facilité de développement et la capacité à monter en charge.

Node.js vs Deno vs Bun

Node.js

Node.js est le runtime JavaScript qui fait figure de référence. En 2023, les développeurs de Stack Overflow l’ont classé comme la technologie web la plus populaire. Créé par Ryan Dahl et lancé en 2009, il a révolutionné les possibilités offertes par JavaScript à son arrivée sur le marché. Grâce à lui, les développeurs peuvent créer des applications avancées pilotées par un backend en JavaScript.

Aujourd’hui, un vaste écosystème s’est développé autour de Node.js, avec une multitude de ressources et de bibliothèques.

Deno

Deno est un runtime JavaScript basé sur Rust. Comme Node.js, il a été créé et lancé par Ryan Dahl.

L’un de ses principaux objectifs est d’améliorer la sécurité de Node.js. Avec Deno, l’accès aux fichiers, au réseau et à l’environnement doit être explicitement autorisé, ce qui réduit les risques de problèmes de sécurité liés à ces domaines. Il est également conçu pour mieux prendre en charge JSX et TypeScript, et pour s’aligner davantage sur les standards du web. Pour simplifier le déploiement, les applications sont fournies sous la forme d’un exécutable autonome.

Deno dispose également d’un écosystème d’outils qui permet aux développeurs de démarrer rapidement leurs projets. Fresh est un framework web conçu pour Deno et Lume est son générateur de sites statiques.

Bun

Bun est le dernier runtime à vouloir attirer votre attention. Propulsé par Zig, il ambitionne d’être un runtime et une boîte à outils tout-en-un axés sur la vitesse, le bundling, les tests et la compatibilité avec les packages Node.js. L’un de ses principaux atouts est ses performances, qui dépassent clairement celles de Node.js et de Deno. Il s’agit donc d’une option très séduisante, à condition qu’il tienne toutes ses promesses.

Pour illustrer ses performances, l’équipe de Bun propose un benchmark qui exécute un gestionnaire HTTP affichant une page côté serveur avec React. Bun a ainsi traité environ 68 000 requêtes par seconde, contre environ 29 000 pour Deno et 14 000 pour Node.js. L’écart est considérable. Jarred Sumner publie régulièrement des informations sur le développement de Bun et des benchmarks récents sur Twitter. Suivez-le pour rester au courant.

Bun inclut également des fonctionnalités de bundling et d’exécution de tâches pour les projets basés sur JavaScript et TypeScript. Comme Deno, il fournit des binaires autonomes et prend en charge les API web. Il est aussi compatible avec certains modules Node.js grâce à la compatibilité npm.

Comparaison des runtimes JavaScript

Examinons de plus près leurs différences en matière de performances, de support et de communauté, de stabilité, de sécurité et de fonctionnalités supplémentaires.

Performances et vitesse

Allons droit au but : Bun l’emporte. Nous avons vu plus haut ses performances et le nombre de requêtes par seconde qu’il peut traiter, ce qui est impressionnant. Les opérations sur les bases de données suivent la même tendance. Voici le nombre moyen de requêtes par seconde lors du chargement de la base de données Northwind pour SQLite à l’aide de l’exemple de benchmark de Bun :

Runtime

Nombre moyen de requêtes par seconde

Node.js

21.29

Deno

43.50

Bun

81.37

Dans une autre comparaison de Node.js, Deno et Bun, Bun traite les connexions simultanées le plus rapidement. Son nombre de requêtes par seconde est également bien supérieur. Par exemple, avec 10 connexions simultanées, Bun atteint 110 000 requêtes par seconde, contre 60 000 pour Node.js et 67 000 pour Deno. Cette tendance se confirme à mesure que le nombre de connexions simultanées augmente.

Pourquoi Bun est-il tellement plus rapide que Node ?

Même si l’efficacité des scénarios utilisés pour les tests de performance fait débat, Bun reste le grand gagnant. Node.js arrive dernier dans toutes les comparaisons et se montre particulièrement lent pour les opérations sur les bases de données. Deno et Node.js sont généralement assez proches, tandis que Bun les devance largement. Node.js accuse un retard sur ce point, mais Yagiz Nizipli mène plusieurs initiatives visant à améliorer les performances de Node.js, notamment en accélérant l’analyse des URL d’environ 80 à 90 %.

Vous pouvez aussi exécuter les tests de performance de Bun dans votre propre environnement pour comparer les scénarios suivants :

La vitesse de Bun est une priorité majeure pour ses développeurs. Il utilise JavaScriptCore, le moteur que l’on trouve dans Safari. Deno et Node.js, quant à eux, utilisent le même moteur JavaScript V8 que Chrome.

Bun est non seulement rapide à l’exécution, mais il est aussi conçu pour démarrer rapidement, afin de conserver ses performances lorsque vous lancez plusieurs instances. Il convient donc bien aux applications à mise à l’échelle dynamique. En cas de pic soudain de trafic, si vous devez créer rapidement de nouvelles instances, Bun est conçu pour rendre vos services disponibles au plus vite.

Support et communauté

Les trois projets sont open source, mais tous ne sont pas entièrement soutenus par leur communauté. Node.js est soutenu par l’OpenJS Foundation et repose exclusivement sur la communauté et les bénévoles. Deno et Bun bénéficient du soutien d’entreprises à but lucratif et de projets financés par des sociétés de capital-risque.

Node.js dispose d’un écosystème bien établi et d’une vaste communauté. Vous trouverez en ligne des conseils pour pratiquement tous les cas d’usage. Deno et Bun sont beaucoup plus récents : les ressources d’aide sont donc moins nombreuses. Cela dit, de nombreux développeurs enthousiastes sont prêts à partager leurs connaissances. De plus, Deno 1.28 a amélioré la compatibilité avec les packages npm, facilitant ainsi son adoption par les développeurs qui migrent depuis Node.js.

Voici le nombre de questions associées à chaque runtime sur Stack Overflow (en décembre 2024) :

Runtime

Questions associées

Node.js

475028

Deno

1105

Bun

264

Graphique à barres de l’utilisation des environnements d’exécution JavaScript : Node.js 27 976, navigateur 24 369, service workers 5 316, Deno 3 344, Bun 1 263, Hermes 884, ChakraCore 113.

Chaque année, une enquête auprès des développeurs intitulée State of JavaScript pose notamment une question sur les runtimes utilisés régulièrement par les participants. Près de 30 000 personnes y ont répondu. Les résultats de l’enquête de 2022 confirment la nette avance de Node.js : Deno arrive derrière avec environ 5 300 votes et Bun obtient environ 1 200 votes.

Les résultats de l’enquête State of JavaScript 2024 montrent que Bun a rapidement progressé et dépassé Deno. Il est désormais clairement le deuxième runtime préféré, après Node.js :

La documentation officielle de Node.js contient différents guides, une vaste référence d’API et des informations pour bien démarrer. Elle présente également ses dépendances.

Le site de Deno propose un manuel détaillé pour vous aider à découvrir le runtime et à l’utiliser dans vos projets. Il présente également la bibliothèque standard, que les développeurs peuvent utiliser immédiatement. 

Stabilité

En tant qu’acteur établi, Node.js offre des performances éprouvées et alimente 2,1 % des sites web dans le monde. Depuis sa version 1.0, sortie en mai 2020, Node.js s’efforce d’améliorer l’expérience développeur tout en préservant la stabilité à chaque version, ce qui permet aux développeurs d’effectuer des mises à niveau avec peu ou pas d’impact.

Bun en est actuellement à la version 1.1.42. De nouvelles versions sortent parfois à quelques semaines d’intervalle et apportent davantage de fonctionnalités, de correctifs et de compatibilité avec le runtime principal de Node.js.

Sécurité

La gestion des dépendances avec npm peut présenter des faiblesses en matière de sécurité, auxquelles s’ajoutent les pièges courants de sécurité des applications développées avec Node.js. La création d’un runtime plus sécurisé est l’une des principales raisons qui ont motivé la création de Deno. Celui-ci repose sur des contrôles d’accès précis aux API sensibles, telles que les requêtes réseau, les opérations sur le système de fichiers et d’autres fonctionnalités essentielles. Node.js n’est pas loin derrière sur ce point : Node.js 20 a introduit un modèle d’autorisations qui offre des protections similaires à celles de Deno.

En informant les développeurs des erreurs courantes et des bonnes pratiques liées à Node.js, vous pouvez les aider à créer des applications Node.js sécurisées.

Deno répond à certains problèmes de sécurité inhérents à Node.js en exigeant des autorisations explicites pour certaines actions exécutées par l’application. Par exemple, pour autoriser votre application à lire le système de fichiers, vous devez la lancer avec l’indicateur --allow-read. Vous trouverez la liste complète dans la documentation sur les autorisations. Vous pouvez également interagir avec ce système d’autorisations à l’exécution pour demander et révoquer des autorisations par programmation. Faites attention aux sous-processus lorsque vous utilisez l’indicateur --allow- : les sous-processus créés ne sont pas soumis aux mêmes restrictions de sécurité que le processus Deno. Ils peuvent compromettre le bac à sable de sécurité de Deno et entraîner une élévation de privilèges.

Fonctionnalités supplémentaires

Node.js a ajouté plusieurs fonctionnalités pour se rapprocher des capacités de Deno et de Bun. Il intègre désormais un exécuteur de tests et propose une prise en charge expérimentale de TypeScript.

Deno intègre un inspecteur de dépendances et un formateur de code. La possibilité de le déployer sous la forme d’un exécutable unique est également un atout. Pour configurer un serveur avec Deno, la méthode de base décrite dans sa documentation consiste à récupérer du code depuis d’autres sources. Le code ne semble pas beaucoup plus complexe qu’avec Node.js, mais son approche peut sembler différente, car les dépendances sont chargées via une URL.

Voici un exemple simplifié de ce code :

import { serve } from "https://deno.land/std@0.198.0/http/server.ts";

const handler = async (_request: Request): Promise<Response> => {
  const resp = await fetch("https://api.github.com/users/denoland", {
    // The init object here has an headers object containing a
    // header that indicates what type of response we accept.
    // We're not specifying the method field since by default
    // fetch makes a GET request.
    headers: {
      accept: "application/json",
    },
  });

  return new Response(resp.body, {
    status: resp.status,
    headers: {
      "content-type": "application/json",
    },
  });
};

serve(handler);

Bun propose également un transpileur et un gestionnaire de packages. Comme son nom le suggère, il intègre aussi des fonctionnalités de bundling, qui vous évitent d’avoir recours à un autre outil comme Snowpack ou rollup.js. Il élimine également le code inutilisé grâce à son minificateur JavaScript.

Si vous utilisez Bun pour exécuter des tâches, sa vitesse peut représenter un atout majeur. Selon ses créateurs, il lui faut environ 5 millisecondes pour démarrer, contre environ 25 millisecondes pour Node.js. La différence peut sembler minime, mais elle peut accélérer considérablement votre workflow de développement lorsque vous répétez plusieurs tâches au fil du temps.

Devriez-vous utiliser Bun, Deno ou Node.js ?

Bun est clairement le plus rapide, mais il reçoit encore des mises à jour pour améliorer sa compatibilité avec Node.js, ce qui présente des risques en production. Atteindra-t-il la stabilité des deux autres runtimes ? Peut-être. Quoi qu’il en soit, si vous cherchez à bousculer le marché en surpassant vos concurrents en matière de vitesse, Bun vous en donne l’occasion dans la plupart des cas.

Le principal atout de Node.js réside dans sa maturité et dans la taille de son écosystème. De nombreux développeurs le maîtrisent. Deno et Bun ont toutefois l’attrait de la nouveauté, ce qui enthousiasme toujours les développeurs.

Deno présente également de nombreux avantages par rapport à Node.js. Ses fonctionnalités simplifient le développement et permettent de créer facilement des projets complexes de grande qualité. Il est sécurisé et plus rapide que Node.js, mais reste un peu plus lent que Bun.

De manière générale, Node.js reste l’option la plus sûre, avec un bilan éprouvé. Deno a de nombreux atouts : ses fonctionnalités modernes en font un bon choix pour les développeurs qui veulent créer quelque chose de nouveau. Quant à Bun, c’est l’outil idéal si la vitesse est votre priorité ou si vous souhaitez simplement être à la pointe des nouvelles technologies.

Snyk donne la priorité à l’expérience des développeurs

Découvrez pourquoi l’expérience des développeurs est si essentielle et comment les dernières fonctionnalités de Snyk la rendent plus fluide.

Publié dans: