Bun : le runtime JavaScript ultra-rapide qui défie Node.js en 2025

Découvrez Bun, le nouveau runtime JavaScript 3x plus rapide que Node.js avec support TypeScript natif, bundler intégré et compatibilité totale npm.

En 2025, Bun s'impose comme le runtime JavaScript le plus rapide du marché, bousculant la suprématie de Node.js. Avec des performances 3x supérieures, un support TypeScript natif et un écosystème tout-en-un (runtime + bundler + test runner), Bun représente une révolution pour les développeurs JavaScript/TypeScript.


Qu'est-ce que Bun ?

Bun est un runtime JavaScript/TypeScript ultra-rapide créé par Jarred Sumner en 2021 et atteignant sa version stable 1.0 en septembre 2023. Contrairement à Node.js (basé sur le moteur V8 de Google), Bun utilise JavaScriptCore (le moteur Safari), ce qui lui confère des performances exceptionnelles.

Bun ne remplace pas seulement Node.js : il remplace également npm, yarn, webpack, esbuild, jest et nodemon. Tout est intégré dans un seul binaire optimisé.


Pourquoi Bun en 2025 ?

  • 3x plus rapide que Node.js pour démarrer un serveur
  • 📦 Gestionnaire de paquets ultra-rapide : 20x plus rapide que npm
  • 🔧 Bundler intégré : pas besoin de webpack/vite
  • Test runner natif : compatible Jest API
  • 🦕 Support TypeScript natif : aucune compilation nécessaire
  • 🔄 Hot reload automatique : watch mode intégré
  • 🌐 APIs Web standards : fetch, WebSocket, Response, Request
  • 🔌 Compatible npm : fonctionne avec 90% des packages npm

Installation de Bun

Linux / macOS / WSL

curl -fsSL https://bun.sh/install | bash

# Vérifier l'installation
bun --version  # v1.2.3 (2025)

Windows (PowerShell)

powershell -c "irm bun.sh/install.ps1 | iex"

# Vérifier
bun --version

Via npm (si déjà installé)

npm install -g bun

bun --version

Créer votre premier projet avec Bun

Initialiser un projet

# Créer un nouveau projet
bun init

# OU créer avec template
bun create react-app my-app
bun create next-app my-next-app
bun create vite my-vite-app

