Deno (Software)
Deno
| |
---|---|
![]() | |
Basisdaten
| |
Hauptentwickler | denoland |
Entwickler | Ryan Dahl |
Erscheinungsjahr | 13.05.2018[1] |
Aktuelle Version | 1.45.2[2] (12. Juli 2024) |
Betriebssystem | Linux, MacOS, Windows |
Programmiersprache | TypeScript, JavaScript, Rust, C++ |
Kategorie | Laufzeitumgebung |
Lizenz | MIT-Lizenz[3][4] |
deno.com |
Deno ist eine Laufzeitumgebung für JavaScript und TypeScript, die auf der V8-JavaScript-Engine basiert und in Rust geschrieben wurde. Sie wurde von Ryan Dahl erschaffen, dem ursprünglichen Schöpfer von Node.js.[5][6] Sie wurde 2018 von Dahl in seinem Vortrag „10 Things I Regret About Node.js“ (deutsch: „10 Dinge, die ich an Node.js bereue“) angekündigt.[7] Deno vereint sowohl Laufzeitumgebung als auch Paketverwaltung in einem Programm.[8][9]
Geschichte
Deno wurde auf der JSConf EU 2018 von Ryan Dahl in seinem Vortrag „10 Things I Regret About Node.js“ (deutsch: „10 Dinge, die ich an Node.js bereue“) angekündigt.[7] In dem Vortrag schildert Ryan, dass er einige Designentscheidungen bei Node.js bereut, dass er keine Promises im API-Design benutzt, das Verwenden des legacy GYP building system, den node_modules Ordner und die package.json, Dateinamenserweiterungen wegzulassen, die automatische Modulauflösung mit der index.js und das Auflösen der Sandbox von V8.[10] Schließlich präsentierte er den Prototyp von Deno.
Deno war ursprünglich in Go geschrieben[11], wurde aber bald nach Rust übersetzt. Grund dafür waren Bedenken wegen der doppelten Laufzeitumgebung (der von Go und Deno selbst) und Garbage Collection.[12]
Im November 2018 wurde eine Standardbibliothek erstellt, die an die Go-Standardbibliothek angelehnt war, die umfangreiche Werkzeuge bereitstellte, um Probleme mit den Node.js-Abhängigkeitsbäumen zu lösen.[13]
Die Version 1.0 von Deno wurde am 13. Mai 2020 veröffentlicht.[14]
Vergleich mit Node.js
Deno und Node.js sind beides Laufzeitumgebungen basierend auf Googles V8-JavaScript-Engine, die auch in Google Chrome verwendet wird. Beide haben interne Ereignisschleifen und können über die Kommandozeile aufgerufen werden, um Skripte und Hilfsbefehle auszuführen.
Sie unterscheiden sich vor allem in folgenden Punkten:[8]
- Deno nutzt ES Modules als standard Module-System, statt CommonJS.
- Für Abhängigkeiten nutzt Deno URLs, ähnlich wie Webbrowser.
- Deno enthält einen integrierten Paketmanager, daher wird npm nicht benötigt.
- Deno ist kompatibler mit Webbrowsern und unterstützt ein breites Spektrum an Web APIs.
- Der Zugriff auf das Dateisystem und Netzwerk ist durch die Sandbox in Deno kontrollierbar.[6]
- Deno unterstützt Promises, ECMAScript ES6 und TypeScript.[6]
- Trotz der großen Standardbibliothek hat Deno einen kleineren Kern.
- Deno nutzt für die Systemzugriffe spezielle Nachrichtenkanäle.
Benutzung
Der folgende Befehl führt die TypeScript-Datei main.ts ohne Lese-, Schreib- oder Netzwerkzugriff (Sandbox mode) aus:
deno run main.ts
Zugriff aufs Dateisystem oder Netzwerk kann über bestimmte Attribute gewährt werden:
deno run --allow-read --allow-net main.ts
Um den Abhängigkeitsbaum des Skriptes anzuzeigen, kann der info
Unterbefehl genutzt werden:
deno info main.ts
Ein einfaches Hallo-Welt-Programm sieht in Deno (wie auch in Node.js) wie folgt aus (das könnte z. B. in der main.ts stehen):
console.log("Hello world");
Um die Deno eigene API zu benutzen, wird ein spezieller, globaler Namensraum genutzt, den es in Browsern nicht gibt. Das Unix cat Programm könnte wie folgt programmiert werden:
/* cat.ts */ /* Deno APIs werden über den Namensraum `Deno` bereitgestellt. */ const { stdout, open, copy, args } = Deno; // await wird auf oberster Ebene unterstützt for (let i = 0; i < args.length; i++) { const filename = args[i]; // Enthält das Kommandozeilenargument const file = await open(filename); // Öffnet die entsprechende Datei zum Auslesen await copy(file, stdout); // Führt ein asynchrones kopieren von `file` nach `stdout` durch. }
Die Deno.copy
Funktion oben funktioniert so wie Gos io.Copy
, während stdout
(Standardausgabe) das Ziel ist und file
die Quelle.
Um das Programm auszuführen, werden Leserechte auf dem Dateisystem benötigt:
deno run --allow-read cat.ts myfile
Das folgende Deno-Skript implementiert einen einfachen HTTP-Server:
// Importiert `serve` von der Deno Standardbibliothek über eine URL. import { serve } from "https://deno.land/[email protected]/http/server.ts"; // `serve` Funktion gibt einen asynchronen Iterator zurück, der nach und nach die Anfragen zurückgibt for await (const req of serve({ port: 8000 })) { req.respond({ body: "Hello World\n" }); }
Wenn das Programm ausgeführt wird, lädt Deno automatisch die Standardbibliothek herunter, cacht sie und kompiliert den Code.
Weblinks
- Offizielle Website
- Deno auf GitHub
Einzelnachweise
- ↑ Contributors, denoland/deno, Github. Abgerufen am 5. Juli 2019 (englisch).
- ↑ Release 1.45.2. 12. Juli 2024 (abgerufen am 22. Juli 2024).
- ↑ deno/LICENSE at master. In: GitHub. Abgerufen am 5. Juli 2019 (englisch).
- ↑ The MIT License. In: Open Source Initiative. 17. September 2018, abgerufen am 17. September 2018 (englisch).
- ↑ Deno: Secure V8 TypeScript Runtime from Original Node.js Creator. In: InfoQ. Abgerufen am 17. Mai 2019 (englisch).
- ↑ a b c Silke Hahn: Webentwicklung: Deno 1.0 soll Node.js als Framework für Skriptsprachen ersetzen. 14. Mai 2020, abgerufen am 6. Juni 2020.
- ↑ a b 10 Things I Regret About Node.js – Ryan Dahl – JSConf EU 2018. 6. Juni 2018, abgerufen am 17. Mai 2019 (englisch).
- ↑ a b Deno Manual. In: deno.land. Abgerufen am 17. Mai 2019 (englisch).
- ↑ Paul Krill: Ryan Dahl’s Node.js regrets lead to Deno. InfoWorld, 21. Juni 2018, abgerufen am 6. Juni 2020 (englisch).
- ↑ Ryan Dahl: Design mistakes in Node. (PDF) In: Github. 6. Juni 2018, abgerufen am 6. Juni 2020 (englisch).
- ↑ denoland/deno, branch „golang“. In: Github. Abgerufen am 6. Juni 2020 (englisch).
- ↑ Suggestion: Look into porting to Rust and using Tokio. In: GitHub. Abgerufen am 6. Juni 2020 (englisch).
- ↑ Deno Standard Modules. In: Github. Abgerufen am 6. Juni 2020 (englisch).
- ↑ Deno 1.0. In: deno.land. Abgerufen am 14. Mai 2020.