Maison > interface Web > js tutoriel > le corps du texte

Qu'est-ce que Déno ? Quelle est la différence avec Node.js ?

青灯夜游
Libérer: 2021-06-28 11:15:45
avant
3249 Les gens l'ont consulté

Deno a été créé pour résoudre certains problèmes inhérents à Node, alors quelle est la différence avec Node.js ? L'article suivant vous amènera à en savoir plus sur Deno et à présenter la différence entre Deno et Node.js.

Qu'est-ce que Déno ? Quelle est la différence avec Node.js ?

[Apprentissage recommandé : "Tutoriel Nodejs"]

Ryan Dahl, l'auteur de Node.js, a passé le passé Un an et demi Ils construisent tous un nouvel environnement d'exécution JavaScript Deno pour résoudre certains des problèmes inhérents à Node.

Mais ne vous méprenez pas. Grâce à l'énorme écosystème communautaire et à la portée d'utilisation de JavaScript, Node est un très bon environnement d'exécution JavaScript. Cependant, Dahl a également admis qu'il y a certains aspects de Node qu'il devrait considérer de manière plus approfondie, tels que : la sécurité, le mécanisme des modules, la gestion des dépendances, etc.

Dans son plan, il ne prévoyait pas quelle taille une plate-forme pourrait atteindre Deno dans un court laps de temps. Bien sûr, si l’on remonte à 2009, JavaScript était encore un petit langage étrange dont tout le monde pouvait se moquer, et il n’avait pas autant de fonctionnalités linguistiques qu’aujourd’hui.

Qu'est-ce que Deno et quelles sont ses principales caractéristiques ?

Deno est un environnement d'exécution TypeScript sécurisé construit sur le moteur Google V8. Voici quelques matériaux pour construire Deno :

  • Rust (le module principal de Deno est écrit en Rust et le module principal de Node est implémenté en C++)
  • Tokio (Rust implémente un framework de programmation asynchrone )
  • TypeScript (Deno prend en charge à la fois JavaScript et TypeScript)
  • V8 (runtime JavaScript produit par Google, principalement utilisé dans Chrome et Node)

Jetons un coup d'œil aux fonctionnalités fournies par Deno.

Sécurité (gestion des autorisations)

La fonctionnalité la plus importante de Deno est la sécurité.

Par rapport à Node, Deno utilise un environnement sandbox pour exécuter du code par défaut, ce qui signifie que l'environnement en cours d'exécution n'a pas l'autorisation d'exploiter les modules suivants :

  • Système de fichiers
  • Réseau
  • Exécuter d'autres scripts
  • Variables d'environnement système

Jetons un coup d'œil au fonctionnement du système d'autorisation de Deno.

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

 await Deno.writeFile('hello.txt', data);
 await Deno.writeFile('hello2.txt', data);
})();
Copier après la connexion

Ce script crée deux fichiers nommés hello.txt et hello2.txt respectivement, et y écrit Hello world. Cependant, ce code s'exécute dans un environnement sandbox et n'est donc pas autorisé à faire fonctionner le système de fichiers.

Il convient également de noter que dans le script ci-dessus, nous utilisons l'espace de noms Deno pour faire fonctionner les fichiers, contrairement à l'utilisation du module fs dans Node. L'espace de noms Deno fournit de nombreuses méthodes de base. Cependant, l'utilisation de l'espace de noms Deno entraînera une perte de compatibilité de notre code avec les navigateurs. Nous aborderons ce problème plus tard.

Exécutez le script ci-dessus à l'aide de la commande suivante :

$ deno run write-hello.ts
Copier après la connexion

Après l'exécution, nous recevrons l'invite suivante :

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)]
Copier après la connexion

En fait, basé sur le script qui crée le fichier ci-dessus nous recevrons deux invites d'autorisation de l'environnement sandbox. Cependant, si nous choisissons l'option allow always, cela ne nous sera demandé qu'une seule fois.

Si nous sélectionnons deny, une erreur de PermissionDenied sera générée. Si nous n'écrivons pas de logique de gestion des erreurs, le processus sera terminé à ce moment.

Si nous exécutons le script avec la commande suivante :

deno run --allow-write write-hello.ts
Copier après la connexion

les deux fichiers seront créés silencieusement.

Deno a des indicateurs de ligne de commande pour le système de fichiers En plus de --allow-write, il existe également --allow-net/--allow-env/--allow-run, qui sont utilisés pour activer le réseau, les variables d'environnement système et le fonctionnement. sous-processus respectivement.

Mécanisme de module

Deno utilise la même méthode qu'un navigateur, chargeant des modules via des URL. Beaucoup de gens seront un peu confus lorsqu'ils verront pour la première fois l'URL dans la déclaration d'importation sur le serveur, mais pour moi, c'est assez facile à comprendre :

import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
Copier après la connexion

Que pensez-vous qu'il se passera si vous introduisez le module via l'URL ? La réponse est en fait assez simple : en utilisant des URL pour charger les modules, Deno peut éviter d'introduire un système centralisé comme npm pour publier des packages npm a récemment reçu beaucoup de plaintes.

L'introduction du code via une URL permet aux auteurs de packages de maintenir et de distribuer leur code de la manière qu'ils préfèrent. Fini les package.json et les node_modules.

Lorsque nous démarrons l'application, Deno téléchargera tous les fichiers référencés et les mettra en cache localement. Une fois les références mises en cache, Deno ne les téléchargera plus à moins que nous n'utilisions le drapeau -- relaod pour déclencher un nouveau téléchargement.

Il reste encore quelques questions qui méritent d'être discutées :

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

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

我们在上一节提到,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";
Copier après la connexion

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

import { test, assertEquals } from './local-test-utils.ts';
Copier après la connexion

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

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

{
   "imports": {
      "http/": "https://deno.land/std/http/"
   }
}
Copier après la connexion

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

import { serve } from "http/server.ts";
Copier après la connexion

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

$ deno run --importmap=import_map.json hello_server.ts
Copier après la connexion

如何进行版本管理

版本管理必须由包作者来支持,这样在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/

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:juejin.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal