Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Ricardo Torrão

23. Februar 2024

Min Read

Deno vs Node.js: ein Vergleich

Ich weiß nicht, ob du mit den Neuigkeiten auf dem Laufenden bist, aber Deno ist der neue Star auf der Javascript-Ökosystem - Manche Leute sagen sogar, dass es Node töten wird. Jetzt, da Deno veröffentlicht wurde, ist es an der Zeit herauszufinden, ob es ein würdiger Wettbewerb für Node sein kann. Neugierig? Lass uns anfangen!

In diesem Beitrag werfen wir einen Blick auf Deno gegen Node und vergleichen Sie sie, um zu verstehen, was sie gemeinsam haben und was sie unterscheidet in Bezug auf:

  • Typoskript
  • Sicherheit
  • Module
  • Verwaltung von Paketen
  • Versprechungen
  • Browserkompatibilität

Ich hoffe, wir können Ihnen helfen, eine klare Vorstellung davon zu haben, was für Sie am besten ist.

Bei Imaginary Cloud, wir haben Node unter anderem verwendet, um APIs zu erstellen, Frontends zu bedienen und Microservices-Architekturen zu erstellen.

blue arrow to the left
Imaginary Cloud logo

Was ist Node?

Node ist eine serverseitige JavaScript-Umgebung, die auf der V8-JavaScript-Engine von Google basiert. Sie wurde 2009 von Ryan Dahl entwickelt und konzentrierte sich stark auf ereignisgesteuerte HTTP-Server. Es brachte serverseitiges JavaScript in den Mainstream und das war es JavaScript überall Paradigma, das die Entwicklung von Webanwendungen mit einer einzigen Programmiersprache ermöglichte.

Im Jahresverlauf 2018 hielt Ryan Dahl auf der JSConf EU einen Vortrag mit dem Titel Entwurfsfehler in Node - auch bekannt als „10 Dinge, die ich an Node.js bereue“. In seinem Vortrag beschreibt er, wie sehr er einige der Entscheidungen bedauert, die bei der Entwicklung von Node getroffen wurden. Wie er betont, war JavaScript zu Beginn der Entwicklung von Node eine ganz andere Sprache, und es fehlten einige der modernsten Funktionen:

  1. Promises und Async/Await
  2. ES-Module
  3. Typoskript

Angesichts der Tatsache, dass viele der in dem Vortrag erwähnten Designfehler nicht behoben werden konnten, ohne den Kern von Node neu zu schreiben und damit die Unterstützung für ältere Anwendungen zu beenden, beschloss Ryan, Deno einzuführen.

blue arrow to the left
Imaginary Cloud logo

Was ist Deno?

Zunächst einmal ist es kein Fork von Node - es ist eine neue Implementierung, die auf modernen Funktionen der JavaScript-Sprache basiert, obwohl der Name ein Anagramm von Node ist. Deno ist eine sichere Laufzeit für JavaScript und TypeScript, die auf Googles V8 basiert. Ihr Kern ist in Rust gebaut (die Implementierung von Node ist in C++). Es verwendet Tokio für seine Event-Schleife, die ebenfalls in Rust geschrieben ist.

Wie installiere ich es


Informationen zu anderen Installationsmethoden finden Sie in der offizielle Dokumentation.

(Zum Zeitpunkt, an dem ich das schreibe, ist die verfügbare Deno-Version 1,46,3).

blue arrow to the left
Imaginary Cloud logo

Wie sich Deno von Node unterscheidet

Einzelne ausführbare Datei

Deno wird als einzelne ausführbare Datei ohne Abhängigkeiten geliefert und verfügt über einige integrierte Tools, um das Entwicklererlebnis zu vereinfachen:

  1. Bündler (Deno-Paket)
  2. Debugger (--inspizieren, --inspect-brk)
  3. Abhängigkeitsinspektor (Deno-Informationen)
  4. Dokumentationsgenerator (Deno-Dokument)
  5. Formatierer (Deno FMT)
  6. Testläufer (Denotest)
  7. Linter (Deno Flint) - derzeit instabil

Alle diese Tools sind für Deno standardisiert, sodass Sie sicher sein können, dass sie voll unterstützt werden.

Da es sich um eine einzelne ausführbare Datei handelt, kann Deno sich selbst aktualisieren über: Demo-Upgrade oder deno upgrade --version <new_version>.

