Der Autor von Node.js hat die sichere JavaScript-Plattform Deno 1.0 vorgestellt.

Nach zwei Jahren Entwicklung vorgestellt erste bedeutende Veröffentlichung Deno 1.0, einer Plattform für die isolierte Ausführung von Anwendungen in den Sprachen JavaScript und TypeScript, die zur Erstellung von Server-basierten Handlern verwendet werden kann. Die Plattform wird von Ryan Dahl entwickelt (Ryan Dahl), dem Schöpfer von Node.js. Wie bei Node.js nutzt Deno die JavaScript-Engine V8, die auch in Chromium-basierten Browsern verwendet wird. Deno ist jedoch kein Abzweig von Node.js, sondern ein von Grund auf neu geschaffenes Projekt. Der Code des Projekts wird verbreitet steht unter der MIT-Lizenz. Die Builds wurden vorbereitet für Linux, Windows und macOS.

Die bedeutende Versionsnummer ist mit der Stabilisierung der API im Namensraum Deno verbunden, die für die Interaktion von Anwendungen mit dem Betriebssystem verantwortlich sind. Schnittstellen, die noch nicht stabilisiert sind, sind standardmäßig verborgen und nur im „—unstable“-Modus verfügbar. Mit der Herausgabe neuer Versionen werden solche APIs schrittweise in den stabilen Bereich überführt. Die APIs im globalen Namensraum, einschließlich allgemeiner Funktionen wie setTimeout() und fetch(), sind nach Möglichkeit an die APIs gängiger Webbrowser angepasst und entwickeln sich in Übereinstimmung mit den Webstandards für Browser. Die bereitgestellten Rust-APIs, die direkt im Code der Plattform verwendet werden, sowie die Schnittstelle zur Entwicklung von Plugins für die Deno-Laufzeit sind derzeit noch nicht stabil und befinden sich in der Entwicklung.

Die Schlüsselmotive für die Schaffung einer neuen JavaScript-Plattform waren der Wunsch, konzeptionelle Fehler zu beseitigen, die gemacht wurden in der Architektur von Node.js, und den Benutzern eine sicherere Umgebung zu bieten. Um die Sicherheit zu erhöhen, wurde das Wrapper um die V8-Engine in Rust geschrieben, das viele Sicherheitsanfälligkeiten vermeidet, die durch niedrigstufige Speicherverwaltung entstehen können, wie z.B. Zugriffe auf Speicherbereiche nach deren Freigabe, Dereferenzierung von Nullzeigern und Pufferüberläufe. Zur Bearbeitung von Anfragen im nicht blockierenden Modus wird die Plattform Tokio, ebenfalls in Rust geschrieben, verwendet. Tokio ermöglicht die Erstellung von leistungsstarken, ereignisgesteuerten Anwendungen, die Multithreading und die asynchrone Bearbeitung von Netzwerk-Anfragen unterstützen.

Haupt- Beispielcodes 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;
  • Eingebaute Unterstützung für TypeScript neben JavaScript verwendet. Zur Typüberprüfung und zur Generierung von JavaScript wird der integrierte TypeScript-Compiler verwendet, was zu einer Verringerung der Leistung im Vergleich zur Analyse von JavaScript in V8 führt. In Zukunft ist geplant, eine eigene Implementierung des TypeScript-Typenprüfungssystems zu entwickeln, die die Verarbeitung von TypeScript deutlich beschleunigen wird;
  • Die Laufzeit wird in Form einer einzigen, eigenständigen ausführbaren Datei («deno») bereitgestellt. Um Anwendungen mit Deno auszuführen, genügt es, heruntergeladen Für seine Plattform bietet Deno eine ausführbare Datei mit einer Größe von etwa 20 MB, die keine externen Abhängigkeiten hat und keine besondere Installation im System erfordert. Dabei ist Deno keine monolithische Anwendung, sondern eine Sammlung von Crate-Paketen in Rust (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 der Standardmodulsatz, dessen Verwendung keine Bindung an externe Abhängigkeiten erfordert. Die Module aus der Standardkollektion haben zusätzliches Audit und Kompatibilitätsprüfungen durchlaufen;
  • Zusätzlich zur Laufzeit fungiert die Deno-Plattform auch als Paketmanager und ermöglicht es, innerhalb des Codes auf Module über URLs zuzugreifen. Zum Beispiel kann zur Bereitstellung eines Moduls im Code angegeben werden «import * as log from «https://deno.land/std/log/mod.ts». Von externen Servern über URLs heruntergeladene Dateien werden zwischengespeichert. Die Bindung an Modultypen erfolgt durch Angabe von Versionsnummern innerhalb der URLs, 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.

Unterschiede zu Node.js:

  • Deno verwendet keinen Paketmanager npm
    und ist nicht an Repositories gebunden. Die Adressierung von Modulen erfolgt über URLs oder Dateipfade, und die Module können auf jeder Website platziert werden;
  • In Deno wird keine "package.json" zur Definition der Module verwendet;
  • Unterschiede in der API; alle asynchronen Aktionen in Deno geben ein Promise zurück;
  • Deno erfordert eine explizite Definition aller erforderlichen Berechtigungen für Dateien, Netzwerke und Umgebungsvariablen;
  • Alle Fehler ohne Behandler führen zur Beendigung der Anwendung;
  • In Deno wird ein ECMA-Script-Modulsystem verwendet, und require() wird nicht unterstützt;
  • Der integrierte HTTP-Server von Deno ist in TypeScript geschrieben und arbeitet über native TCP-Sockets, während der HTTP-Server von Node.js in C geschrieben ist und Bindungen für JavaScript bereitstellt. Die Entwickler von Deno haben sich darauf konzentriert, die gesamte TCP-Socket-Schicht zu optimieren und eine allgemeinere Schnittstelle bereitzustellen. Der HTTP-Server von Deno bietet eine geringere Durchsatzrate, garantiert jedoch vorhersehbar niedrige Latenzen. Beispielsweise konnte eine einfache Anwendung auf der Deno HTTP-Server-Basis 25.000 Anfragen pro Sekunde mit einer maximalen Latenz von 1,3 Millisekunden verarbeiten. In Node.js konnte eine ähnliche Anwendung 34.000 Anfragen pro Sekunde verarbeiten, jedoch schwankten die Latenzen zwischen 2 und 300 Millisekunden.
  • Deno ist nicht mit Paketen für Node.js (NPM) kompatibel, entwickelt sich jedoch separat Schicht zur Kompatibilität mit der Standardbibliothek von Node.js, so dass mit der Weiterentwicklung von Deno immer mehr Anwendungen, die für Node.js geschrieben wurden, betrieben werden können.
  • Quelle: opennet.ru

60GB SSD 8Gb DDR4