Das Deno-Logo schiebt sich vor eine stilisierte Erdkugel

State of the Web 2022: Deno – das neue Node.js schon heute?

Lesezeit
8 ​​min

In diesem Artikel möchte ich die Fragen klären: Sollte man Deno heute schon in seinen Stack aufnehmen? Was bringt es gegenüber Node.js mit und wo sind die Unterschiede?

Deno Core

An dieser Stelle erspare ich euch und mir die Geschichte von Deno. Nur so viel: Deno wurde von Ryan Dahl als Haupttreibender entwickelt. Genau, das ist derselbe, der auch für Node.js verantwortlich ist!

Und jetzt kommen wir direkt zu der eigentlichen Frage: Was sind die großen Unterschiede zwischen Node.js und Deno?

Die gute Nachricht

Deno noch Node.js werden in TypeScript geschrieben. (Ich gehe mal davon aus, dass auch ihr Node.js mit Typescript verwendet – und falls nicht, kann man Deno auch ohne Typescript (pures Javascript) verwenden). Somit sollte sich jede:r Node.js-Entwicklerin schnell bei Deno wohlfühlen, da man, bis auf wenige Ausnahmen, dieselbe Syntax und Herangehensweisen zum Lösen seiner Probleme nutzen kann.

Mit anderen Worten:

Deno:
Node.js + Typescript:

Wie man sieht, sind sich die beiden Sprachen ziemlich ähnlich.

Unterschiede von Deno gegenüber Node.js

  • Keine package.json
  • Standard Linter und Formatter, Tests, builder, compiler (unstable) etc.
  • Web API Support (dieselben, die auch ein Browser unterstützt)
  • Worker für Multi-threading
  • Permissions (Zugriff auf Disk und Fetch Calls etc. müssen explizit freigegeben werden)
  • Lib Imports passieren über URL´s

Wie fühlt es sich an?

Um loszulegen sollten wir drei Dinge tun:

  • Deno auf dem System installieren
  • Extension für IDE installieren (in meinem Fall VS-Code)
  • Eine TS-Datei anlegen.

Fertig!

Jetzt geht es an die eigentliche Entwicklung. Hier nehme ich mal das Beispiel von der Webseite selbst: main.ts.

Wir brauchen hier die /http/server.ts, mit der wir es instellieren können (macht ein deno run aber auch von selbst):

  • deno install https://deno.land/std@0.119.0/http/server.ts
  • Das Ganze nun mit deno run main.ts ausführen.

Wir bekommen eine Fehlermeldung:

Die Fehlermeldung sagt es schon. Wir sind nicht berechtigt, auf den Port 8000 zuzugreifen. Dadurch muss das Ganze mit deno run –allow-net main.ts ausgeführt werden.

Jetzt meldet sich aber mein Security-Gewissen: Wenn ich jetzt –allow-net ausführe, sind ja alle Netzwerk-Requests freigeschaltet! Um das zu verhindern, kann auch spezifisch mitgeben werden, welche IP-Adressen auf welchem Port freigeschaltet sein sollen.

Das sieht dann wie folgt aus:

deno run –allow-net=0.0.0.0:8000 main.ts

Das gilt dann sowohl für Adressen, die man öffnen darf, als auch für URL-Ressourcen, die die Applikation „Fetchen” darf.

Deno Kommandos Best Practice

Nun stellt sich aber die Frage: Wenn ich jetzt noch auf die Festplatte lesend zugreife –allow-read=<allow-read> und auf Dateien schreibend –allow-write=<allow-write>, dann wird das ein langer Startbefehl:

deno run –allow-read=config.yml –allow-write=temp/,output/ –allow-net=0.0.0.0:8000 main.ts

Hier hat sich unter den Deno-Entwickler:innen das gute alte makefile wieder etabliert:

Somit kann man nun mit make run die Applikation starten.

Import Best Practice

Auch stellt sich mir eine weitere Frage: Wie mache ich am besten den Import über URL?

Jetzt ist dort die Versionsnummer enthalten. Wenn ich sicherstellen will, dass meine Anwendung immer auf einem aktuellen Stand bleibt, muss ich ja immer alle Files durchsuchen, um die Versionen direkt im Import upzudaten.

Für dieses Problem gibt es eine alte und eine neue Lösung:

Alte Lösung: Schreibe eine lib.ts und erstelle dort alle externen Imports und Exports.

Neue Lösung: Benutze eine import_map.json.

Diese kann auch mit „deno.importMap“: „./import_map.json“  VSCode in den Projekteinstellungen bekannt gemacht werden.
Dann sieht die main.ts wie folgt aus:

Zum Glück haben wir ein makefile , da sich der Startbefehl noch mal verlängert:

Web API

Da Deno die Standard Web API implementiert, sind auch (fast) alle im Browser verfügbaren Standards, auch bei Deno verfügbar. Prominente Beispiele sind:

Dies ist ein großer Vorteil gegenüber Node.js! Denn so ist z. B. Server Side Rendering weniger aufwendig zu Implementieren, da alle Browser-Funktionen von Haus aus vorhanden sind.

