Ryan Dahl, Schöpfer von Node.js, hat in den letzten anderthalb Jahren am
Deno- Projekt gearbeitet. Dies ist die neue JavaScript-Laufzeit, mit der die mit Node.js verbundenen Probleme behoben werden sollen.
Versteh mich nicht falsch. Die Node.js-Plattform ist eine großartige serverseitige Umgebung zum Ausführen von JavaScript. Es verdankt seine Popularität hauptsächlich einem riesigen Ökosystem und der Unterstützung von JavaScript. Ryan Dahl gibt jedoch zu, dass etwas an Node.js seine Aufmerksamkeit wert sein sollte. Hier geht es insbesondere um Sicherheit, um Module und um das Abhängigkeitsmanagement.
Zu seiner Verteidigung könnte man sagen, dass er nicht wissen konnte, wie beliebt die Node.js-Plattform in relativ kurzer Zeit werden würde. Darüber hinaus sah JavaScript im Jahr 2009 immer noch wie eine begrenzte und seltsame Sprache aus, die von allen verspottet wurde, die nicht faul waren. Es sollte auch beachtet werden, dass in jenen Tagen viele der heutzutage üblichen JavaScript-Funktionen nicht existierten.
Was ist Deno und was sind die Hauptmerkmale dieser Plattform?
Deno ist eine sichere TypeScript-Laufzeit, die auf der von Google entwickelten V8 JS-Engine basiert. Die Deno-Plattform wurde mit den folgenden Tools erstellt:
- Rust (der Deno-Kern ist in Rust geschrieben und der Knoten-Kern ist in C ++).
- Tokio (Ereignisschleife in Rust geschrieben).
- TypeScript (Deno unterstützt ohne zusätzliche Einstellungen sowohl JavaScript als auch TypeScript).
- V8 (Googles JS-Engine, die im Chrome-Browser, in Node.js und anderen Projekten verwendet wird).
Lassen Sie uns darüber sprechen, welche Möglichkeiten uns die Deno-Plattform bietet.
Sicherheit (Berechtigungen)
Zu den wichtigsten Merkmalen von Deno, denen besondere Aufmerksamkeit geschenkt wird, gehört die Sicherheit.
Im Gegensatz zu Node führt Deno standardmäßig Code in einer Sandbox aus. Dies bedeutet, dass die Laufzeit keinen Zugriff auf die folgenden Entitäten und Funktionen hat:
- Dateisystem.
- Netzwerk.
- Ausführung anderer Skripte.
- Umgebungsvariablen.
Schauen Sie sich an, wie das Berechtigungssystem von Deno funktioniert. Betrachten Sie das folgende Skript:
(async () => { const encoder = new TextEncoder(); const data = encoder.encode('Hello world\n'); await Deno.writeFile('hello.txt', data); await Deno.writeFile('hello2.txt', data); })();
Dieses Skript erstellt zwei Textdateien -
hello.txt
und
hello2.txt
. Der Text
Hello world
in diese Dateien eingefügt. Der Code wird in der Sandbox ausgeführt. Daher hat es keinen Zugriff auf das Dateisystem.
Deno
die Tatsache, dass wir hier den
Deno
Namespace verwenden, anstatt uns auf etwas wie das
fs
Modul zu beziehen, wie wir es in Node tun würden. Der
Deno
Namespace bietet dem Entwickler viele grundlegende
Deno
. Durch die Verwendung des Namespace verlieren wir jedoch die Codekompatibilität mit dem Browser. Wir werden weiter unten darüber sprechen.
Dieses Skript kann mit dem folgenden Befehl ausgeführt werden:
deno run write-hello.ts
Danach sehen wir eine Benachrichtigung mit folgendem Inhalt:
Deno requests write access to "/Users/user/folder/hello.txt". Grant? [a/y/n/d (a = allow always, y = allow once, n = deny once, d = deny always)]
Tatsächlich können wir dies bei jedem Anruf zweimal sehen. Wenn wir die Frage des Systems durch Auswahl der Option "
allow always
beantworten, erhalten wir diese Benachrichtigung natürlich nicht zum zweiten Mal.
Wenn wir eine der
deny
auswählen, wird ein
PermissionDenied
Fehler
PermissionDenied
. Der Skriptvorgang wird dann abgeschlossen, da kein Code zur Behandlung von Fehlern darin enthalten ist.
Das Skript kann folgendermaßen ausgeführt werden:
deno run --allow-write write-hello.ts
Wir werden keine Benachrichtigungen sehen, beide Dateien werden erstellt.
Zusätzlich zum Flag
--allow-write
, das sich auf die Arbeit mit dem Dateisystem auswirkt, können Sie beim Ausführen von Skripten andere Flags verwenden. Dies sind
--allow-net
,
--allow-env
und
--allow-run
. Sie öffnen jeweils den Skriptzugriff auf das Netzwerk, die Umgebung und den Start von Unterprozessen.
Module
Deno lädt wie Browser Module nach URL. Zunächst sind viele Menschen verwirrt über das, was sie in den Servercode-Importbefehlen mit URLs sehen. Aber das macht tatsächlich Sinn. Warten Sie ein wenig - und Sie werden es selbst verstehen.
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
Hier haben Sie möglicherweise eine Frage dazu, was das Besondere am Importieren von Paketen per URL ist. Die Antwort auf diese Frage ist einfach: Durch die Verwendung von URLs können Deno-Pakete ohne Verwendung einer zentralen Registrierung wie npm verteilt werden. Npm hatte in letzter Zeit
viele Probleme .
Durch das Organisieren des Codeimports über eine URL können Paketersteller ihren Code hosten, wo immer sie dies für richtig halten. Das ist Dezentralisierung in ihrer ganzen Pracht. Keine
package.json
und
node_modules
.
Wenn wir die Anwendung starten, lädt Deno alle importierten Module und speichert sie zwischen. Sobald sie zwischengespeichert sind, lädt Deno sie nicht erneut, es sei denn, wir fordern sie ausdrücklich auf, sie mit dem Flag
--reload
.
In Bezug auf dieses System der Arbeit mit Modulen können mehrere wichtige Fragen gestellt werden.
HatWas passiert, wenn auf die Ressource, auf der sich der Modulcode befindet, nicht zugegriffen werden kann?
Der Modulcode wird nicht in einer zentralen Registrierung gespeichert. Die Webressource, die diesen Code hostet, ist aus vielen Gründen möglicherweise nicht verfügbar. Während des Entwicklungsprozesses oder, noch schlimmer, wenn das Projekt in Produktion geht, besteht die Gefahr, dass das Hosting des Moduls immer verfügbar ist.
Wie bereits erwähnt, speichert Deno geladene Module zwischen. Da der Cache auf einer lokalen Festplatte gespeichert ist, empfiehlt der Ersteller von Deno, ihn mit dem Versionskontrollsystem (d. H. Git) zu verarbeiten und in das Projekt-Repository aufzunehmen. Mit diesem Ansatz behalten alle Projektentwickler den Zugriff auf die heruntergeladenen Versionen der Module, auch wenn auf die Ressource, auf der der Code gespeichert ist, nicht zugegriffen werden kann.
Deno speichert den Cache in dem Ordner, der durch die Umgebungsvariable
$DENO_DIR
angegeben wird. Wenn wir diese Variable nicht konfigurieren, speichert Deno den Cache im Standardsystemverzeichnis für Caches. Die
$DENO_DIR
kann so festgelegt werden, dass sie auf einen Ordner in unserem lokalen Repository
$DENO_DIR
. Dieser Ordner kann mit Ihrem Versionskontrollsystem verarbeitet werden.
▍Wird ich ständig Module per URL importieren müssen?
Die regelmäßige Eingabe langer URLs kann sich schnell langweilen. Glücklicherweise bietet Deno zwei Möglichkeiten, um diese Aufgabe zu vereinfachen.
Die erste Möglichkeit besteht darin, das importierte Modul aus der lokalen Datei erneut zu exportieren. Zum Beispiel könnte es so aussehen:
export { test, assertEquals } from "https://deno.land/std/testing/mod.ts";
Angenommen, die Datei, in der sich der obige Befehl befindet, heißt
local-test-utils.ts
. Wenn wir nun die Funktionen
test
oder
assertEqual
benötigen, können wir sie wie
assertEqual
importieren:
import { test, assertEquals } from './local-test-utils.ts';
Infolgedessen stellt sich heraus, dass es keine Rolle spielt, ob das Modul per URL geladen wurde oder nicht.
Die zweite Option besteht darin, eine Importzuordnung in Form einer JSON-Datei zu erstellen:
{ "imports": { "http/": "https://deno.land/std/http/" } }
Wenn Sie eine ähnliche Datei verwenden, sieht der Importbefehl möglicherweise folgendermaßen aus:
import { serve } from "http/server.ts";
Damit dieses Schema funktioniert, müssen Sie das System über die Verwendung der
--importmap
im Projekt
--importmap
beim Ausführen des Skripts das Flag
--importmap
verwenden:
deno run --importmap=import_map.json hello_server.ts
▍Wie wird die Modulversionierung verwaltet?
Die Kontrolle der Paketversion liegt in ihrer Verantwortung. Aus Sicht des Kunden sieht die Auswahl der richtigen Paketversion so aus, als würde sie der URL hinzugefügt:
https://unpkg.com/liltest@0.0.5/dist/liltest.js
.
Browserkompatibilität
Die Deno-Plattform bemüht sich um die Kompatibilität ihres Codes mit Browsern. Aus technischer Sicht sind wir bei der Verwendung von ES-Modulen nicht verpflichtet, einige Assembly-Tools wie das Webpack zu verwenden, mit denen die Anwendung in einem Browser ausgeführt werden kann.
Tools wie Babel konvertieren jedoch modernen JS-Code in ES5-kompatiblen Code. Infolgedessen kann dieser Code auch in nicht neueren Browsern ausgeführt werden, die moderne JavaScript-Funktionen nicht unterstützen. Dieser Ansatz hat aber auch ein Minus, das darin besteht, dass Bündel von Webprojekten aufgrund der Tatsache, dass sie viel Hilfscode erhalten, wachsen.
Eigentlich treffen wir Entscheidungen über die Ziele unserer Projekte. Wir wählen die geeigneten Werkzeuge.
TypeScript-Unterstützung
Deno vereinfacht die Verwendung von TypeScript, sodass Entwickler nichts mehr konfigurieren müssen, um TS-Code auszuführen. Deno-Programme können aber auch problemlos in JavaScript geschrieben werden.
Zusammenfassung
Deno, die neue Laufzeitumgebung für TypeScript und JavaScript, ist ein interessantes Projekt, das seit einiger Zeit Nachhaltigkeit demonstriert. Bevor es jedoch als produktionsbereit angesehen werden kann, hat er noch einen langen Weg vor sich.
Der in Deno implementierte dezentrale Ansatz für die Arbeit mit Modulen zielt darauf ab, das JavaScript-Ökosystem aus einem zentralen Paket-Repository zu befreien, das heute npm ist.
Ryan Dahl erwartet, Deno 1.0 im Spätsommer zu veröffentlichen. Wenn Sie an der Zukunft dieses Projekts interessiert sind, achten Sie auf dessen
Repository .
Liebe Leser! Was denkst du über Deno?
