Die Version Deno 1.28 wurde vorgestellt, eine Plattform für die isolierte Ausführung von Anwendungen in JavaScript und TypeScript, die zur Erstellung von serverseitigen Handhabungen verwendet werden kann. Die Plattform wird von Ryan Dahl, dem Schöpfer von Node.js, entwickelt. Wie auch in Node.js verwendet Deno die JavaScript-Engine V8, die auch in Chromium-basierten Browsern zum Einsatz kommt. Deno ist jedoch kein Fork von Node.js, sondern ein von Grund auf neues Projekt. Der Code des Projekts wird unter der MIT-Lizenz veröffentlicht. Die Builds sind für Linux, Windows und macOS vorbereitet.
Das Deno-Projekt wurde gegründet, um den Nutzern eine sicherere Umgebung zu bieten und konzeptionelle Fehler in der Architektur von Node.js zu beseitigen. Um die Sicherheit zu erhöhen, ist die Wrapper-Schicht um die V8-Engine in der Programmiersprache Rust geschrieben, die viele der durch low-level Speicherarbeit entstehenden Schwachstellen vermeidet. Für die Verarbeitung von Anfragen im nicht-blockierenden Modus wird die Tokio-Plattform verwendet, die ebenfalls in Rust geschrieben ist. Tokio ermöglicht die Erstellung von hochleistungsfähigen Anwendungen auf Basis einer ereignisgesteuerten Architektur (Event-driven), die Multithreading und die asynchrone Verarbeitung von Netzwerk-Anfragen unterstützt.
Das wichtigste Änderungsmerkmal in der neuen Version ist die Stabilisierung der Kompatibilität mit Paketen, die im NPM-Repository gehostet werden, was die Nutzung von mehr als 1,3 Millionen Modulen in Deno ermöglicht, die für die Node.js-Plattform erstellt wurden. Zum Beispiel können in Deno-Anwendungen jetzt Module verwendet werden, die einen dauerhaften Datenzugriff ermöglichen, wie Prisma, Mongoose und MySQL, sowie Frameworks zur Unterstützung von Frontends wie React und Vue. Einige NPM-Module bleiben derzeit inkompatibel mit Deno, zum Beispiel aufgrund von Bindungen an Node.js-spezifische Umgebungsmerkmale, wie die Datei package.json. Außerdem ist es derzeit nicht möglich, den Befehl „deno compile“ mit NPM-Modulen zu verwenden. In zukünftigen Versionen ist geplant, solche Inkompatibilitäten und Einschränkungen zu beseitigen.
Die Unterstützung des zuvor in Deno verwendeten Modells basierend auf dem ECMAScript-Modulsystem und der Web-API bleibt auf demselben Niveau erhalten, und für den Import von NPM-Modulen wird das für Deno gewohnte URL-basierte Ladeschema verwendet. Für den Zugriff auf NPM-Module gibt es ein spezielles URL-Präfix „npm:“, das analog zu den üblichen Deno-Modulen verwendet werden kann. Zum Beispiel kann beim Import eines NPM-Moduls angegeben werden: 'import { chalk } from "npm:chalk@5";', und um ein NPM-Skript über die Befehlszeile auszuführen — „deno run —allow-env —allow-read npm:create-vite-extra“.
Die Verwendung von NPM-Paketen in Deno ist deutlich einfacher als in Node.js, da keine vorherige Installation der Module erforderlich ist (Module werden beim ersten Start der Anwendung installiert), keine package.json-Datei verwendet wird und standardmäßig auch kein node_modules-Verzeichnis verwendet wird (Module werden in einem gemeinsamen Verzeichnis zwischengespeichert, aber es besteht die Möglichkeit, das alte Verhalten mithilfe der Option „—node-modules-dir“ wiederherzustellen).
In Anwendungen auf Basis von NPM bleibt die Möglichkeit erhalten, die von Deno bereitgestellten Mechanismen zum Zugriffsschutz, zur Isolation und zur Aktivierung sicherheitsrelevanter erweiterter Funktionen zu nutzen. Um gegen Angriffe über verdächtige Abhängigkeiten vorzugehen, blockiert Deno standardmäßig alle Versuche, von Abhängigkeiten aus auf das System zuzugreifen, und gibt Warnmeldungen über festgestellte Probleme aus. Zum Beispiel wird bei einem Versuch eines Moduls, Schreibzugriff auf /usr/bin/ zu erhalten, eine Bestätigungsanfrage für diese Operation ausgegeben: deno run npm:install-malware ⚠️ ┌ Deno fordert Schreibzugriff auf /usr/bin/ an. ├ Angefordert von `install-malware` ├ Führen Sie erneut mit —allow-write aus, um diese Aufforderung zu umgehen. └ Erlauben? [y/n] (y = ja, erlauben; n = nein, ablehnen) >
Unter den nicht mit NPM verbundenen Verbesserungen in der neuen Version wird das Upgrade des V8-Engines auf Version 10.9, die automatische Erkennung von Sperrdateien, die Stabilisierung der APIs Deno.bench(), Deno.gid(), Deno.networkInterfaces(), Deno.systemMemoryInfo() und Deno.uid() sowie die Einführung der neuen instabilen API Deno.Command() zur Ausführung von Befehlen (universeller Ersatz für Deno.spawn, Deno.spawnSync und Deno.spawnChild) erwähnt.
Die Hauptmerkmale von Deno:
- Sicherheitsorientierung in der Standardkonfiguration. Zugriffe auf Dateien, Netzwerkfunktionen und Zugriff auf Umgebungsvariablen sind standardmäßig blockiert und erfordern eine explizite Aktivierung. Standardanwendungen werden in isolierten Sandbox-Umgebungen ausgeführt und haben keinen Zugriff auf Systemfunktionen ohne ausdrückliche Berechtigung;
- Integrierte Unterstützung der Programmiersprache TypeScript zusätzlich zu JavaScript. Der integrierte TypeScript-Compiler wird zur Typprüfung und zur Generierung von JavaScript verwendet, was zu einem Leistungsrückgang im Vergleich zur JavaScript-Analyse in V8 führt;
- Die Runtime wird als eine einzige eigenständige ausführbare Datei („deno“) bereitgestellt. Um Anwendungen mit Deno auszuführen, reicht es aus, eine rund 30 MB große ausführbare Datei für die eigene Plattform herunterzuladen, die keine externen Abhängigkeiten hat und keine besondere Installation im System erfordert. Dabei ist Deno keine monolithische Anwendung, sondern eine Sammlung von Rust-Crate-Paketen (deno_core, rusty_v8), die einzeln verwendet werden können;
- Bei der Ausführung des Programms sowie beim Laden von Modulen kann die Adressierung über URL verwendet werden. Zum Beispiel kann der Befehl „deno https://deno.land/std/examples/welcome.js“ verwendet werden, um das Programm welcome.js auszuführen. Code von externen Ressourcen wird heruntergeladen und im lokalen System zwischengespeichert, wird jedoch nie automatisch aktualisiert (für ein Update ist es erforderlich, die Anwendung mit dem Flag „—reload“ explizit zu starten);
- Effiziente Verarbeitung von HTTP-Netzwerkanfragen, die Plattform ist für die Erstellung leistungsstarker Netzwerkapplikationen ausgelegt;
- Die Möglichkeit, universelle Webanwendungen zu erstellen, die sowohl in Deno als auch in einem herkömmlichen Webbrowser ausgeführt werden können;
- Vorhandensein eines Standardmodulsets, dessen Verwendung keine Bindung an externe Abhängigkeiten erfordert. Module aus der Standardkollektion wurden zusätzlich auditiert und auf Kompatibilität überprüft;
- Neben der Runtime fungiert die Deno-Plattform auch als Paketmanager und erlaubt den Zugriff auf Module innerhalb des Codes über URL. Zum Beispiel kann zur Modullieferung im Code angegeben werden „import * as log from "https://deno.land/std/log/mod.ts". Dateien, die von externen Server über URL heruntergeladen werden, werden zwischengespeichert. Die Bindung an die Versionen der Module erfolgt über die Angabe von Versionsnummern innerhalb der URL, zum Beispiel „https://unpkg.com/liltest@0.0.5/dist/liltest.js“;
- Das System zur Inspektion von Abhängigkeiten (Befehl „deno info“) und das Tool zur Code-Formatierung (deno fmt) sind integriert.
- Alle Anwendungsskripte können in einer einzigen JavaScript-Datei zusammengefasst werden.
Quelle: opennet.ru