Bun génère automatiquement :

  • package.json
  • tsconfig.json (si TypeScript détecté)
  • index.ts (fichier d'entrée)
  • .gitignore

Hello World avec Bun

// index.ts
console.log('Hello from Bun!');

// Exécuter
bun run index.ts  // Ultra rapide !

Serveur HTTP avec Bun

Exemple basique (API ultra-rapide)

// server.ts
const server = Bun.serve({
  port: 3000,
  fetch(req) {
    const url = new URL(req.url);

    if (url.pathname === '/') {
      return new Response('Hello Bun!', {
        headers: { 'Content-Type': 'text/plain' }
      });
    }

    if (url.pathname === '/api/user') {
      return Response.json({
        name: 'John Doe',
        age: 30
      });
    }

    return new Response('404 Not Found', { status: 404 });
  },
});

console.log(`Server running on http://localhost:${server.port}`);

// Lancer : bun run server.ts

Performance : Bun vs Node.js

RuntimeRequêtes/secLatence (ms)Démarrage
Bun 1.2260 0000.85 ms
Node.js 2285 0002.515 ms
Deno 2.0120 0001.812 ms

Résultat : Bun est 3x plus rapide que Node.js pour les serveurs HTTP ! 🚀


Gestionnaire de paquets : bun install

Installer des dépendances

# Installer toutes les dépendances (package.json)
bun install

# Ajouter une dépendance
bun add react
bun add -d typescript

# Supprimer
bun remove axios

# Mise à jour
bun update

Benchmark : npm vs yarn vs pnpm vs bun

GestionnaireTemps (React + 10 deps)Taille cache
bun install0.8s120 MB
pnpm install2.1s180 MB
yarn install4.5s250 MB
npm install18s350 MB

Bun est 20x plus rapide que npm !


Exécuter des scripts

// package.json
{
  "scripts": {
    "dev": "bun run --watch server.ts",
    "build": "bun build ./index.tsx --outdir ./dist",
    "test": "bun test"
  }
}

# Lancer avec hot reload
bun run dev

# OU directement
bun --watch server.ts

Support TypeScript natif

Aucune configuration nécessaire : Bun exécute TypeScript directement sans transpilation manuelle !

// app.ts
interface User {
  name: string;
  age: number;
}

const getUser = async (): Promise => {
  const res = await fetch('https://api.example.com/user');
  return res.json();
};

console.log(await getUser());

// Exécuter directement
bun run app.ts  // Pas besoin de tsc !

Bundler intégré

Bun remplace webpack, esbuild, vite avec un bundler ultra-rapide intégré.

# Build pour production
bun build ./src/index.tsx --outdir ./dist --minify

# Build avec splitting
bun build ./src/index.tsx --outdir ./dist --splitting

# Build pour Node.js
bun build ./src/index.ts --target node --outfile server.js

Configuration avancée (bunfig.toml)

# bunfig.toml
[build]
outdir = "dist"
minify = true
sourcemap = "external"
target = "browser"

[install]
registry = "https://registry.npmjs.org"

Test runner intégré

Bun inclut un test runner compatible Jest, mais 10x plus rapide.

// math.test.ts
import { expect, test, describe } from 'bun:test';

describe('Math operations', () => {
  test('addition', () => {
    expect(2 + 2).toBe(4);
  });

  test('async fetch', async () => {
    const res = await fetch('https://jsonplaceholder.typicode.com/todos/1');
    const data = await res.json();
    expect(data).toHaveProperty('title');
  });
});

// Lancer les tests
bun test

// Avec watch mode
bun test --watch

Performance tests : Bun vs Jest

Test runner100 testsDémarrage
Bun test0.3s10 ms
Vitest1.2s80 ms
Jest3.5s1200 ms

APIs natives de Bun

1. Bun.file() - Lecture fichiers ultra-rapide

// Lire un fichier
const file = Bun.file('data.json');
const content = await file.text();
console.log(content);

// JSON
const data = await Bun.file('config.json').json();

// ArrayBuffer
const buffer = await Bun.file('image.png').arrayBuffer();

2. Bun.write() - Écriture optimisée

// Écrire un fichier
await Bun.write('output.txt', 'Hello Bun!');

// JSON
await Bun.write('data.json', JSON.stringify({ foo: 'bar' }));

// Response directe
await Bun.write('page.html', new Response('<h1>Hello</h1>'));

3. Bun.password - Hash sécurisé

// Hasher un mot de passe (bcrypt-like)
const hash = await Bun.password.hash('myPassword123');

// Vérifier
const isValid = await Bun.password.verify('myPassword123', hash);
console.log(isValid);  // true

4. Bun.$` - Shell scripts intégrés

import { $ } from 'bun';

// Exécuter des commandes shell
await $`ls -la`;
await $`git status`;

// Avec variables
const branch = await $`git branch --show-current`.text();
console.log(`Current branch: ${branch}`);

Compatibilité avec Node.js

Bun est 90% compatible avec l'écosystème Node.js. Voici ce qui fonctionne :

✅ Compatible

  • fs, path, http, crypto
  • ✅ Express, Fastify, Hono
  • ✅ Prisma, Drizzle ORM
  • ✅ React, Vue, Svelte
  • ✅ Next.js (mode standalone)
  • ✅ Packages npm (90%)

⚠️ Limitations actuelles

  • ⚠️ node:vm (sandbox) : support partiel
  • ⚠️ node:cluster : pas encore supporté
  • ⚠️ Certains packages natifs (C++ addons)
  • ⚠️ Next.js en mode dev : utiliser Node.js

Exemple complet : API REST avec SQLite

// server.ts
import { Database } from 'bun:sqlite';

const db = new Database('mydb.sqlite');

// Créer la table
db.run(`
  CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT,
    email TEXT
  )
