Heim > Web-Frontend > js-Tutorial > Hauptteil

Was ist Deno? Was ist der Unterschied zu Node.js?

青灯夜游
Freigeben: 2021-06-28 11:15:45
nach vorne
3248 Leute haben es durchsucht

Deno wurde entwickelt, um einige der inhärenten Probleme von Node zu lösen. Was ist also der Unterschied zu Node.js? Im folgenden Artikel erfahren Sie mehr über Deno und stellen den Unterschied zwischen Deno und Node.js vor.

Was ist Deno? Was ist der Unterschied zu Node.js?

【Empfohlene Studie: „nodejs Tutorial“】

Ryan Dahl, der Autor von Node.js, hat die letzten anderthalb Jahre damit verbracht, eine neue JavaScript-LaufumgebungDeno zu entwickeln, um einige der Probleme zu lösen interne Probleme der Knotenfrage.

Aber verstehen Sie mich nicht falsch, dank des riesigen Community-Ökosystems und des Nutzungsumfangs von JavaScript ist Node eine sehr gute JavaScript-Laufumgebung. Allerdings gab Dahl auch zu, dass es einige Aspekte von Node gibt, die er umfassender berücksichtigen sollte, wie zum Beispiel: Sicherheit, Modulmechanismus, Abhängigkeitsmanagement usw.

In seinem Plan hatte er nicht vorhergesehen, zu welcher großen Plattform sich Deno in kurzer Zeit entwickeln könnte. Wenn wir zurück ins Jahr 2009 gehen, war JavaScript natürlich immer noch eine seltsame kleine Sprache, über die sich jeder lustig machen konnte, und sie verfügte nicht über so viele Sprachfunktionen wie heute.

Was ist Deno und was sind seine Hauptfunktionen?

Deno ist eine sichere TypeScript-Laufzeitumgebung, die auf der Google V8-Engine basiert. Hier sind einige Materialien zum Erstellen von Deno:

  • Rust (Denos Kernmodule sind in Rust geschrieben und Nodes Kernmodule sind in C++ implementiert)
  • Tokio (in Rust implementiertes asynchrones Programmierframework)
  • TypeScript (Denos Unterstützung für JavaScript und TypeScript wird standardmäßig unterstützt)
  • V8 (JavaScript-Laufzeitumgebung von Google, hauptsächlich verwendet in Chrome und Node)

Werfen wir einen Blick auf die Funktionen, die Deno bietet.

Sicherheit (Berechtigungsverwaltung)

Das wichtigste Merkmal von Deno ist die Sicherheit.

Im Vergleich zu Node verwendet Deno standardmäßig eine Sandbox-Umgebung, um Code auszuführen, was bedeutet, dass die laufende Umgebung keine Berechtigung zum Betrieb der folgenden Module hat:

  • Dateisystem
  • Netzwerk
  • Andere Skripte ausführen
  • Systemumgebung Variablen

Lassen Sie uns einen Blick darauf werfen, wie das Berechtigungssystem von Deno funktioniert.

(async () => {
 const encoder = new TextEncoder();
 const data = encoder.encode('Hello world\n');

 await Deno.writeFile('hello.txt', data);
 await Deno.writeFile('hello2.txt', data);
})();
Nach dem Login kopieren

Dieses Skript erstellt zwei Dateien mit den Namen hello.txt bzw. hello2.txt und schreibt Hello world hinein. Dieser Code wird jedoch in einer Sandbox-Umgebung ausgeführt und verfügt daher nicht über die Berechtigung zum Betrieb des Dateisystems. hello.txthello2.txt的文件,并在其中写入Hello world。但是这段代码运行在沙箱环境中,所以是没有文件系统的操作权限滴。

还有一点值得注意,在上面的脚本中我们使用Deno命名空间来操作文件,而不像在Node中使用fs模块。Deno命名空间提供了超多基础方法。不过使用Deno命名空间会导致我们的代码失去了对浏览器的兼容性,这个问题我们晚点再聊。

使用下面的命令执行上述脚本:

$ deno run write-hello.ts
Nach dem Login kopieren

执行之后,我们会收到下面的提示:

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)]
Nach dem Login kopieren

实际上,基于上面创建文件的脚本我们会收到两次来自沙箱环境的权限提示。不过如果我们选择allow always选项,就只会被询问一次啦。