Serverside Rendering von JSX

Ja auch das ist möglich … So versteht Deno von Haus aus JSX (Deno Manual) und kann somit z. B. React rendern oder statischen Code generieren. Ein Projekt das sich darum bemüht: alephjs

Compile

Mit dem Command deno compile lässt sich auf dem Projekt ein self-contained executable bauen. Dadurch wird keine Deno-Runtime auf dem eigentlichen Server/Docker Container benötigt.

Auch hier gilt es zu beachten: Alle Permission und import-map-Kommandos müssen wieder mit angegeben werden.

Es ist also wieder ein Fall für unser makefile!

Fazit zu Deno

Sicherheit

Mit der Möglichkeit, einschränken zu können, welche Netzwerk-Calls erlaubt sind oder auf welche Dateien/Ordner zugegriffen werden darf etc., hält Deno von Haus aus, wichtige Sicherheitsfeatures parat.

Performance

Mit Hinblick auf die Performance geben sich NodeJS und Deno nicht viel. Jedoch sei gesagt, dass durch die Möglichkeit des Kompilierens bei Deno noch Potenzial nach oben ist und es in Zukunft das Rennen für sich entscheiden könnte. Siehe auch hier.

Unterschiede

Um die Unterschiede zwischen Node.js und Deno nochmal zusammenzufassen bzw. um Entwickler:innen aufzuzeigen, worauf sie sich „einlassen müssen” wenn sie zu Deno wechseln:

  • Neue Art des Library Imports
  • Keine package.json
  • Makefiles
  • Neue Cli Deno vs npm/yarn
  • Existierendes Sicherheitskonzept

Abseits der sprachspezifischen Änderungen muss man sich auf neue Libs einlassen und diese neu im Deno-Ökosystem finden. Zum Glück findet jedoch eine rasche Portierung vieler prominenter Tools statt.

Und nun?

Es spricht eigentlich nichts dagegen, Deno statt Node.js für das nächste Projekt, die nächste FaaS oder den nächsten Mircoservice zu nutzen. Die Lib-Struktur wächst stetig und im Notfall kann man auch auf Node-Libs zurückgreifen (wird nicht empfohlen).

Gerade wenn es um typische CRUD-Systeme geht, sollten sich diese problemlos umsetzen lassen. Und sind wir mal ehrlich, 80 Prozent aller Systeme sind CRUD-Systeme.

Nachtrag (Noch persönlichere Meinung):
Ich habe jetzt schon öfters, die Aussage gehört: „Die Unterschiede zwischen Node.js und Deno sind so gering, dass es keinen Grund gibt, umzusteigen.”

Ich sehe das ähnlich, aber meine Schlussfolgerung ist eine andere: Da die Unterschiede so gering sind, lohnt sich ein Umstieg erst recht. Die „Kosten” sind sehr gering und die kleinen Benefits, die man mitnimmt, überwiegen den Aufwand.

Deno Deploy

Was ist das ?

Deno Deploy ist eine Möglichkeit, um Backendcode (Deno Code) global zu verteilen. Das heißt im Grunde, dass was auch ein CDN macht, nur für Logik. Siehe hier.

Wie ist hier der aktuelle Status?

Aktuell befindet sich Deno Deploy noch in der Beta-Phase. Dadurch gibt es bisher auch kein aktuelles Pricing-Concept. Das bedeutet, man kann es erstmal kostenlos nutzen, wenn man:

Ein Beispiel

Leider sind import Maps nicht kompatibel mit Deno Deploy. Somit kehren wir am besten wieder zurück zur alten Lösung: per lib.ts file. Um das Ganze nutzen zu können, wird ein Account benötigt. Ist der Account angelegt, kann man auf dem Dashboard ein neues Projekt erstellen. Beim Deploy hat man die Wahl, ein GitHub-Projekt anzulegen oder per URL zu deployen.

Für unser Beispiel nutzen wir mal GitHub …

Hier mein Git-Repo:

https://github.com/fasibio/deno_test1

Das heißt, wir erlauben Deno den Zugriff auf das Git Repository und wählen in Deno Deploy das Repository, den Branch und das Haupt ts-file aus (im Beispiel oben die main.ts). Nach dem Deployment bekommen wir eine Domain, über die wir nun den Service öffnen können.

Fazit Deno Deploy

Aktuell fällt es mir schwer, hier ein Fazit zu ziehen. Deno Deploy funktioniert recht stabil. Es ist allerdings schade, dass man aktuell nicht alle Funktionen verwenden kann, die Deno bietet (import_maps).

Zukünftig könnte es sich aber zu einer interessanten Alternative entwickeln. Hier kann ich aktuell nur von einem Bauchgefühl sprechen und empfehle, es bei Interesse einfach mal auszuprobieren und auf sein eigenes Gefühl zu hören.

Hat dir der Beitrag gefallen?

Deine E-Mail-Adresse wird nicht veröffentlicht.

Ähnliche Artikel