Bun 1.4 hat gerade 15 deiner Abhängigkeiten gelöscht

BBetter Stack
Computing/SoftwareInternet Technology

Transcript

00:00:00Buns größtes und umstrittenstes Update ist gerade erschienen: Bun 1.4, der Rust-Rewrite.
00:00:04Ich habe ja schon früher ein Video über das Rewrite-Drama gemacht, konzentrieren wir uns also auf das Neue,
00:00:07denn manches davon gefällt mir wirklich gut, besonders die Neuerungen in der Standardbibliothek,
00:00:11da Bun jetzt einen integrierten Headless-Browser, eine Bildbibliothek, ein Pseudoterminal, Markdown,
00:00:15Cronjobs, Tabellen und mehr bietet und damit 15 Dependencies ersetzt, die ihr vielleicht nutzt.
00:00:19In den letzten Jahren war das Fehlen einer Standardbibliothek eine der größten Beschwerden
00:00:23über JavaScript. Bun behebt das nun, was in einer Welt wöchentlicher Supply-Chain-Angriffe ein ziemlich guter Schritt ist.
00:00:30Als Erstes können wir Playwright und Puppeteer deinstallieren und stattdessen Bun WebView verwenden.
00:00:37Mit diesem Code hier kann ich einen Headless-Browser steuern, den Abonnieren-Button finden und anklicken,
00:00:41wobei ich das noch nicht auf eurem Rechner ausführen kann, ihr müsst also selbst auf Abonnieren klicken.
00:00:44Alle Eingabemethoden wie Click, Type, Press und Scroll lösen native Browser-Ereignisse aus,
00:00:48sodass die Seite denkt, ihr wäret ein echter Nutzer. Unter Mac nutzt dies das systemseigene Webkit,
00:00:52also die Safari-Engine, wodurch nichts installiert werden muss. Wenn ihr jedoch eine Chrome-Instanz wollt,
00:00:56könnt ihr die Backend-Option auf Chrome stellen, wodurch eine installierte Chrome- oder Chromium-Instanz genutzt wird,
00:01:01was ihr tun würdet, wenn ihr Windows oder Linux verwendet. Dies kann tatsächlich einen Headless-Chrome-
00:01:04Unterprozess starten oder sich mit einer bereits laufenden Chrome-Instanz verbinden. Mit diesem Code hier
00:01:09kann ich also die offene Version von Chrome auf meinem Mac steuern, komplett über Bun. Darüber hinaus
00:01:13könnt ihr auch Evaluate nutzen, um JavaScript auf der Seite auszuführen und die Ergebnisse als native
00:01:17JavaScript-Werte zurückzubekommen. Und falls es für eine gewünschte Funktion noch keine API gibt, könnt ihr auf
00:01:21die rohen CDP-Befehle zurückgreifen. Ich sehe das als ziemlich gut für einige leichtgewichtige Browser-Automatisierungen an,
00:01:25wobei es Playwright meiner Meinung nach noch nicht vollständig ersetzt – es hat keinen Test Runner oder Trace Viewer,
00:01:29aber für Dinge wie Scraping oder Computer-Use-Skripte ist es keine schlechte Option.
00:01:32Als Nächstes deinstallieren wir Sharp und verwenden stattdessen Bun.image. Dies ist eine vollständige Bildbibliothek,
00:01:37mit der wir eine Datei nehmen, .image darauf aufrufen und dann Operationen verketten können, wie Größenänderung, Drehen,
00:01:42Spiegeln (horizontal und vertikal), Anpassen von Helligkeit und Schärfe sowie Konvertierung in eine Reihe
00:01:46verschiedener Bildformate. Außerdem lassen sich Metadaten wie Breite, Höhe und Format auslesen,
00:01:50ohne die Pixeldaten zu decodieren. Eine weitere tolle Option, die ich wirklich mag, ist die Möglichkeit, ein
00:01:54Platzhalterbild zu erstellen. Dies ist eine qualitativ minderwertige Version, die ihr in HTML einbinden könnt, bevor das echte Bild
00:01:59lädt. Bun.image ist eines der Features, auf deren Nutzung ich mich am meisten freue, da ich bei Deployments
00:02:04und Builds schon öfters probleme im Zusammenhang mit Sharp hatte. Wenn ich jetzt Bun verwende,
00:02:08muss ich darüber nicht mehr nachdenken. Ich muss auch nicht mehr über Marked nachdenken, da wir jetzt
00:02:12einfach Bun.markdown zum Parsen von Markdown verwenden können. Das umfasst drei APIs.
00:02:16Bun.markdown.html rendert Markdown in einen HTML-String. Bun.markdown.render rendert Markdown mit
00:02:22benutzerdefinierten Callbacks für jedes Element. Das gibt euch die Flexibilität, HTML mit eigenen CSS-Klassen,
00:02:27ANSI-Terminalausgaben oder jedem anderen String-Format zu rendern. Bun.markdown.react rendert Markdown in React.jsx,
00:02:33und auch hier könnt ihr für jedes Element jede beliebige Komponente übergeben, um wirklich sehr
00:02:37schön gestaltetes Markdown zu erhalten. Es gibt zudem eine Reihe von Optionen, die ihr umschalten könnt, um die
00:02:41gewünschten Markdown-Funktionen zu steuern. Ihr könnt Dinge wie GitHub-formatierte Tabellen, Autolinks,
00:02:45Überschriften-IDs und Wiki-Links nutzen – wobei eine Warnung darauf hinweist, dass die HTML-Ausgabe nicht bereinigt wird.
00:02:50Rohes HTML, Event-Handler-Attribute, JavaScript – all das gelangt ungeprüft hindurch. Wenn ihr also
00:02:54Markdown rendert, das von Nutzern geschrieben wurde, ist das nach wie vor ein Problem, das ihr selbst lösen müsst. Unabhängig davon wird heutzutage so viel
00:02:59Markdown generiert, dass dies für mich eine ziemlich gute Ergänzung zu sein scheint. Weiter geht's: Ihr
00:03:03könnt jetzt Node.pty deinstallieren. Bun.terminal bietet ein integriertes Pseudoterminal, mit dem ihr
00:03:08Bash, Vim oder HTOP aus JavaScript heraus steuern könnt. Wer schon mal versucht hat, ein Terminal in einer Electron-App auszuliefern,
00:03:12kennt diesen Schmerz. Dies ist eigentlich eine Erweiterung von Bun.spawn. Ihr übergeben die Terminal-Option und es
00:03:17startet einen Unterprozess mit einem angehängten Pseudoterminal. Der Unterprozess sieht ein echtes Terminal, was
00:03:22farbige Ausgaben, Cursor-Bewegungen und interaktive Eingabeaufforderungen ermöglicht. Und sobald ihr ein Terminal habt, könnt ihr
00:03:26Daten in dieses Terminal schreiben, die Größe des Terminals ändern, das Terminal schließen und vieles mehr. Ihr könnt außerdem
00:03:31einen eigenen Terminal erstellen, den Sie über Subprozesse hinweg wiederverwenden können. Ich erkenne ein Muster
00:03:35in all diesen Funktionen zu erkennen. Sie wirken wie etwas, das Claude Code verwenden würde, daher wünschte ich,
00:03:39sie würden das als Open Source veröffentlichen, damit wir sehen könnten, wie diese Features in großem Maßstab eingesetzt werden. Die nächste Dependency, die wir
00:03:43deinstallieren, ist Node.cron, da wir jetzt einfach Bun.cron verwenden können. Wenn ihr dem eine Funktion übergebt,
00:03:47läuft sie einfach in der Event-Loop ohne beteiligten System-Cron. Wenn ihr jedoch ein Skript übergebt,
00:03:51registriert dies einen Cronjob auf Betriebsebene – konkret Crontab unter Linux, launchd unter macOS
00:03:56und den Aufgabenplaner unter Windows. Ihr könnt die Standard-Cron-Syntax verwenden, einschließlich Wochentagen und Helfern wie
00:04:01daily, und es unterstützt auch das Parsen dieser Cron-Syntax, was das nächste passende Datum
00:04:05in der lokalen Zeitzone des Systems zurückgibt. Apropos Zeitzonen: Alle Jobs laufen standardmäßig in der Ortszeit,
00:04:11aber es gibt explizite Optionen, um dies zu ändern, sodass ihr genau wisst, wann etwas ausgeführt wird.
00:04:15Als Nächstes auf meinem Plan steht die Empfehlung, concurrently oder npm-run-all zu deinstallieren, denn Bun hat jetzt
00:04:20eine eigene parallele Option. Mit diesem Flag könnt ihr mehrere package.json-Skripte gleichzeitig ausführen,
00:04:24wobei der Ausgabe übersichtlich der Name des Skripts vorangestellt wird. Es erlaubt auch die Verwendung von Glob-Mustern
00:04:28für Skriptnamen, bietet einen Filter dafür, in welchen Paketen innerhalb eures Workspaces der Befehl ausgeführt
00:04:32werden soll, und enthält zudem eine Option, damit die anderen Skripte weiterlaufen, falls eines davon einen Fehler wirft. Außerdem
00:04:37muss es nicht nur parallel sein; ihr könnt auch sequential nutzen, um Skripte nacheinander auszuführen,
00:04:41mit demselben vorangestellten Präfix in der Ausgabe und denselben Filterfunktionen. Das ist wahrscheinlich das Feature, das ich
00:04:45am häufigsten nutzen werde. Unser nächstes Deinstallationsziel ist jegliche Tar-Archiv-Bibliothek. Bun.archive ist eine schnelle, native Implementierung
00:04:50von Tar und Gzip. Das Erstellen eines Archivs funktioniert über ein Objekt, bei dem die Schlüssel die Pfade und die Werte die
00:04:55Inhalte sind – und die Inhalte können alles sein: von einem String, Blob, Uint8Array bis hin zu einem ArrayBuffer. Für die Komprimierung
00:05:00könnt ihr auch die Option compress auf gzip setzen, mit einem Level von 1 bis 12. Natürlich lassen sich diese
00:05:05danach auch wieder extrahieren, mit Optionen wie einem Glob-Muster, um nur bestimmte Dateien zu entpacken. Ein Feature, das mir besonders
00:05:10gefällt, ist, dass ihr ein Archiv lesen könnt, ohne es zu extrahieren. Dieser Code hier kann lodash aus der NPM-
00:05:14Registry herunterladen und dessen package.json auslesen, ohne dass auch nur eine einzige Datei entpackt wird. Bisher haben wir den Bedarf
00:05:19an etwa 7 NPM-Paketen beseitigt, und es kommt noch mehr, auch wenn es sich hierbei um kleinere Features handelt, sodass wir
00:05:24schneller durchkommen. Erstens: Bun.serve kann jetzt statische Dateien ausliefern und ersetzt damit den Bedarf an
00:05:28serve-static, was großartig für den Public-Ordner eurer Website ist. Zweitens: Bun hat Unterstützung
00:05:33für JSON5 und XML hinzugefügt, sodass ihr deren Pakete nicht mehr benötigt. Ihr könnt beide Formate in Bun importieren, parsen und stringifizieren.
00:05:38Die letzten drei sind Helfer fürs Terminal: Wir haben Bun.sliceAnsi, Bun.wrapAnsi
00:05:43und Bun.stringWidth, die euch ein terminalspalten-bewusstes Schneiden, Umbrechen und Messen ermöglichen
00:05:47und damit Pakete wie slice-ansi, cli-truncate, wrap-ansi und string-width überflüssig machen.
00:05:52Insgesamt sind damit rund 15 Pakete verschwunden, und ich habe erst etwa die Hälfte dieses Releases abgedeckt.
00:05:56Das TL;DR dieses Blogbeitrags ist, dass vieles schneller geworden ist, die CPU-Auslastung sich verbessert hat, der Start
00:06:01beschleunigt wurde und das Binary trotz all dieser Funktionen um 17% kleiner geworden ist. Oh, und es ist in Rust geschrieben.
00:06:06Ein erwähnenswertes Bonus-Feature ist, dass Bun.install einen globalen virtuellen Store erhalten hat.
00:06:10Wenn ihr den isolierten Linker aktiviert, werden Pakete einmal auf eurem Rechner entpackt und per Symlink
00:06:14mit euren node_modules verknüpft, anstatt in jedes einzelne Projekt separat kopiert zu werden. Dies sollte
00:06:19das Ganze beschleunigen und außerdem Speicherplatz sparen, wenn man viele Projekte hat. Was denkt ihr also jetzt über Bun?
00:06:23Nutzt ihr es? Werdet ihr eines dieser Features verwenden? Lasst es mich in den Kommentaren wissen,
00:06:27moment mal, abonnieren nicht vergessen, und wie immer: Bis zum nächsten Mal.
00:06:36Wir sehen uns beim nächsten Mal.