Dadurch wird die angegebene Version abgerufen (oder die neueste, falls nicht angegeben) und Ihre aktuelle ausführbare Datei durch sie ersetzt.

Es ist möglich, mehrere Versionen zu installieren, indem Versionsmanager.

Für Node sind Versionsmanager auch für die Aktualisierung/Installation neuer Versionen verantwortlich, z. nvm.

Erstklassiges TypeScript

Deno basiert auf TypeScript und unterstützt es daher sofort, ohne dass Tools wie das Hinzufügen eines tsconfig.json Konfigurationsdatei in Node. Obwohl es mit einer Standard-Konfigurationsdatei geliefert wird, ist es möglich, eine eigene hinzuzufügen deno run -c tsconfig.json [Datei zum Ausführen. ts].

Da TypeScript nur eine Obermenge von JavaScript ist, kann Deno es auch ausführen.

Um ein Skript auszuführen, können Sie ein hallo-world.ts Datei mit dem obigen Snippet und führe es aus, indem du Folgendes ausführst: deno run hello-world.ts. Dabei wird der TypeScript-Compiler von Microsoft verwendet, um Typen zu überprüfen und JavaScript zu erzeugen und dann das Skript auszuführen.

Derzeit geht Denos Team davon aus, dass die Zeit, die V8 zum Parsen von TypeScript benötigt, im Vergleich zu JavaScript viel höher ist und dass es sich um eine fortlaufende Aufgabe um den TypeScript-Compiler nach Rust zu portieren.

Sicherheit

Einer der Hauptschwerpunkte ist Sicherheit. Deno ist standardmäßig gesichert und der Code wird in einer sicheren Sandbox ausgeführt, wobei dasselbe Berechtigungsmodell repliziert wird, das der Browser implementiert. Sofern nicht anders angegeben, hat es keinen Zugriff auf das Dateisystem, das Netzwerk oder die Umgebungsvariablen und Zugriffsberechtigungen müssen explizit in der Befehlszeile an den Deno-Prozess übergeben werden.


Wenn Sie versuchen, das vorherige Snippet auszuführen:


Um den Fehler zu vermeiden, müssen Sie das hinzufügen --allow-env Flag, um auf die Umgebungsvariablen zugreifen zu können:


Es gibt eine Option, um den gesamten Zugriff zuzulassen --alles zulassen oder -A, aber das wird nicht empfohlen.

Umgekehrt ist Node sehr freizügig, Sie haben vollen Zugriff auf so ziemlich alles:


Module

Deno verwendet ES Modules, das offizielle Standardformat zum Verpacken von JavaScript-Code, das in ES6/ES2015 eingeführt wurde:

Als Node erstellt wurde, hatte JavaScript kein eigenes Modulsystem, daher verwendete es den CommonJS-Standard:

Im Moment hat nur Node experimentelle Unterstützung für ES-Module und Sie müssen einige Konfigurationen/Änderungen an vorhandenen Dateien vornehmen.

Ich werde nicht im Detail auf die Unterschiede eingehen, aber wenn Sie sich eingehend mit beiden Modulsystemen befassen möchten, empfehle ich die Lektüre diese.

Obwohl Deno im Allgemeinen nicht mit Node-Paketen kompatibel ist, bietet es eine Node-Kompatibilitätsbibliothek, die es uns ermöglicht, einige NPM-Pakete zu verwenden, die keine nicht polygefüllten Node-APIs verwenden.

Einer der Hauptvorteile besteht darin, dass ein browserkompatibles Standardprotokoll zum Laden von Modulen verwendet wird, sodass Sie Module direkt über URLs importieren können, was einen großen Einfluss auf die Art und Weise hat, wie wir mit Modulen umgehen.

New call-to-action

Verwaltung von Paketen

In Anbetracht der Tatsache, dass Deno URLs zum Laden von Modulen verwendet, übernimmt es explizit die Rolle sowohl der Laufzeit als auch des Paketmanagers. Es ist nicht auf einen zentralen Server für die Verteilung von Modulen angewiesen. Das bedeutet, dass vollständig qualifizierte Modulnamen erforderlich sind, einschließlich der Erweiterung (oder ein Server, der den richtigen Medientyp bereitstellt).

