- Bun 1.2 ist ein großes Release mit dem Ziel, ein Full-Stack-Entwicklungstool für JavaScript/TypeScript zu sein, und erweitert Node.js-Kompatibilität sowie Runtime, Bundler, Tests und Paketmanager gemeinsam
- Die Kompatibilitätsprüfung wurde verstärkt, indem bei jeder Änderung die Node.js-Testsuite ausgeführt wird; Unterstützung für
node:http2,node:dgram,node:cluster,node:zlibundnode:v8wurde hinzugefügt - Die neuen integrierten APIs
Bun.s3undBun.sqlbringen den Zugriff auf S3-kompatiblen Objektspeicher und Postgres direkt in die Runtime und reduzieren damit Abhängigkeiten von externen Clients - Der Paketmanager stellt das Standard-Lockfile vom binären
bun.lockbauf das JSONC-basiertebun.lockum und ergänzt.npmrc,bun publish,bun patch,bun outdatedsowiebun run --filter - Das Arbeitsverzeichnis von
bun run, die Fehlerbehandlung vonBun.build(), der Rückgabewert vonserver.stop(),bun -pund die Standardwerte für Sourcemaps haben sich geändert; bestehende Projekte sollten daher die Auswirkungen auf Migrationen prüfen
Stärkere Node.js-Kompatibilität
- Bun 1.2 ändert den Prozess zur Verbesserung der Kompatibilität so, dass bei jeder Bun-Änderung die Node.js-Testsuite ausgeführt wird
- Bisher wurden Fehler vor allem anhand von GitHub-Issues oder Berichten über fehlgeschlagene npm-Pakete behoben; dieser Ansatz ähnelte eher einem „Whac-a-Mole“-Spiel und erschwerte größere Refactorings
- Tausende Testdateien aus dem Node.js-Repository wurden auf Bun portiert, und diese Tests werden bei jedem Commit ausgeführt, um die Kompatibilität zu prüfen
- Da Node.js-Tests teils interne Implementierungsdetails und exakte Fehlermeldungen prüfen, ersetzt Bun in einigen Tests interne Bindings durch eigene Stubs oder passt die Prüfung stärker auf
nameundcodean- Bun versucht, die Fehlermeldungen von Node.js so weit wie möglich anzugleichen, bietet aber in manchen Fällen hilfreichere Meldungen, wenn
nameundcodeidentisch sind
- Bun versucht, die Fehlermeldungen von Node.js so weit wie möglich anzugleichen, bietet aber in manchen Fällen hilfreichere Meldungen, wenn
- Neu unterstützte Node.js-Module und -Funktionen
node:http2: Unterstützung zum Erstellen von HTTP/2-Servern, auch für gRPC-Server erforderlichnode:dgram: Unterstützung für bind/connect bei UDP-Socketsnode:cluster: Mehrere Bun-Instanzen können ausgeführt werden, um Arbeit auf mehrere CPU-Kerne zu verteilennode:zlib: Die JavaScript-Implementierung wurde in nativen Code neu geschrieben und ist 2-mal schneller als in Bun 1.1node:v8: MitgetHeapSnapshotundwriteHeapSnapshotlässt sich der Bun-Heap in Chrome DevTools untersuchen
- Der
node:http2-Server ist in Bun 1.2 2-mal schneller als in Node.js expressverarbeitet HTTP-Requests dank verbesserternode:http-Kompatibilität und Optimierungen am Bun-HTTP-Server bis zu 3-mal schneller als Node.js- Unterstützung für C++-Add-ons, die die V8-C++-API verwenden, wurde ebenfalls hinzugefügt
- Da Node.js V8 verwendet, Bun aber JavaScriptCore, ist die Implementierung sehr anspruchsvoll
- Bun implementiert die öffentliche C++-API von V8 auf JavaScriptCore, sodass Pakete wie
cpu-featuresfunktionieren - Die Unterstützung der V8-C++-API ist komplex, daher können bei den meisten Paketen noch Funktionen fehlen; die Unterstützung für Pakete wie
node-canvas@v2undnode-sqlite3wird weiter verbessert
Integrierte S3-API Bun.s3
- Bun 1.2 ergänzt mit
Bun.s3eine integrierte API für S3-kompatiblen Objektspeicher- Sie kann mit Diensten verwendet werden, die die S3-API implementieren, etwa Amazon S3, Google Cloud Storage und Cloudflare R2
- Lesen, Schreiben und Löschen von Dateien erfolgt über eine API, die mit dem Webstandard
Blobkompatibel ist
s3.file()gibt eine verzögerte Referenz auf eine S3-Datei zurück und kann wie die Bun-File-API mittext(),json(),arrayBuffer()undstream()verwendet werden- Buns S3-Client ist nicht in JavaScript, sondern in nativem Code geschrieben
- Im Vergleich zur Nutzung von
@aws-sdk/client-s3unter Node.js ist das Herunterladen von Dateien aus S3-Buckets 5-mal schneller
- Im Vergleich zur Nutzung von
- Für Schreibvorgänge stehen
write()undwriter()bereitwrite()kann Strings,Uint8Array,Blob,Responseund mehr hochladenwriter()führt Multipart-Uploads für große Dateien aus
presign()erzeugt eine Presigned URL, die den Upload einer bestimmten Datei erlaubt- Nutzer können direkt nach S3 hochladen, ohne ihnen Zugangsdaten offenzulegen oder dem Bucket unnötige Zugriffsrechte zu geben
- Bei Verwendung mit
Bun.serve()leitetnew Response(s3.file(...))auf eine Presigned URL weiter, statt dass der Server die S3-Datei herunterlädt und erneut ausliefert- Das reduziert Speicherbedarf, Zeitaufwand und Bandbreitenkosten für den Dateidownload durch den Server
s3://-URLs können auch mitBun.file()undfetch()verwendet werden- Mit
fetch("s3://...")sind Upload, Download und Löschen möglich - Der standardmäßige
S3Clientwird über Umgebungsvariablen wieAWS_ACCESS_KEY_IDundAWS_SECRET_ACCESS_KEYkonfiguriert
- Mit
Integrierter Postgres-Client Bun.sql
- Bun 1.2 ergänzt mit
Bun.sqleinen integrierten SQL-Client mit Postgres-Unterstützung- Bun bot bereits einen integrierten SQLite-Client; mit diesem Release wird die Unterstützung für SQL-Datenbanken erweitert
- Es gibt auch einen Pull Request, der MySQL-Unterstützung hinzufügt
Bun.sqlführt SQL über Tagged-Template-Literals aus- JavaScript-Werte können als SQL-Parameter übergeben werden
- String-Escaping und Prepared Statements werden automatisch verwendet, um SQL Injection zu verhindern
- Ergebnisse werden als Array von Objekten zurückgegeben, deren Schlüssel die Spaltennamen sind
- Die Implementierung nutzt nativen Code und mehrere Optimierungen
- automatische Prepared Statements
- Query Pipelining
- binäres Wire Protocol
- Connection Pooling
- Struktur-Caching
- Beim Lesen von Zeilen ist es bis zu 50 % schneller als die Nutzung beliebter Postgres-Clients unter Node.js
- Die API ist von
postgres.jsinspiriert und so gestaltet, dass der Wechsel von bestehendem Code zum integrierten SQL-Client von Bun einfach ist
Änderungen am Paketmanager
- Bun 1.2 ändert das standardmäßige Lockfile vom binären
bun.lockbauf das textbasiertebun.lockbun.lockbhalf dabei,bun installfast 30-mal schneller alsnpmzu machen, aber die Inhalte waren auf GitHub schwer einsehbar und Pull-Request-Reviews sowie das Auflösen von Merge-Konflikten waren schwierig- Auch Tools wie Dependabot hatten Schwierigkeiten, das Lockfile zu lesen
bun.lockist eine JSONC-Datei- Unterstützt Kommentare und trailing commas
- Pull-Request-Diffs lassen sich leichter prüfen, und trailing commas verringern die Wahrscheinlichkeit von Merge-Konflikten
- Neue Projekte erzeugen
bun.lock- Bestehende Projekte mit
bun.lockbwerden ohne automatische Migration weiterhin mit dem binären Lockfile unterstützt bun.lockbwird langfristig unterstützt und auch vonbun addundbun updateweiterhin aktualisiert- Eine Migration auf das neue Text-Lockfile ist mit
bun install --save-text-lockfilemöglich
- Bestehende Projekte mit
bun installist auch nach dem Wechsel auf das Text-Lockfile 30 % schneller als in Bun 1.1- In
package.jsonkönnen Kommentare und trailing commas verwendet werden- Auch
require()undimport()können eine solchepackage.jsonlesen - Da dies im gesamten JavaScript-Ökosystem keine breit unterstützte Funktion ist, wird empfohlen, sie „at your own risk“ zu verwenden
- Auch
- Unterstützung für
.npmrcwurde hinzugefügt- Liest
.npmrcim Projekt-Root und im Home-Verzeichnis - Kann für Registry-, scoped-package- und Authentifizierungseinstellungen für private Registries verwendet werden
- Liest
- Neue Paketmanager-Befehle und -Optionen
bun run --filter: dasselbe Skript gleichzeitig in mehreren Workspaces ausführenbun outdated: veraltete Abhängigkeiten prüfenbun publish: Ersatz fürnpm publish, unterstützt.npmrc-Authentifizierung, Tarball-Packing, OTP und Edge Cases in package.jsonbun patch: Änderungen an Abhängigkeiten als.patch-Dateien inpatches/speichern und beibun installautomatisch anwenden--omit=dev|optional|peer: dev-, optional- und peer-Abhängigkeiten bei der Installation ausschließen- CA-Zertifikate können in
bunfig.toml, per CLI-Flag und in.npmrckonfiguriert werden - Ebenfalls unterstützt werden
bundleDependenciessowie das Beibehalten der Einrückung inpackage.jsonbeibun add
Verbesserungen am Test-Runner
bun testunterstützt einen JUnit-XML-Reporter- Mit
bun test --reporter=junit --reporter-outfile=junit.xmlkönnen Testergebnisse an CI/CD-Tools wie Jenkins, CircleCI und GitLab CI übergeben werden - JUnit-Reporting kann auch in
bunfig.tomlkonfiguriert werden
- Mit
- Für Code Coverage wurde ein LCOV-Reporter hinzugefügt
bun test --coverage --coverage-reporter=lcoverzeugtcoverage/lcov.info- Mit
--coverage-dirlässt sich das Ausgabeverzeichnis ändern
- Inline Snapshots werden mit
expect().toMatchInlineSnapshot()unterstützt- Mit
bun test -uoder--update-snapshotswerden Snapshots in der Testdatei aktualisiert - Auch
toThrowErrorMatchingSnapshot()undtoThrowErrorMatchingInlineSnapshot()können verwendet werden
- Mit
test.only()funktioniert nicht mehr nur mit dem Flag--only, sondern auch ohne dieses- Der
expect()-API wurden Matcher wie in Jest, Vitest undjest-extendedhinzugefügttoContainValue(),toContainKey()und dietoHaveReturned()-Familie- Als zweites Argument kann eine benutzerdefinierte Fehlermeldung übergeben werden
- Mit
jest.setTimeout()undsetDefaultTimeout()lässt sich das Standard-Test-Timeout für den aktuellen Scope oder das aktuelle Modul ändern
Bundler- und Build-Funktionen
- Bun 1.2 unterstützt HTML import
- Wird eine HTML-Datei an die Option
staticvonBun.serveübergeben, werden<script>und<link>in der HTML-Datei automatisch gebundelt und als statische Route bereitgestellt
- Wird eine HTML-Datei an die Option
bun build --compileunterstützt Cross-Compilation- Unter Linux lassen sich Windows- oder macOS-Binaries erstellen, und auch die umgekehrte Richtung ist möglich
- Bei Windows-Builds können ein Icon gesetzt und das Konsolenfenster ausgeblendet werden
bun build --bytecodeerzeugt einen Bytecode-Cache- Damit kann die Startzeit von Anwendungen wie
eslintum den Faktor 2 beschleunigt werden .jsc-Dateien enthalten den Bytecode-Cache der jeweiligen.js-Datei; beide Dateien werden zur Ausführung benötigt- Der Bytecode-Cache kann achtmal so groß sein wie der Quellcode und verbraucht zugunsten schnellerer Startzeiten mehr Speicherplatz
- Damit kann die Startzeit von Anwendungen wie
- Mit
bun build --format=cjskann CommonJS als Ausgabeformat angegeben werden- Zuvor wurde nur ESM unterstützt
- Das erleichtert die Erstellung von Bibliotheken oder Anwendungen für ältere Node.js-Versionen
- Die CommonJS-Erkennung wurde verbessert
- Wenn eine Datei mehrdeutig ist, wird die
"use strict"-Direktive am Anfang als letzte Heuristik für CommonJS verwendet require.main === modulewird zuimport.meta.mainumgeschrieben und kann zusammen mit import-Anweisungen verwendet werden
- Wenn eine Datei mehrdeutig ist, wird die
- Der Plugin-API wurde der Hook
onBeforeParse()hinzugefügt- Er muss nicht in JavaScript, sondern als N-API-Addon implementiert werden
- In kompilierten Sprachen wie Rust, C/C++ oder Zig kann damit Quellcode unmittelbar vor dem Parsen mit nahezu keinem Overhead bearbeitet werden
- Es handelt sich um eine fortgeschrittene API für Plugin- und Framework-Autoren
- Auch die Build-Optionen wurden erweitert
- Umgebungsvariablen mit
--env="PUBLIC_*"in das Bundle injizieren - Funktionsaufrufe etwa mit
--drop=consoleentfernen - Banner/Footer hinzufügen
- Mit
Bun.embeddedFiles()die Liste der in einem standalone executable enthaltenen Dateien anzeigen - Mit
--ignore-dce-annotationsfehlerhafte Dead-Code-Elimination-Annotationen ignorieren - Mit
--packages=externalfestlegen, dass Paketabhängigkeiten nicht ins Bundle aufgenommen werden
- Umgebungsvariablen mit
CSS-Bundling
- Bun 1.2 implementiert einen neuen CSS-Parser und -Bundler
- Er basiert auf Arbeiten von LightningCSS und wurde von Rust nach Zig neu geschrieben, um in Buns JavaScript/TypeScript-Parser, Bundler und Runtime integriert zu werden
- Mit
bun build ./index.csskönnen mehrere CSS-Dateien sowie@import-,url- und@font-face-Referenzen zu einer einzigen CSS-Datei zusammengeführt werden .css-Dateien können aus JavaScript- und TypeScript-Code importiert werden- Aus dem JavaScript-Module-Graph importiertes CSS und
@import-Regeln werden pro Entrypoint zu einer einzelnen CSS-Datei abgeflacht
- Aus dem JavaScript-Module-Graph importiertes CSS und
- Auch über die API
Bun.build()lassen sich CSS und JavaScript mit derselben API bundeln
Ergänzungen der Bun-Runtime-API
Bun.serve()unterstützt über die Eigenschaftstaticstatische Routen- Der Pfad wird als Schlüssel und ein
Response-Objekt als Wert übergeben - Statische Routen sind bis zu 40 % schneller als die direkte Verarbeitung im
fetch()-Handler - Response Body, Header und Statuscode werden im Speicher gecacht, sodass keine JavaScript-Allocation und keine Garbage Collection anfällt
- Mit
server.reload()lassen sich statische Routen neu laden
- Der Pfad wird als Schlüssel und ein
Bun.udpSocket()stellt einen UDP-Socket in Form einer Bun-API bereit- Auch
node:dgramwird unterstützt, aberBun.udpSocket()ist eine moderne API ähnlich dem bestehendenBun.listen() - Mehrere UDP-Datagramme können mit einem einzigen Syscall gesendet werden, und OS-Backpressure wird berücksichtigt
- Auch
Bun.file()unterstütztdelete(),unlink()undstat()stat()gibt Metadaten in derselben Form wie dasStats-Objekt von Node.jsfs.stat()zurück- Dieselbe API kann auch für S3-Dateien verwendet werden
Bun.color()bietet Farb-Parsing, Normalisierung und Konvertierung- Unterstützt CSS, ANSI-Farbcodes, RGB, HSL usw.
dns.prefetch()kann DNS-Records vorab abrufen und den DNS-Cache beim Start aufwärmen- Mit
dns.getCacheStats()lässt sich der Zustand des DNS-Caches prüfen
- Mit
- Weitere Utilities
Bun.inspect.table(): gibt wieconsole.tableeinen String im Tabellenformat zurückBun.randomUUIDv7(): erzeugt monotone UUID v7, geeignet für Sortierung und Datenbanken
Verbesserungen am SQLite-Client
- Der in Bun integrierte SQLite-Client kann mit
query.as(Class)Query-Ergebnisse auf Klasseninstanzen mappen- Getter, Setter und Methoden können hinzugefügt werden
- Aus Performancegründen werden Klassenkonstruktoren, Default Initializer und private Felder nicht unterstützt
- Da keine Beziehungen verwaltet und kein SQL generiert wird, ist es kein ORM
query.iterate()verarbeitet Zeilen per Iterator, ohne sie alle auf einmal in den Speicher zu laden- Auch das Query-Objekt selbst kann mit einer
for-Schleife durchlaufen werden
- Auch das Query-Objekt selbst kann mit einer
- Wenn die Option
strictaktiviert ist, können bei Query-Parametern die Präfixe$,@und:weggelassen werden- Fehlt ein Parameter, wird ein Fehler geworfen
- Im Ergebnis von
db.run()lassen sich die Anzahl der geänderten Zeilen und die letzte eingefügte Row-ID prüfenchangeslastInsertRowid
- Die Option
safeIntegersgibt 64-Bit-Integer alsBigIntzurück statt als abgeschnittenenumber- Sie kann pro Datenbank oder pro Query gesetzt werden
- Mit der JavaScript-Syntax
usingkönnen Statements und Datenbanken beim Verlassen des Scopes automatisch geschlossen werden
C aus JavaScript kompilieren und ausführen
- Bun 1.2 fügt experimentelle Unterstützung hinzu, um C aus JavaScript heraus zu kompilieren und auszuführen
- Verwendet die
cc()-API ausbun:ffi - Damit lassen sich C-Systembibliotheken aus JavaScript nutzen, ohne separaten Build-Step
- Verwendet die
- Bun enthält
tinycc- Im Gegensatz zu
gccoderclangkann es einfachen C-Code in Millisekunden kompilieren - C-Code kann bei Bedarf kompiliert und ausgeführt werden
- Im Gegensatz zu
- Auch C-Code, der N-API verwendet, wird bereitgestellt
- Funktioniert allein mit Bun, ohne
node-gyp-Build-Schritt
- Funktioniert allein mit Bun, ohne
Unterstützung für musl und Alpine Linux
- Bun 1.2 ergänzt Bun-Builds für Linux-Distributionen, die musl libc statt glibc verwenden
- Nutzbar in Umgebungen wie Alpine Linux
- Unterstützt Linux x64 und aarch64
- In Docker kann das Image
oven/bun:alpineverwendet werden - musl ermöglicht kleinere Container-Images, ist aber tendenziell etwas langsamer als die glibc-Version von Bun
- Wenn es keinen speziellen Grund gibt, wird die Nutzung von glibc empfohlen
JavaScript-Sprachfeatures
- Unterstützung für Import Attributes wurde hinzugefügt
- JSON, Text, TOML usw. können explizit importiert werden, etwa mit
import json from "./package.json" with { type: "json" } - Auch mit dynamischem
import()nutzbar
- JSON, Text, TOML usw. können explizit importiert werden, etwa mit
usingundawait usingwerden unterstützt- Beim Verlassen des Scopes wird
[Symbol.dispose]bzw.[Symbol.asyncDispose]aufgerufen, um Ressourcen automatisch aufzuräumen - Wird von mehreren Bun-APIs unterstützt, darunter
Bun.spawn(),Bun.serve(),Bun.connect(),Bun.listen()undbun:sqlite
- Beim Verlassen des Scopes wird
- Neue Promise-bezogene APIs
Promise.withResolvers(): erzeugtpromise,resolveundrejectauf einmalPromise.try(): umschließt eine synchrone oder asynchrone Funktion als Promise
- Fehler- und Byte-Array-APIs
Error.isError(): prüft genauer, ob etwas ein Error ist, auch bei Manipulationen an der Prototype Chain oder Cross-Realm-Situationen mitnode:vmUint8Array.toBase64()/Uint8Array.fromBase64()Uint8Array.toHex()/Uint8Array.fromHex()
- Iterator Helper wurden hinzugefügt
map,flatMap,filter,take,drop,reduce,toArray,forEach,find
Float16Arraywird unterstützt- 16-Bit-Gleitkomma-Arrays haben geringere Präzision als 32-Bit-Arrays, sind aber speichereffizienter
Ergänzungen der Web APIs
TextDecoderStreamundTextEncoderStreamwerden unterstützt- Das sind die Streaming-Versionen von
TextDecoderundTextEncoder - In Bun ist
TextEncoderStreambis zu 30-mal schneller als in Node.js
- Das sind die Streaming-Versionen von
- Die Option
streamvonTextDecoderwird unterstützt- Chunks können als Teil eines größeren Streams verarbeitet werden, auch wenn sie keinen vollständigen UTF-8-Codepoint enthalten
- Die Methode
bytes()wurde hinzugefügt- Gibt Stream-Daten etwa von
Response,BloboderBun.file()alsUint8Arrayzurück - Reduziert den bisherigen Ablauf über
arrayBuffer()und anschließendes Erzeugen einesUint8Array
- Gibt Stream-Daten etwa von
- Streaming-Uploads mit
fetch()werden unterstützt- Nützlich für Uploads großer Dateien oder Datenstreams, deren Content Length nicht vorab bekannt ist
console.group()undconsole.groupEnd()wurden implementiertURL.createObjectURL()wird unterstützt- Erstellt aus einem
Blobeine URL, die mitfetch(),Workerundimport()verwendet werden kann - Da auch Worker-Skripte durch den Bun-Transpiler laufen, kann TypeScript-Syntax verwendet werden
- Erstellt aus einem
AbortSignal.any()kombiniert mehrereAbortSignals, sodass das übergeordnete Signal ebenfalls abbricht, wenn eines davon abbricht
Verhaltensänderungen und Hinweise zur Migration
- Das Arbeitsverzeichnis von
bun runhat sich geändert- Bisher wurde das aktuelle Arbeitsverzeichnis der Shell verwendet
- In Bun 1.2 wird das übergeordnete Verzeichnis von
package.jsonals Arbeitsverzeichnis für Skripte verwendet - Diese Änderung dient der Angleichung an das Verhalten von
npmundyarn
bun testmeldet uncaught errors oder rejections zwischen Tests als Fehler- Bisher wurden solche Fehler möglicherweise nicht als Testfehler behandelt
server.stop()gibt jetztPromise<void>zurück- Damit kann gewartet werden, bis in-flight HTTP connections geschlossen sind
Bun.build()rejectet bei einem Fehler, statt den Fehler inlogsdes aufgelösten Ergebnisses abzulegen- Wenn das bisherige Verhalten benötigt wird, kann
throw: falsegesetzt werden
- Wenn das bisherige Verhalten benötigt wird, kann
bun -pist nun, wie bei Node.js, ein Alias fürbun --print- Zuvor war es ein Alias für
bun --port
- Zuvor war es ein Alias für
- Der Standardwert von
bun build --sourcemapwurde von inline source maps auf linked source maps geändert- Wenn das bisherige Verhalten benötigt wird,
--sourcemap=inlineverwenden
- Wenn das bisherige Verhalten benötigt wird,
Performance-Verbesserungen
- Bun 1.2 enthält Performance-Verbesserungen in mehreren Ausführungspfaden
node:http2: 2-mal schneller- S3-Uploads über
node:http: 5-mal schneller path.resolve(): 30-mal schneller- DNS resolution bei
fetch(): 2-mal schneller bun --hot: halbierter Speicherverbrauch- macOS
fs.readdirSync(): Lesen kleiner Verzeichnisse 5 % schneller String.at(): 44 % schnelleratob()mit großen String-Eingaben: bis zu 8-mal schneller- Dekomprimierung von gzip-Daten bei
fetch(): 30 % schneller Buffer.from(string, "base64")mit großen Eingaben: 6- bis 30-mal schnellerJSON.parse()mit großen String-Eingaben: 2- bis 4-mal schneller, bei object-Eingaben 6 % schneller- Durchsatz einiger
Bun.serve()-Anwendungen: bis zu 2-mal höher Error.captureStackTrace(): 9-mal schnellerfs.readFile()bei kleinen Dateien: bis zu 10 % schnellerconsole.log()mit String-Argumenten: 50 % schneller
- Unter Windows wurde der JIT von JavaScriptCore aktiviert
- Zuvor war der JIT nur unter macOS und Linux verfügbar
- JavaScript wird unter Windows insgesamt schneller ausgeführt
- Beispielsweise ist
Object.entries()20 % undArray.map()50 % schneller
Installation und Upgrade
- Neue Installationsbefehle
curl -fsSL https://bun.sh/install | bashpowershell -c "irm bun.sh/install.ps1 | iex"npm install -g bun- Nach
brew tap oven-sh/bundannbrew install bun docker pull oven/bun
- Eine bereits installierte Bun-Version wird mit
bun upgradeaktualisiert
1 Kommentare
Meinungen auf Hacker News
Ich verstehe nicht, warum man Datenbanken von Drittanbietern und externe S3-Bibliotheken in die Core-/Standardbibliothek aufnimmt.
Für so etwas wären optionale Bibliotheken doch besser, und eine solche Runtime sollte sehr sorgfältig auswählen, was in die Standardbibliothek kommt.
Schon jetzt wirkt das Projekt, als wolle es wie eine Küchenspüle einfach alles aufnehmen.
Der Ansatz „Batterien inklusive“ ist an vielen Stellen beliebt und ein häufig gewählter Weg.
TypeScript-Konfiguration ist schwierig, und Webpack, S3, Postgres, Jest usw. sind es ebenfalls; deshalb ist auch ein vereinfachter Zugriff auf Dateien und Streams ziemlich interessant.
Man wird sehen müssen, wie Anbieter für verteiltes Deployment darauf reagieren.
Natürlich kann ich mich irren, aber solche Abhängigkeiten in die Core-/Standardbibliothek zu stecken, ergibt tatsächlich nicht besonders viel Sinn.
Er scheint zu glauben, dass Dinge im Core stärker optimiert werden können als Bibliotheken von Drittanbietern.
Persönlich halte ich das für den falschen Ansatz und habe das Gefühl, dass Jared zu ambitioniert geworden ist, aber am Ende ist es eben sein Leidenschaftsprojekt.
Bun formuliert es so: „Bun strebt eine Cloud-first-JavaScript-Runtime an. Das heißt, es unterstützt alle Tools und Services, die nötig sind, um Produktionsanwendungen in der Cloud auszuführen“ – aber das schafft bei mir nicht gerade Vertrauen.
Diese konkrete Designentscheidung wirkt sogar schlechter als bei Node.
Das Problem mit VC-gestützter Software war immer, dass solche Integrationen versuchen, etwas Eigenes zu bieten – anders gesagt: Abhängigkeiten zu schaffen.
Meine Erfahrung mit Bun war bisher sehr gut.
Bei neuen Projekten habe ich mich wegen ständig irgendwo brechender Änderungen immer davor gedrückt, TypeScript/Jest/React/Webpack einzurichten; bei Bun wird das intern gelöst und funktioniert für meine Anwendungsfälle einfach schmerzfrei.
Zu Integrationen von Drittanbieter-Bibliotheken wie S3 oder SQL kann ich schwer etwas sagen, aber zumindest scheint der Fokus auf den am häufigsten genutzten und meistgefragten Dingen zu liegen.
Ich finde gut, dass es dem Node.js-Tool-Ökosystem die nötige Vernunft zurückbringt.
Ich glaube, hier wird unterschätzt, wie stark sich auch andere Tools inzwischen weiterentwickelt haben.
Für mich ist es so etwas wie ein Produktivitäts-Cheatcode.
Es gibt zwar einen kleinen Produktivitätsverlust, weil ChatGPT Bun nicht gut kennt, aber ich mag Bun trotzdem.
Es gibt viel Gutes, aber ich mache mir Sorgen, ob einige Standardverhalten nicht zu sehr in Richtung magisch verstecktes Verhalten gehen.
Wenn man
new Response(s3.file(...))verwendet, lädt Bun die S3-Datei nicht auf den Server herunter und sendet sie an den Nutzer, sondern leitet den Nutzer auf eine vorab signierte URL der S3-Datei um.Als Default ist das eine ziemlich überraschende Wahl, und es ist überhaupt nicht klar, wie man das abschaltet, wenn man den S3-Bucket nicht direkt offenlegen möchte.
Anfangs hatte ich Erwartungen an dieses Projekt, aber angesichts der sporadisch öffentlich werdenden und für mich oft fragwürdigen Designentscheidungen in den sozialen Medien habe ich kein Vertrauen in die langfristige Richtung.
Wenn es bei v0.x geblieben wäre, wäre das in Ordnung gewesen; aber nach einer 1.0 hätte die Messlatte für die Erweiterung der API-Oberfläche deutlich höher liegen müssen.
Response(file.stream())Für mich fühlt es sich wie ein stark nebenwirkungsbehaftetes Verhalten an, und beim Lesen sieht es so aus, als würde nicht eine URL, sondern der Dateiinhalt zurückgegeben.
Trotzdem interessiert mich, was genau an der Offenlegung des Buckets stört.
Es ist ja eine vorab signierte URL, also gewährt sie keinen breiten Zugriff.
Eine explizite API wie
Response((file(...).getPresignedURL()))wäre besser gewesen, oder eine Option, dieses Verhalten per Umgebungsvariable oder Bun-Konfiguration zu aktivieren.Batteries included macht einen großen Unterschied
Genau deshalb gefällt mir auch, dass Web-APIs wie Fetch API, Service Workers, Web Components, ES6+ und WebRTC inzwischen sowohl in V8- als auch in WebKit-Runtimes nativ sind
Allerdings braucht es Maß und Ziel
S3 könnte zu weit gehen, aber SQL-Treiber ergeben Sinn
Trotzdem stellt sich die Frage, wo man die Grenze zieht
Es gibt sehr viele Datenbanken; sollte man für die Hälfte davon Treiber einbauen?
Schon auf diesem Niveau käme viel zusätzlicher Code dazu, was die ausführbare Datei verlangsamen könnte
Außerdem kann man bei einer so sensiblen API in Bun auch Sicherheit übersehen
Stell dir vor, irgendein Skript oder ein Pfadproblem führt dazu, dass
evalausgeführt wird und Bun die gesamte Quelldatei in ein privates S3 hochlädt – dann ist es vorbeiJe nachdem, wie Code zur Laufzeit geladen wird, könnte das meiner Ansicht nach fast vernachlässigbar sein
Wenn das Laden von Code nur dann ausgelöst wird, wenn eine
import-Anweisung auftaucht, gibt es dann nicht praktisch keinen Geschwindigkeits-Overhead?Selbst wenn statisch gelinkt wird, verstehe ich nicht ganz, warum die bloße Existenz von Code die ausführbare Datei in nennenswertem Maß verlangsamen sollte
Die ausführbare Datei, die in den Speicher geladen werden muss, ist dann zwar buchstäblich größer, aber eine spürbare Verlangsamung dürfte das nicht sein
Im Kern geht es darum, wer die Verantwortung für die Wartung der Bibliothek trägt und wie diese Bibliothek geändert wird, wenn sich SQLite ändert
Wenn es in SQLite einen Bug gibt, wie wird er in Bun behoben?
In welche Versionen müssen die Fixes einfließen?
Ein Patch der Runtime kann das Verhalten des darauf laufenden Codes ändern; wie geht man damit um, wenn Nutzer Workarounds für das bisherige Verhalten eingebaut haben?
Bis zu einem gewissen Grad sind das lösbare Probleme, aber sie bringen auch Nachteile mit sich
Ab einem bestimmten Punkt ist es keine Runtime mehr, sondern eine Plattform, und damit kommen andere Verantwortlichkeiten und Probleme
Es ist zwar kein echter Webstandard, aber etwas, worauf sich viele Leute faktisch wie auf einen Standard einstellen
Ein Kunde setzt Bun seit Kurzem in Produktion ein
Ich habe gehört, dass die Developer Experience von Bun wegen Geschwindigkeit und Einfachheit absurd gut ist
Developer Experience spielt langfristig eine große Rolle
Wenn Codebasis oder Prozesse ein Chaos sind, verliert man gute Leute, sofern man keine FAANG-ähnliche Vergütung zahlt
Ich habe Bun noch nicht ausprobiert, aber die Feature-Liste ist so lang, dass ich skeptisch bin, ob alles davon robust und fehlerfrei ist
Ich hoffe, ich liege falsch, und will es in einem späteren Projekt einmal laufen lassen
Aus Projektmanagement-Sicht bin ich etwas verwirrt, warum man Zeit in S3-Support steckt, obwohl noch nicht einmal 100 % Node.js-kompatibel ist
Next.js ist ein sehr großes Ökosystem; wenn man Next.js-Kunden gewinnen kann, lässt sich damit deutlich stärker wachsen als mit S3-Support
Wie viel der gesamten Node.js-API-Oberfläche nutzt man im Alltag tatsächlich?
Und wie sehr verlässt man sich wirklich auf die seltsamen Edge Cases darin?
Die Leute, die daran arbeiten, sind auch keine Roboter
Manche Aufgaben brauchen Zeit, bis man sie verstanden hat, und währenddessen kann man an anderen Dingen arbeiten
Es macht auch nicht eine einzige Person alles
„Mit Next.js-Kunden wächst man stärker“ – aber Wachstum in Richtung was?
Das bringt kein Geld
Das hier ist ein VC-finanziertes Projekt, und das Ziel ist nicht, Bun kostenlos bereitzustellen, um alle Nutzer weltweit zu gewinnen
Zig hat eine sehr geringe Speichersicherheit
Wenn man auf eine Variable verweist, die nicht mehr lebt, greift man statt eines Segmentation Fault auf beliebigen, nicht zusammenhängenden Speicher zu
Angeblich sogar im Debug- und Safe-Modus[0]
Ist es wirklich so schwer, darüber ein Memory-Liveness-System zu legen, das Variablennamen als tot markiert und den Zugriff verhindert, wenn sie tot sind?
Am Ende heißt es dann: „Verwende kein undefiniertes Verhalten“[1]
Deshalb möchte ich nichts, was in Zig geschrieben ist, als dem Internet ausgesetzten Webserver betreiben
[0] : https://news.ycombinator.com/item?id=41720995
[1] : https://github.com/ziglang/zig/issues/16467#issuecomment-164...
Ich habe es letztes Jahr ausprobiert, und es ist ständig abgestürzt
bun addLeerzeichen und Einrückungen inpackage.jsonnicht beibehalten hat, und dass es jetzt selbst die seltsamste Einrückung bewahrt, ist ziemlich lustigIch weiß nicht, wer so etwas gefordert hat und warum man es für lohnend hielt, dafür Code zu schreiben
HTML-Imports sind großartig und cool
Mit Unterstützung für HTML-Imports in Bun 1.2 soll sich die gesamte Frontend-Toolchain durch eine einzige
import-Anweisung ersetzen lassenMan kann loslegen, indem man den HTML-Import an die Option
staticvonBun.serveübergibtSind Hot Module Replacement, CSS-Preprocessing und das Laden framework-spezifischer Plugins wie des Vue-SFC-Compilers möglich?
Das Serven statischer Dateien ist ja nichts wirklich Neues, also übersehe ich vermutlich etwas
Ich dachte, es gebe kaum ein Projekt, dessen Scheitern so vorprogrammiert sei wie bei einer Konkurrenzalternative zu Node.js, aber es war gut, es einmal ausprobiert zu haben.
Ich musste viele eigenständige Skripte erstellen, die Updates an Textdateien und SQLite-Datenbanken verarbeiten, und konnte TypeScript,
bun:sqlite[1] undbun $ Shell[2] direkt nutzen, ohne Konfigurationsdateien oder die Verwaltung lokaler npm-Abhängigkeiten.Danach habe ich es auch in neuen JS-/TypeScript-Projekten ausprobiert; der eingebaute Bundler [3] und die Test-Unterstützung [4] kamen ebenfalls zum Einsatz, und die Installation der Abhängigkeiten war sofort erledigt.
Dass alles schnell und sofort funktioniert, ist im Alltag eine echte Verbesserung der Lebensqualität, und inzwischen ist Bun meine erste Wahl für neue JS-Projekte.
[1] https://bun.sh/docs/runtime/shell
[2] https://bun.sh/docs/api/sqlite
[3] https://bun.sh/docs/bundler
[4] https://bun.sh/docs/cli/test
Ich war auch auf der Linie: „Diese Dinge werden nächstes Jahr sowieso alle in npm landen, also was soll das bringen?“
Am Ende habe ich Bun ausprobiert und war wirklich überrascht.
Wenn sich die kleinen Details der Developer Experience summieren, macht das einen großen Unterschied.
In meinen Projekten fühlt sich Bun wirklich wie die nächste Generation an.
Ich habe Bun vor Kurzem zum ersten Mal ausprobiert, und die Erfahrung war großartig.
Für all meine Projekte ist Webpack oder Vite eingerichtet, um TypeScript zu verwenden; wenn es einmal konfiguriert ist, funktioniert es fast perfekt, aber die Einrichtung selbst ist mühsam und lohnt sich für kleine Skripte nicht.
Bun dagegen funktionierte sofort.
Um TS auf der CLI „direkt“ auszuführen, habe ich 10 bis 30 Minuten mit irgendeinem Tool wie
node-tsoder so herumprobiert, mich mit schrecklichen Meldungen wie „kein Modul“, „import/require kann nicht verwendet werden“ und „ESM/CJS“ herumgeschlagen und alle üblichen Fixes versucht: den Modultyp inpackage.jsonändern,tsconfiganpassen und zwischenimport/requirewechseln.Als letzten Ausweg habe ich für ein etwa 200 Zeilen langes Skript auf Bun gewechselt, und es funktionierte hervorragend.
node --experimental-strip-types index.tsWenn man kein aktuelles Node nutzt, hat das Paket
tsxbei mir gut funktioniert.Es war besser als
ts-node.Allerdings verwerfen beide Optionen die Typinformationen einfach, und Bun macht das genauso.
Mir gefällt die Richtung.
Besonders die Aufnahme von nativer Unterstützung für S3 und Postgres ist sehr sinnvoll, weil sie eine brauchbare Alternative zum heutigen Zustand bietet, in dem man sich sein Framework selbst zusammensteckt.
In allen Web-Frameworks wie Rails und Laravel ist das Standard, und das JS-Ökosystem kann davon stark profitieren.
Als nächsten Schritt sehe ich Migrationen und Schema-Management sowie eine bessere Standard-Testerfahrung, mit der man Factory-Setups gut handhaben kann.