Die Version Deno 1.28 wurde vorgestellt, eine Plattform zur isolierten Ausführung von Anwendungen in JavaScript und TypeScript, die für die Erstellung von serverseitigen Handlern 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 ebenfalls in Chromium-basierten Browsern eingesetzt wird. Dabei ist Deno kein Ableger von Node.js, sondern ein völlig neues Projekt, das von Grund auf neu entwickelt wurde. Der Projektcode ist unter der MIT-Lizenz verfügbar. Die Builds sind für Linux, Windows und macOS vorbereitet.
Das Deno-Projekt wurde ins Leben gerufen, um den Nutzern eine sicherere Umgebung zu bieten und konzeptionelle Fehler in der Architektur von Node.js zu vermeiden. Um die Sicherheit zu erhöhen, wurde die Schnittstelle um die V8-Engine in der Programmiersprache Rust geschrieben, was viele Schwachstellen, die durch die Arbeit auf niedrigster Ebene mit Speicher entstehen, verhindern kann. Für die Verarbeitung von Anfragen im nicht-blockierenden Modus kommt die in Rust geschriebene Plattform Tokio zum Einsatz. Tokio ermöglicht die Entwicklung hochperformanter Anwendungen auf Basis einer ereignisgesteuerten Architektur, die Multithreading und asynchrone Netzwerkhandling unterstützen.
Ein zentrales Update in der neuen Version ist die Stabilisierung der Kompatibilität mit Paketen, die im NPM-Repository gehostet werden. Dadurch können über 1,3 Millionen Module, die für die Node.js-Plattform erstellt wurden, in Deno genutzt werden. In Deno-Anwendungen können nun beispielsweise Module zur Verwaltung von Datenzugriffen wie Prisma, Mongoose und MySQL verwendet werden, sowie Frameworks für die Frontend-Entwicklung wie React und Vue. Einige NPM-Module sind jedoch weiterhin inkompatibel mit Deno, vor allem wegen ihrer Bindungen an Node.js-spezifische Umgebungsvariablen 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 beheben.
Die Unterstützung für das in Deno verwendete ECMAScript-Modulsystem und Web API bleibt auf demselben Niveau erhalten, und für den Import von NPM-Modulen wird das gewohnte Deno-URL-basiertes Ladeschema verwendet. Um auf NPM-Module zuzugreifen, gibt es ein spezielles URL-Präfix "npm:", das ähnlich wie bei normalen Deno-Modulen verwendet werden kann. Zum Beispiel kann für den Import eines NPM-Moduls 'import { chalk } from "npm:chalk@5";' angegeben werden, und um ein NPM-Skript über die Befehlszeile auszuführen, kann "deno run --allow-env --allow-read npm:create-vite-extra" verwendet werden.
Die Verwendung von NPM-Paketen in Deno ist deutlich einfacher als in Node.js, da keine vorherige Installation von Modulen erforderlich ist (Module werden beim ersten Start der Anwendung installiert), die Datei package.json nicht verwendet wird und standardmäßig kein Katalog node_modules verwendet wird (Module werden im gemeinsamen Verzeichnis zwischengespeichert, aber es besteht die Möglichkeit, das alte Verhalten über die Option "--node-modules-dir" wiederherzustellen).
In NPM-basierten Anwendungen bleibt die Möglichkeit bestehen, die in Deno bereitgestellten Mechanismen zur Zugangskontrolle, Isolation und Aktivierung erweiterten Sicherheitsfunktionen zu nutzen. Um Angriffe über verdächtige Abhängigkeiten zu verhindern, blockiert Deno standardmäßig alle Versuche, auf das System durch Abhängigkeiten zuzugreifen, und gibt eine Warnung über erkannte Probleme aus. Zum Beispiel wird bei einem Schreibzugriffsversuch auf /usr/bin/ eine Bestätigungsanfrage für diese Operation angezeigt: 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) >
Zu den in NPM nicht verknüpften Verbesserungen in der neuen Version gehört das Update der V8-Engine 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() zum Ausführen von Befehlen (universeller Ersatz für Deno.spawn, Deno.spawnSync und Deno.spawnChild).
Die Hauptmerkmale von Deno:
- Sicherheitsorientierte Voreinstellungen. Zugriffe auf Dateien, Netzwerkfunktionalitäten und Umgebungsvariablen sind standardmäßig blockiert und erfordern eine explizite Aktivierung. Anwendungen werden in isolierten Sandbox-Umgebungen ausgeführt und haben ohne ausdrückliche Berechtigungen keinen Zugriff auf Systemfunktionen;
- Integrierte Unterstützung für die Programmiersprache TypeScript neben JavaScript. Die Typprüfung und die Generierung von JavaScript erfolgen über den nativen TypeScript-Compiler, was zu einer Leistungsminderung im Vergleich zur Verarbeitung von JavaScript in V8 führt;
- Die Runtime wird als eigenständige ausführbare Datei („deno“) bereitgestellt. Um Anwendungen mit Deno auszuführen, müssen Sie nur eine ausführbare Datei für Ihre Plattform herunterladen, die etwa 30 MB groß ist, keine externen Abhängigkeiten hat und keine spezielle Systeminstallation erfordert. Dabei ist Deno keine monolithische Anwendung, sondern eine Sammlung von Crate-Paketen in Rust (deno_core, rusty_v8), die getrennt verwendet werden können;
- Beim Starten des Programms sowie zum Laden von Modulen kann die Adressierung über URLs verwendet werden. Zum Beispiel kann das Programm welcome.js mit dem Befehl „deno https://deno.land/std/examples/welcome.js“ gestartet werden. Der Code von externen Ressourcen wird auf dem lokalen System heruntergeladen und zwischengespeichert, jedoch nie automatisch aktualisiert (für ein Update muss die Anwendung ausdrücklich mit dem Flag „—reload“ gestartet werden);
- Effiziente Verarbeitung von HTTP-Netzwerkanfragen ist die Plattform ausgelegt auf die Erstellung von hochperformanten Netzwerk-Anwendungen;
- Die Möglichkeit zur Erstellung universeller Webanwendungen, die sowohl in Deno als auch in einem regulären Webbrowser ausgeführt werden können;
- Verfügbarkeit eines Standardsatzes von Modulen, deren Verwendung keine Bindung an externe Abhängigkeiten erfordert. Die Module aus der Standardkollektion haben eine zusätzliche Überprüfung und Kompatibilitätsprüfung bestanden;
- Neben der Laufzeitumgebung fungiert die Deno-Plattform auch als Paketmanager und ermöglicht es, innerhalb des Codes Module über URLs anzusprechen. Zum Beispiel kann ein Modul im Code mit „import * as log from „https://deno.land/std/log/mod.ts“ geladen werden. Dateien, die von externen Server Über die URL werden sie im Cache gespeichert. Die Bindung an die Modulversionen erfolgt über die Versionsnummern in der URL, zum Beispiel „https://unpkg.com/liltest@0.0.5/dist/liltest.js“;
- In das System ist ein Abhängigkeitsinspektionssystem integriert (Befehl „deno info“) sowie ein Tool zur Codeformatierung (deno fmt);
- Alle Anwendungsskripte können in eine einzige JavaScript-Datei zusammengefasst werden.
Quelle: opennet.ru