`);

const server = Bun.serve({
  port: 3000,
  fetch(req) {
    const url = new URL(req.url);

    // GET /users
    if (url.pathname === '/users' && req.method === 'GET') {
      const users = db.query('SELECT * FROM users').all();
      return Response.json(users);
    }

    // POST /users
    if (url.pathname === '/users' && req.method === 'POST') {
      const body = await req.json();
      db.run('INSERT INTO users (name, email) VALUES (?, ?)', [body.name, body.email]);
      return Response.json({ success: true }, { status: 201 });
    }

    return new Response('404', { status: 404 });
  },
});

console.log(`API running on http://localhost:${server.port}`);

// Lancer : bun run server.ts

Bun vs Node.js vs Deno : Tableau comparatif 2025

CritèreBunNode.js 22Deno 2.0
Performance⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
TypeScript natif✅ Oui❌ Non (ts-node)✅ Oui
Bundler intégré✅ Oui❌ Non✅ Oui
Test runner✅ Intégré⚠️ Expérimental✅ Intégré
Écosystème npm⚠️ 90%✅ 100%⚠️ 85%
Maturité⚠️ Récent (2023)✅ Mature (2009)⚠️ Récent (2020)
Windows✅ Oui✅ Oui✅ Oui
Hot reload✅ Natif⚠️ nodemon✅ --watch

Quand utiliser Bun en 2025 ?

✅ Utilisez Bun si :

  • Nouveau projet : démarrez avec Bun directement
  • Performance critique : API haute charge, microservices
  • Développement TypeScript : gain de temps énorme
  • Prototypage rapide : bundler + test + runtime tout-en-un
  • Scripts CLI : remplacement de bash/python
  • CI/CD : tests 10x plus rapides

⚠️ Restez avec Node.js si :

  • ⚠️ Projet legacy : migration complexe non justifiée
  • ⚠️ Dépendances natives : packages C++ non supportés
  • ⚠️ Écosystème spécifique : outils uniquement Node.js
  • ⚠️ Production critique : attendre Bun 2.0 (plus mature)

Migration Node.js → Bun

Pour migrer un projet existant :

# 1. Installer Bun
curl -fsSL https://bun.sh/install | bash

# 2. Supprimer node_modules
rm -rf node_modules package-lock.json

# 3. Installer avec Bun
bun install

# 4. Tester
bun run dev

# 5. Ajuster si nécessaire
# - Remplacer __dirname par import.meta.dir
# - Tester les packages natifs

Ressources pour aller plus loin


Roadmap Bun 2025

Fonctionnalités prévues en 2025 :

  • 🔜 Windows natif (sans WSL)
  • 🔜 Support complet Node.js (100% compatibilité)
  • 🔜 Debugger intégré
  • 🔜 Plugin system
  • 🔜 Bun Deploy (PaaS officiel)

Conclusion

En 2025, Bun est mature et production-ready pour la majorité des projets JavaScript/TypeScript. Avec des performances 3x supérieures à Node.js, un écosystème tout-en-un et une compatibilité npm excellente, Bun représente l'avenir du runtime JavaScript.

Recommandation :

  • Nouveaux projets : utilisez Bun
  • APIs/microservices : migration fortement recommandée
  • ⚠️ Projets legacy : attendez Bun 2.0 (mi-2025)

Le débat "Node.js vs Bun" rappelle celui de "JavaScript vs TypeScript" il y a quelques années. Bun gagne du terrain rapidement, et si vous démarrez un nouveau projet aujourd'hui, c'est le choix le plus pertinent. ⚡

Prêt à passer à la vitesse supérieure ? Testez Bun dès maintenant et constatez la différence ! 🚀