如果我们选了deny,会抛出一个PermissionDenied的错误,如果我们没写错误处理逻辑的话,进程在此时就被终止啦。

如果我们用下面的命令来执行脚本:

deno run --allow-write write-hello.ts
Nach dem Login kopieren

会在没有提示的情况下创建这两个文件。

Deno针对文件系统的命令行标志位,除了--allow-write,还有--allow-net/--allow-env/--allow-run,分别用来开启针对网络、系统环境变量和操作子进程的权限。

模块机制

Deno使用浏览器一样的方式,通过URL来加载模块。很多人第一次见到在服务端的import语句中见到URL会感到有点困惑,但对我来说这还蛮好理解的:

import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
Nach dem Login kopieren

你觉得通过URL来引入模块会有啥大不了的吗?答案其实蛮简单的:通过使用URL来加载模块,Deno就可以避免引入一个类似npm的中心化系统来发布package,npm最近受到了很多吐槽

通过URL来引入代码,可以让包的作者们使用自己最喜爱的方式来维护和发布自己的代码。再也不会有package.jsonnode_modules了。

当我们启动应用之后,Deno会下载所有被引用的文件,并将它们缓存到本地。一旦引用被缓存下来,Deno就不会再去下载它们了,除非我们使用-- relaod

Es ist auch erwähnenswert, dass wir im obigen Skript den Deno-Namespace zum Betreiben von Dateien verwenden, im Gegensatz zur Verwendung des fs-Moduls in Node. Der Deno-Namespace bietet viele grundlegende Methoden. Die Verwendung des Deno-Namespace führt jedoch dazu, dass unser Code die Kompatibilität mit Browsern verliert. Wir werden dieses Problem später besprechen.

Führen Sie das obige Skript mit dem folgenden Befehl aus: 🎜
export { test, assertEquals } from "https://deno.land/std/testing/mod.ts";
Nach dem Login kopieren
Nach dem Login kopieren
🎜Nach der Ausführung erhalten wir die folgende Eingabeaufforderung: 🎜
import { test, assertEquals } from './local-test-utils.ts';
Nach dem Login kopieren
Nach dem Login kopieren
🎜Tatsächlich erhalten wir basierend auf dem obigen Skript zum Erstellen der Datei zwei Berechtigungsaufforderungen aus der Sandbox-Umgebung. Wenn wir jedoch die Option immer zulassen auswählen, werden wir nur einmal gefragt. 🎜🎜Wenn wir deny auswählen, wird ein PermissionDenied-Fehler ausgegeben. Wenn wir keine Fehlerbehandlungslogik schreiben, wird der Prozess zu diesem Zeitpunkt beendet. 🎜🎜Wenn wir das Skript mit dem folgenden Befehl ausführen: 🎜
{
   "imports": {
      "http/": "https://deno.land/std/http/"
   }
}
Nach dem Login kopieren
Nach dem Login kopieren
🎜 werden beide Dateien ohne Nachfrage erstellt. 🎜🎜Zu den Befehlszeilenflags von Deno für das Dateisystem gehören --allow-write und --allow-net/--allow-env< /code>/ <code>--allow-run wird verwendet, um Berechtigungen für das Netzwerk, Systemumgebungsvariablen und den Betrieb von Unterprozessen zu aktivieren. 🎜

🎜Modulmechanismus🎜🎜🎜Deno verwendet die gleiche Methode wie ein Browser, um Module über URLs zu laden. Viele Leute sind etwas verwirrt, wenn sie zum ersten Mal eine URL in einer serverseitigen Importanweisung sehen, aber für mich ist es ziemlich einfach zu verstehen: 🎜
import { serve } from "http/server.ts";
Nach dem Login kopieren
Nach dem Login kopieren
🎜 Glauben Sie, dass es eine große Sache ist, Module über URLs einzuführen? Die Antwort ist eigentlich ganz einfach: Durch die Verwendung von URLs zum Laden von Modulen kann Deno die Einführung eines zentralisierten Systems wie npm zum Veröffentlichen von Paketen vermeiden, das kürzlich von Viele Beschwerden 🎜. 🎜🎜Durch die Einführung von Code über eine URL können Paketautoren ihren Code auf ihre bevorzugte Weise verwalten und veröffentlichen. Keine package.json und node_modules mehr. 🎜🎜Wenn wir die Anwendung starten, lädt Deno alle referenzierten Dateien herunter und speichert sie lokal zwischen. Sobald die Referenzen zwischengespeichert sind, lädt Deno sie nicht erneut herunter, es sei denn, wir verwenden das Flag --relaod, um einen erneuten Download auszulösen. 🎜🎜Es gibt noch ein paar Themen, die es wert sind, besprochen zu werden: 🎜

