Deno wird 1: Das steckt hinter der Node.js-Alternative mit dem Dino im Logo

Das Logo von Deno ist ein Dino. (Bild: deno/github.com/hashrock)
Deno kommt standardmäßig mit einigen Security-Vorkehrungen.
Angenommen, ihr wollt über console.log( Deno.cwd() )
das aktuelle Working-Directory ausloggen. Solche Skripte könnt ihr via deno run
über die Kommandozeile ausführen – allerdings nicht, ohne vorher die Erlaubnis zur Ausführung solcher Aktionen innerhalb der Runtime zu erteilen. In diesem konkreten Fall erreichen wir das über die –-allow-read-flag
:
deno run --allow-read main.ts
Dahinter steckt eine Sache namens Sandbox, die Programme davon abhält, Dinge zu tun, die ihr nicht erlauben wollt. Das ist nützlich, wenn ihr ein JS-Programm außerhalb des Browsers ausführen wollt, aber nicht wollt, dass es auf innerhalb eures Systems einfach so auf alles Mögliche zugreift.
In Node.js gibt es nichts, was eine Node.js-App davon abhält, zum Beispiel eure SSH-Keys abzugreifen und sie an einen Server weiterzuleiten. Dagegen kann sich schützen, wer darauf achtet, nur Pakete von vertrauenswürdigen Urhebern zu installieren. Ein bisschen Sicherheitsrisiko ist da aber immer noch, auch diese Pakete können gehackt werden.
Mittels der Sandbox repliziert Deno das Permission-Modell des Browsers – auch im Browser ausgeführtes JS benötigt eure explizite Erlaubnis für die Ausführung jeglicher Aktion auf eurem System. Weitere Flags, über die ihr Deno Erlaubnisse erteilen könnt, sind zum Beispiel --allow-write
oder --allow-net
.
Eine Sache, die TypeScript-Nutzer begeistern dürfte, ist, dass Deno – wie TypeScript seit V 3.8 – top-level-await implementiert.
In Deno könnt ihr über die fetch-API einen Network-Request ausführen – als würdet ihr euch im Browser befinden:
const res = await fetch( ‘https://t3n.de’ );
Und weil Deno top-level-await unterstützt, braucht ihr dafür nicht einmal eine async
-Funktion.
Deno will euren Code so browserkompatibel machen wie möglich. Die Runtime beinhaltet ein window
-Objekt mit Lifecycle-Events,
window.onload = event => console.log( ‘t3n says hi 🦕’ )
auf die ihr Event-Listener ansetzen könnt. Das ermöglicht es, Code zu schreiben, der sowohl browser- als auch serverseitig ausgeführt werden kann.
Deno kann außerdem auch WebAssembly-Binaries ausführen.
const wasmBinary = new Uint8Array([ 0, 23, 77]);
const wasmModule = new WebAssembly.Module(wasmBinary);
Eine Sache, die in Deno allerdings nicht funktioniert, sind npm-Pakete. Deno ist Runtime- und Package-Manager in einem und damit nicht mit dem separaten Paketmanager kompatibel. In Deno könnt ihr Pakete stattdessen mittels ES-Module-Syntax via deren URL importieren, zum Beispiel so:
import { serve } from ‘ https://deno.land/std/http/server.ts’ ;
Remote-Modules werden via URL referenziert. Wenn ihr ein Skript das erste Mal ausführt, wird dessen Code lokal gespeichert und gecached. Es gibt keine package.json. Code kann über jede URL referenziert werden, ähnlich, wie das auch im Browser funktioniert.
Deno verfügt über eine Auswahl an Standard-Modulen für häufige Use-Cases. Zum Beispiel könnt ihr wie oben im Beispiel über das http-Modul serve
importieren und es nutzen, um einen Server zu erstellen, der wie eine async-Iterable gehandhabt wird:
// main.ts
import { serve } from ‘https://deno.land/std/http/server.ts’;
const s = serve({ port: 8000 });
for await (const req of s)
req.respond( {body: ‘Deno 🦕 is cool’} );
Ausführen könnt ihr das Ganze dann über deno run --allow-net main.ts
Deno wurde am Mittwoch in V 1.0 released. Kurzfristig wird die Runtime Node.js sicher nicht ersetzen. Node schafft ein geschlossenes Ökosystem, das mittlerweile relativ stabil ist. Ob die JavaScript-Entwickler-Community sich auf längere Sicht zugunsten des Dinos von Node.js abwenden wird, bleibt abzuwarten. Wer sich die Runtime genauer anschauen will, findet auf der Website zum Projekt neben einem Blogpost zu V 1.0 auch ein ausführliches Manual, die Standard-Library und alle bislang unterstützten Third-Party-Module.
Zum Weiterlesen: Web-Development jetzt und später: 3 ½ Vorhersagen, die du lesen solltest
Bitte beachte unsere Community-Richtlinien
Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.
Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.
Dein t3n-Team