Sie können Module direkt importieren und Abhängigkeiten als Code verwenden:


Um das vorherige Snippet auszuführen, können Sie einfach Folgendes ausführen: deno run --allow-net http-server.ts. Es ist keine vorherige Installation erforderlich, da Deno ein Modul herunterlädt und in einem globalen Verzeichnis zwischenspeichert, wenn seine URL zum ersten Mal in einem Skript gefunden wird. Der Modul-Cache hat zwei Hauptziele:

  • Offline-Arbeit: Wenn der Cache für ein bestimmtes Modul bereits existiert, wird er verwendet. Sie können das hinzufügen —neu laden Markieren Sie, wenn Sie den Cache manuell zurücksetzen möchten.
  • Einzelkopie: Jede spezifische Modulversion, die importiert wird, hat nur eine Kopie, egal wie viele Projekte darauf verweisen.

Alle Module und Dateien, die von Remote-URLs geladen werden, sollen nicht nur zwischengespeichert werden, sondern auch unveränderlich sein.

Wie Sie wahrscheinlich bemerkt haben, erfordern Importe vollständig qualifizierte Modulnamen, einschließlich der Erweiterung. Außerdem hat Deno keine „magische“ Modulauflösung. Stattdessen werden importierte Module als Dateien (einschließlich Erweiterungen) oder als vollständig qualifizierte URL-Importe angegeben.

Knotenverwendungen npm als Paketmanager für die Installation und Verwaltung von Drittanbieterpaketen, die in der npm-Registrierung. Dadurch wird die Verknüpfung zu externen Bibliotheken im Wesentlichen über die npm-Registrierung zentralisiert. Wenn Sie ein Paket mit NPM/Yarn in Ihr Projekt installieren, ein Paket.json Die Datei wird verwendet, um den Paketnamen und die akzeptierten Versionen anzugeben, und die Pakete werden in einen Ordner node_modules in Ihrem Projekt heruntergeladen. Infolgedessen Knotenmodule Ordner werden riesig, da Module bestimmte Versionen anderer Module benötigen und sie in jedem einzelnen Projektverzeichnis repliziert werden, das sie benötigen.

Deno verwendet NPM nicht für das Abhängigkeitsmanagement, also nein Paket.json und nein Knotenmodule

Standardmodule

Deno bietet kuratierte Standardmodule mit Hilfsprogrammen und Hilfsprogrammen für allgemeine Aufgaben, die vom Deno Core-Team geprüft werden.

Diese Module werden gemäß den Deno-Versionen gekennzeichnet. Wenn Sie kein Tag angeben, wird automatisch eine Verknüpfung zum Master-Branch hergestellt. Es wird daher empfohlen, auf mit Tags versehene Versionen zu verlinken, um unbeabsichtigte Aktualisierungen und grundlegende Änderungen zu vermeiden.

Falls Sie eine bestimmte Modulversion sperren möchten, können Sie eine lock.json Datei, um zu überprüfen Modulintegrität.

Module von Drittanbietern

Deno bietet eine Integrität des Hosting-Dienstes für Deno-Skripte. Es speichert Veröffentlichungen von Open-Source-Modulen, die auf GitHub gespeichert sind, im Cache und stellt sie unter einer leicht zu merkenden Domain bereit.

Wenn Sie beispielsweise nach einem Datumsprogramm suchen, können Sie das https://deno.land/x Suchfunktion, die Ihnen hilft, Module zu finden. Sobald Sie das gewünschte Modul gefunden haben, in diesem Fall date-fns, können Sie einfach die richtige URL in die Datei importieren, in der Sie es verwenden:


Für alle anderen NPM-Pakete können Sie einen Dienst wie verwenden, wenn sie nicht mit esmodule-Importen kompatibel sind JSPM wodurch die Module von Drittanbietern aufgelöst und die CommonJS-Module so kompiliert werden, dass sie als ES-Module-Importe funktionieren.

Versprechungen

Deno verwendet Promises bis zum Ende — alle asynchronen Methoden geben Promises zurück:


Aus dem vorherigen Ausschnitt können Sie sehen, dass Deno unterstützt auf höchstem Niveau erwarten Sie. Dies ermöglicht es uns, die Await-Syntax im globalen Bereich zu verwenden, ohne sie in die asynchrone Funktion einschließen zu müssen. Kürzlich hat Node Node auch Unterstützung für Await auf oberster Ebene hinzugefügt.