万一存放引用的站点挂了咋办?

由于没有了一个中心化的包管理站点,那些存放模块的站点可能因为各种各样的原因挂掉。如果在开发甚至生产环境出现这种情况是非常危险滴!

我们在上一节提到,Deno会缓存好已下载的模块。由于缓存是存放在我们的本地磁盘的,Deno的作者建议将这些缓存提交到代码仓库里。这样一来,即使存放引用的站点挂了,开发者们还是可以使用已经下载好的模块(只不过版本是被锁住的啦)。

Deno会把缓存存储在环境变量$DENO_DIR所指定的目录下,如果我们不去设置这个变量,它会指向系统默认的缓存目录。我们可以把$DENO_DIR指定我们的本地仓库,然后把它们提交到版本管理系统中(比如:git

只能使用URL来引用模块吗?

总是敲URL显得有点XX,还好,Deno提供了两种方案来避免我们成为XX。

第一种,你可以在本地文件中将已经引用的模块重新export出来,比如:

export { test, assertEquals } from "https://deno.land/std/testing/mod.ts";
Nach dem Login kopieren
Nach dem Login kopieren

假如上面这个文件叫local-test-utils.ts。现在,如果我们想再次使用test或者assertEquals方法,只需要像下面这样引用它们:

import { test, assertEquals } from &#39;./local-test-utils.ts&#39;;
Nach dem Login kopieren
Nach dem Login kopieren

看得出来,是不是通过URL来引用它们并不是最重要的啦。

第二种方案,建一个引用映射表,比如像下面这样一个JSON文件:

{
   "imports": {
      "http/": "https://deno.land/std/http/"
   }
}
Nach dem Login kopieren
Nach dem Login kopieren

然后把它像这样import到代码里:

import { serve } from "http/server.ts";
Nach dem Login kopieren
Nach dem Login kopieren

为了让它生效,我们还需要通过--importmap标志位让Deno来引入import映射表:

$ deno run --importmap=import_map.json hello_server.ts
Nach dem Login kopieren

如何进行版本管理

版本管理必须由包作者来支持,这样在client端可以通过在URL中设置版本号来下载:https://unpkg.com/liltest@0.0.5/dist/liltest.js

浏览器兼容性

Deno有计划做到兼容浏览器。从技术上讲,在使用ES module的前提下,我们不需要使用任何类似webpack的打包工具就能在浏览器上运行Deno代码。

不过呢,你可以使用类似Babel这样的工具可以把代码转化成ES5版本的JavaScript,这样可以兼容那些不支持所有最新语言特性的低版本浏览器中,带来的后果就是最终文件里有很多不是必须的冗余代码,增大代码的体积。

结果取决于我们的主要目的是啥。

支持TypeScript开箱即用

不需要任何配置文件就能在Deno中轻易地使用TypeScript。当然咯,你也可以编写纯JavaScript代码,并使用Deno去执行它。

总结

Deno,作为一个新的TypeScript和JavaScript的运行环境,是一个非常有趣的技术项目,并且至今已经稳定发展了一段时间。但是距离在生产环境中去使用它还有比较长的一段路要走。

通过去中心化(或者翻译成分布式?)的机制,把JavaScript生态系统从npm这样中心化的包管理系统中解放了出来。

Dahl希望在这个夏天快结束的时候能够发布1.0版本,所以如果你对Deno未来的新进展感兴趣的话,可以给它个star

最后还有一个日志系统的广告,大家可以去原文查看。

英文原文地址:https://blog.logrocket.com/what-is-deno/

更多编程相关知识,请访问:编程视频!!

Das obige ist der detaillierte Inhalt vonWas ist Deno? Was ist der Unterschied zu Node.js?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:juejin.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage