Un transpileur ou transcompilateur est un programme qui traduit un code source d'un langage à un autre au même niveau d'abstraction (ce qui le différencie d'un compilateur dont le résultat est d'un niveau inférieur à celui de son entrée). Le transcompilateur peut utiliser comme langage d'entrée un langage existant comme cfront qui convertit C++ en C ou un nouveau langage comme Coffeescript qui est transcompilé en Javascript. Le langage d'entrée peut être un sur-ensemble du langage de sortie, ce qui signifie que tout code écrit dans le langage de sortie est valable pour le langage d'entrée.
Bun est conçu pour remplacer les applications ou scripts JavaScript et TypeScript sur l’ordinateur local. Il implémente nativement des centaines d'APIs Node.js et Web, y compris environ 90 % des fonctions Node-API (modules natifs), fs, path, Buffer et plus encore. L'objectif de Bun est d'exécuter la plupart des codes JavaScript en dehors des navigateurs, en apportant des améliorations de performance et de complexité à l’infrastructure, ainsi que la productivité des développeurs grâce à des outils meilleurs et plus simples.
Bun continue également à devenir plus rapide et plus stable - l'instanciation du tampon serait 10x plus rapide, crypto.createHasher() serait 50x plus rapide, et l'installation de bun a reçu des dizaines de corrections de bogues.
Workspaces dans package.json
Bun supporte maintenant les Workspaces dans le package.json, et c'est rapide. Bun installe le monorepo Remix en 500 ms environ sous Linux.
- 28x plus rapide que npm install
- 12x plus rapide que yarn install (v1)
- 8x plus rapide que pnpm install
Les workspaces permettent de développer facilement des logiciels complexes sous la forme d'un monoréseau composé de plusieurs paquets indépendants. Pour l'essayer, spécifiez une liste de sous-paquets dans le champ workspaces de votre package.json ; il est classique de placer ces sous-paquets dans un répertoire appelé packages.
Code : | Sélectionner tout |
1 2 3 4 5 | { "name": "my-project", "version": "1.0.0", "workspaces": ["packages/a", "packages/b"] } |
Cela présente quelques avantages majeurs
- le code peut être divisé en parties logiques. Si un paquet dépend d'un autre, il est possible de l'ajouter comme dépendance avec bun add. Si le paquet b dépend de a, bun install fera un lien symbolique de votre répertoire local packages/a vers le dossier node_modules de b, au lieu d'essayer de le télécharger depuis le registre npm ;
- les dépendances peuvent être dé-dupliquées. Si a et b partagent une dépendance commune, elle sera hissée dans le répertoire node_modules racine. Cela réduit l'utilisation redondante du disque et minimise les problèmes de "dépendance infernale" associés à l'installation simultanée de plusieurs versions d'un paquet.
Bun.dns et node:dns
Bun peut désormais résoudre des noms de domaine à l'aide de l'API intégrée Bun.dns. Pour l'instant, Bun.dns n'expose qu'une seule fonction : lookup.
Code : | Sélectionner tout |
1 2 3 | import { dns } from "bun"; const records = await dns.lookup("example.com", { family: 4 }); console.log(records); // [{ address: "93.184.216.34" }] |
En-têtes personnalisés dans WebSocket
Une fonctionnalité demandée depuis longtemps dans la spécification WebSocket est la possibilité de définir des en-têtes personnalisés lors de l'ouverture d'une WebSocket. Bien que cette fonctionnalité n'ait pas encore été intégrée à WebSocket, Bun l'implémente désormais. Cela permet aux utilisateurs de personnaliser les en-têtes utilisés pour la demande de handshake du client WebSocket.
Code : | Sélectionner tout |
1 2 3 4 5 | const ws = new WebSocket("ws://localhost/chat", { headers: { Authorization: "...", }, }); |
Sockets utilisant node:tls et node:net
Bun prend désormais en charge la création de sockets utilisant net.connect() et tls.connect(). Cela permet de débloquer plusieurs bibliothèques de pilotes de bases de données. Voici, quelques exemples représentatifs :
Se connecter à Postgres dans Bun en utilisant Postgres.js
Code : | Sélectionner tout |
1 2 3 4 | import postgres from "postgres"; const sql = postgres(); const [{ version }] = await sql`SELECT version()`; console.log(version); // "PostgreSQL 14.2 ..." |
Se connecter à MySQL dans Bun en utilisant mysql2
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | import { createConnection } from "mysql2/promise"; const connection = await createConnection({ host: "localhost", user: "root", database: "test", }); const [rows] = await connection.execute("SELECT 1+2 AS count"); console.log(rows); // [{ count: 3 }] |
Amélioration des performances
- Nouveau Buffer() 10 fois plus rapide : auparavant, l'implémentation de Buffer dans Bun utilisait [C=Javascript]Object.setPrototypeOf()[C] pour créer chaque nouvelle instance. L'élimination de ce goulot d'étranglement rend l'instanciation d'un petit Buffer 10 fois plus rapide dans Bun ;
- crypto.createHash() 50 fois plus rapide : auparavant, Bun utilisait une implémentation purement JavaScript de crypto.createHash(). Maintenant, elle est implémentée en utilisant le code natif de BoringSSL, ce qui permet de gagner 50 fois en vitesse.
Support pour HTTPS_PROXY
Bun reconnaît désormais les variables d'environnement HTTPS_PROXY, HTTP_PROXY et NO_PROXY lors des requêtes HTTP sortantes, ce qui inclut fetch() et bun install. Ces variables permettent de spécifier un proxy pour transférer, ou ne pas transférer, certaines requêtes HTTP et sont utiles lors de l’exécution de Bun au sein d'un pare-feu d'entreprise.
export HTTPS_PROXY="http://proxy.example.com:8080"
export NO_PROXY="localhost,noproxy.example.com"
Burn et la concurrence des moteurs d’exécution déjà existant
Tout comme bun, Deno est un moteur d'exécution Javascript. Créé par Ryan Dahl, ingénieur logiciel, développeur du runtime JavaScript Node.js et TypeScript, Deno est un moteur d'exécution simple, moderne et sécurisé pour JavaScript et TypeScript, il utilise JavaScript V8 et est construit en Rust. Deno assume explicitement le rôle de runtime et de gestionnaire de paquets au sein d'un seul et même exécutable, plutôt que de nécessiter un programme de gestion de paquets distinct.
Outre le runtime Deno, l’outil fournit également une liste de modules standard qui sont examinés par les responsables de Deno et dont le fonctionnement est garanti avec une version spécifique de Deno. Ils cohabitent avec le code source de Deno dans le référentiel denoland/deno. Ces modules standard sont hébergés sur deno.land/std et sont distribués via des URL comme tous les autres modules ES compatibles avec Deno.
Contrairement à Deno, Bun est destiné à remplacer Node, Webpack, Babel, Yarn et PostCSS, le tout dans un seul et même paquet. Il est important de rappeler que Deno n'a pas été conçu comme un remplacement de Node. Ryan Dahl, l'a conçu pour améliorer la productivité. Node.js est un environnement d'exécution JavaScript basé sur le moteur JavaScript V8 de Google qui exécute le code JavaScript en dehors du navigateur. Il aide les développeurs à créer des unités de code non bloquantes afin de tirer le meilleur parti des ressources système pour créer des applications plus réactives.
Le système de modules de Node permet aux développeurs d'étendre la plateforme à l'aide de modules tiers pour obtenir un maximum de fonctionnalités. Node.js permet simplement aux développeurs d'utiliser chaque projet JavaScript open source sur le serveur de la même manière que sur le navigateur client, ce qui permet une intégration plus étroite et plus efficace entre le serveur Web et les scripts de l'application Web prise en charge.
Source : Bun
Et vous ?
Quel est votre avis sur le sujet ?
Que pensez-vous du moteur d'exécution JavaScript Bun ?
Pensez-vous que ces caractéristiques lui permettront de faire de l'ombre à Node ou le surpasser ?
Voir aussi :
Bun, un nouveau moteur d'exécution JavaScript, livré avec un client SQLite3 rapide, il apporte un peu de concurrence pour Node et Deno
Bun, le nouveau moteur d'exécution JavaScript, prendra-t-il la couronne de Node ? Bun est présenté comme un tueur de Node en raison de sa simplicité et de sa rapidité