Lange vor Promises oder async/await wurde die API von Node für asynchrone Operationen so konzipiert, dass sie Callbacks verwendet und der Fehler-Callback-Konvention folgt:


Obwohl Node-Entwickler jetzt Zugriff auf Promises und die async/await-Syntax haben, erwartet die API von Node immer noch, dass Callbacks die Abwärtskompatibilität aufrechterhalten.

Wahrscheinlich besteht ein großer Unterschied darin, dass Deno bei unbehandelten Versprechen immer sofort stirbt, während Node derzeit Ablehnungen behandelt, indem er eine Verfallswarnung an stderr ausgibt. Derzeit führt Node eine Umfrage durch, um besser zu verstehen, wie Benutzer damit umgehen diese.

Browserkompatibilität

Das Entwicklungsteam entschied sich auch dafür, Browser-APIs zu verwenden, wo dies praktisch ist. Auf diese Weise bietet Deno eine globale Fenster Objekt und APIs wie EventListener hinzufügen, laden, herunterladen und abrufen.

Deno bietet eine globale Fenster Objekt und APIs wie EventListener hinzufügen, laden, herunterladen und abrufen.

Das bedeutet, dass vollständig in JavaScript geschriebene Deno-Programme, die den globalen Deno-Namespace (oder Feature-Test dafür) nicht verwenden, isomorph sein sollten, was bedeutet, dass sie in einem modernen Webbrowser ohne Änderungen ausgeführt werden können:


Während das Fensterobjekt in Node nicht verfügbar ist, können Sie es verwenden abrufen wenn Sie dies polyfill oder eine Bibliothek eines Drittanbieters verwenden.

blue arrow to the left
Imaginary Cloud logo

Was ist am besten: Deno oder Node?

Was ist am besten: Deno oder Node? Deno ist standardmäßig sicher und unterstützt TypeScript, ohne dass ein Compiler erforderlich ist, hat aber ein kleineres Ökosystem. Node.js hat ein riesiges Bibliotheksökosystem und ist weit verbreitet, weist jedoch historische Sicherheitslücken auf. Die „beste“ Wahl hängt von Ihren spezifischen Bedürfnissen und Ihrer Vertrautheit ab.

Das Ziel von Deno ist es also nicht, Node zu ersetzen, sondern eine Alternative anzubieten.

Node befindet sich seit über einem Jahrzehnt in der Entwicklung, was es stabiler und kampferprobter macht und es zum De-facto-Standard für serverseitiges JavaScript macht. Deno befindet sich erst seit zwei Jahren in der Entwicklung und wird ständig verbessert. Deno ist unter anderem ein hervorragender Ersatz für Utility-Skripte, die normalerweise mit Bash oder Python geschrieben werden.

Das hängt von den Anforderungen ab, aber für die meisten Node-Anwendungen ist Deno derzeit möglicherweise nicht geeignet. Eine der größten Hürden, die es zu bewältigen gilt, ist die Erstellung/Konvertierung von NPM-Modulen, die mit Deno verwendet werden sollen. Dies wird sich wahrscheinlich in Zukunft ändern, wenn die Unterstützung von Node ES-Modulen standardisierter wird.

Ich denke jedoch, dass Deno aufgrund seiner erstklassigen TypeScript-Unterstützung und seiner modernen Standardbibliothek nach und nach immer mehr angenommen wird. Node-Programmierer sollten Deno im Auge behalten und vielleicht versuchen, es für einige Nebenprojekte zu verwenden.

Eines ist sicher: Die aktuelle Entwicklung von Deno treibt das JS-Server-Ökosystem voran und das ist gut so.

Grow your revenue and user engagement by running a UX Audit! - Book a call

Fanden Sie diesen Artikel hilfreich? Diese könnten dir auch gefallen!

blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
Ricardo Torrão
Ricardo Torrão

Senior Developer bei Imaginary Cloud, spezialisiert auf die Entwicklung innovativer Softwarelösungen, begeistert von Technologie und exzellenter Codierung.

Read more posts by this author

People who read this post, also found these interesting:

arrow left
arrow to the right
Dropdown caret icon