Key Takeaway

Bun 1.4 veröffentlicht eine umfassende Standardbibliothek mit 15 integrierten Tools und einem Rust-Rewrite, wodurch zahlreiche externe npm-Abhängigkeiten überflüssig werden und die Binärgröße um 17 Prozent sinkt.

Highlights

  • Bun 1.4 bringt 15 integrierte Bibliotheken mit und ersetzt damit gängige npm-Abhängigkeiten wie Playwright, Sharp und Marked.

  • Das neue Release beinhaltet eine integrierte Bildbibliothek namens Bun.image, welche Größenänderungen, Formatkonvertierungen und Metadaten-Auswertungen ohne Pixeldecodierung unterstützt.

  • Bun 1.4 reduziert die Binärgröße trotz der vielen neuen Funktionen um 17 Prozent.

  • Ein globaler virtueller Store in Bun.install speichert Pakete nur einmal auf dem Rechner und verknüpft sie per Symlink mit node_modules.

Timeline

Neue Standardbibliothek und Headless-Browser

  • Bun 1.4 integriert einen Headless-Browser namens Bun WebView.
  • Das Tool steuert systemeigenes Webkit unter Mac oder Chromium-Instanzen unter Linux und Windows.
  • Playwright und Puppeteer lassen sich durch diese native Lösung teilweise ersetzen.

Das größte Update von Bun bringt zahlreiche Werkzeuge in die Standardbibliothek, um Supply-Chain-Angriffe zu reduzieren. Bun WebView führt native Browser-Ereignisse aus und ermöglicht Web-Scraping sowie Automatisierungen direkt über JavaScript.

Bildbearbeitung, Markdown und Pseudoterminals

  • Bun.image ersetzt die Bildbibliothek Sharp für Transformationen und Metadaten.
  • Bun.markdown konvertiert Markdown-Dateien in HTML, React oder benutzerdefinierte Formate.
  • Bun.terminal steuert Bash, Vim oder HTOP direkt aus JavaScript.

Entwickler können dank Bun.image Bildoperationen wie Skalierung und Formatwechsel direkt verketten. Bun.markdown unterstützt verschiedene Render-Modi für Strings und React-Komponenten. Das integrierte Pseudoterminal löst bisherige Probleme beim Ausliefern von Terminals in Electron-Anwendungen.

Cronjobs, Parallele Skripte und Archive

  • Bun.cron ersetzt Node.cron für ereignisbasierte und systemweite Cronjobs.
  • Integrierte parallele und sequentielle Skriptausführungen ersetzen concurrently oder npm-run-all.
  • Bun.archive implementiert Tar und Gzip nativ zur Erstellung und zum Lesen von Archiven ohne Entpacken.

Das Framework führt systemweite Cronjobs auf Betriebsebene aus und unterstützt gängige Cron-Syntax. Mehrere package.json-Skripte laufen nun parallel oder nacheinander mit Namenspräfixen. Zudem liest Bun.archive Paketdaten direkt aus Archiven, ohne diese vorher zu entpacken.

Zusätzliche Helfer, Performance und virtueller Store

  • Bun.serve, JSON5 und XML-Parser sowie ANSI-Helfer ersetzen weitere kleinere npm-Pakete.
  • Die Binärdatei schrumpft um 17 Prozent bei verbesserter CPU-Auslastung.
  • Bun.install führt einen globalen virtuellen Store mit Symlinks ein.

Das Release entfernt insgesamt rund 15 Abhängigkeiten aus Projekten. Statische Dateien werden direkt über Bun.serve ausgeliefert. Der neue globale virtuelle Store spart Speicherplatz, indem Pakete nur einmal lokal entpackt und verlinkt werden.

Community Posts

No posts yet. Be the first to write about this video!

Write about this video