Fermer

septembre 26, 2020

Modules Deno: utilisation, meilleures pratiques et importations de modules de nœuds


En savoir plus sur les modules Deno – le plus grand changement de flux de travail que vous rencontrerez si vous venez de Node.js. Découvrez comment ils fonctionnent et comment les utiliser au mieux, comment utiliser les modules Node.js et les packages npm dans Deno, etc.

Node.js est un moteur d'exécution JavaScript basé sur le moteur V8 de Chrome, développé par Ryan Dahl, et sorti en 2009.

Deno est un moteur d'exécution JavaScript basé sur le moteur V8 de Chrome, développé par Ryan Dahl et sorti en 2020. Il a été créé avec le bénéfice d'une décennie de recul. Cela n’en fait pas nécessairement une suite ou une supériorité de Node.js, mais il s’écarte de ce chemin.

Voir aussi:

Les principales différences: Deno prend en charge nativement TypeScript, sécurité, tests et API de navigateur. La gestion des modules reçoit moins d'attention, mais il s'agit probablement du changement le plus important dans la façon dont vous créez des applications JavaScript. Avant de parler de Deno, permettez-moi de vous ramener à une époque plus simple…

Modules Node.js

JavaScript n'avait pas de système de module standard en 2009. C'était en partie à cause de son héritage de navigateur et ES6 / ES2015 était plusieurs

Il aurait été inconcevable que Node.js ne fournisse pas de modules, il a donc adopté CommonJS à partir d'un choix de solutions de contournement communautaires. Cela a conduit au développement de Node Package Manager, ou npm qui a permis aux développeurs de rechercher, d'utiliser et de publier facilement leurs propres modules JavaScript.

L'utilisation de npm a augmenté de façon exponentielle. Il est devenu le gestionnaire de paquets le plus populaire jamais conçu et, à la mi-2020, héberge près de 1,5 million de modules et plus de 800 nouveaux sont publiés chaque jour (source: modulecounts.com ).

Deno Modules [19659007] Deno opte pour Modules ES2015 que vous importez depuis une URL absolue ou relative:
 import   { quelque chose }   de [19659015] 'https://somewhere.com/somehow.js' ; 

Le script de cette URL doit exporter des fonctions ou d'autres valeurs en conséquence, par exemple la fonction

 export     quelque chose  ()   {
   console .  log  ( «quelque chose a été exécuté» ) ; [19659031]} 

Deno utilise un système de modules identique à celui implémenté dans les navigateurs web modernes.

Node.js prend également en charge les modules ES2015 … mais c'est compliqué et reste expérimental . Les modules CommonJS et ES2015 se ressemblent, mais fonctionnent de différentes manières:

  • CommonJS charge les dépendances du système de fichiers à la demande lors de l'exécution du code.
  • Les modules ES sont pré-analysés à partir des URL afin de résoudre d'autres importations avant que le code ne soit

Node.js doit continuer à prendre en charge CommonJS et à gérer les modules ES mélangés. Cela suppose donc:

  1. les fichiers se terminant par .cjs utilisent les fichiers CommonJS
  2. les fichiers se terminant par .mjs utilisent les modules ES
  3. les fichiers se terminant par .js sont CommonJS A MOINS QUE le package.json ensembles le plus proche "type": "module" ou node est exécuté avec une entrée -type = module option.

On comprend pourquoi Deno a opté pour le système de module standard unique. Cependant, npm était au cœur du succès de Node, il est donc surprenant de découvrir que Deno le supprime.

Il n'y a pas de gestionnaire de paquets.

Une critique de npm est la taille même de chaque projet. répertoire node_modules . Il peut atteindre des centaines de mégaoctets car les modules nécessitent des versions spécifiques d'autres modules.

 Masse des modules de nœuds

Deno télécharge et met en cache un module dans un répertoire global la première fois que son URL est rencontrée dans un script . Par conséquent, une seule copie d'une version de module spécifique est requise, quel que soit le nombre de projets qui la référencent.

Je sais que vous pensez: «ahh, mais que se passe-t-il si…»

… mais Deno a des options pour résoudre les problèmes soulevés par les URL de module.

URL non fiables

Les URL peuvent échouer temporairement, changer ou disparaître pour toujours. C'est un problème pour n'importe quel gestionnaire de paquets et npm a rencontré des problèmes dans le passé (il permet également l'installation à partir d'une URL ).

Pour les applications Node.js critiques, il est conseillé d'ajouter votre node_modules dans le référentiel Git / other de votre projet.

Deno prend en charge une option similaire. Vous pouvez définir la variable d'environnement DENO_DIR sur un chemin de répertoire dans votre projet actuel, par exemple

 DENO_DIR  =  ~ / myproject / deno_modules`

Sous Windows cmd utilisez:

>   set   DENO_DIR  =  "C:  myproject  deno_modules" 

ou Windows Powershell: [19659060]> $ env : DENO_DIR = "C: myproject deno_modules"

Deno mettra en cache les modules dans ce répertoire lorsque votre application s'exécutera afin qu'ils puissent être ajoutés à la source du projet référentiel de contrôle.

Vous pouvez également envisager de regrouper vos dépendances dans un seul fichier JavaScript ou TypeScript. La commande Deno bundle peut le faire en une seule étape:

 deno bundle myscript.js myscript.bundle.js

myscript.js est votre script d'entrée normalement exécuté avec deno run . Le fichier autonome résultant myscript.bundle.js pourrait être déployé sur un serveur en direct.

Regroupement avec des attentes de niveau supérieur

Deno prend en charge le niveau supérieur wait : il n'est pas nécessaire d'encapsuler les appels wait dans une fonction async anonyme. Malheureusement, l'attente de niveau supérieur échoue dans le regroupement donc une fonction wrapper doit être ajoutée. C'est un problème connu et sera corrigé dans une prochaine version.

Enfin: méfiez-vous des modules Deno aléatoires sur des URL inhabituelles! Une URL Deno, Github ou Bitbucket avec une bonne documentation et une contribution de la communauté sera généralement être plus sûr.

Gestion des versions de modules

Idéalement, les URL des modules devraient être versionnées pour que vous fassiez référence à une version de code particulière. Par exemple, la bibliothèque standard Deno vous permet de charger une version spécifique du module serveur HTTP :

 import   { serve } [19659014] à partir de   'https://deno.land/std@0.61.0/http/server.ts' ; 

Il est possible de référencer la master branch à la place: [19659012] import { serve } from 'https://deno.land/std/http/server.ts' ;

mais cela téléchargerait le la dernière version et une version future pourraient être incompatibles avec votre application.

Il est possible de publier des modules Deno sur votre propre serveur en utilisant une convention de version similaire, mais votre site pourrait recevoir beaucoup de trafic à mesure qu'il devenait populaire. Une méthode plus robuste consiste à utiliser un référentiel sur un service tel que GitHub et à attribuer une balise git à chaque version. Des services tels que denopkg.com et unpkg.com peuvent être utilisés pour fournir une URL de module versée publiquement.

Mentions de modules multiples

Vous devrez peut-être faire référence au même URL du module dans de nombreux fichiers dans la base de code de votre application. Lorsque vous souhaitez mettre à jour ce module, l'URL doit être modifiée à plusieurs endroits. Une recherche et un remplacement fonctionneraient, mais ils sont compliqués, sujets aux erreurs et augmentent les risques de conflits de fusion.

Vous pouvez également utiliser un seul fichier de dépendances qui importe tous les modules que vous utilisez dans le projet. Il est généralement nommé deps.js ou deps.ts :




 export   *   as  path  from   'https: //deno.land/std@0.61.0/path/mod.ts'[19659016[/  'https://deno.land/std@0.61.0/datetime/mod.ts' ; 

Vous pouvez ensuite référencer les modules Deno de deps.js dans n'importe quel autre fichier de projet:

 import   { path  currentDayOfYear }   from   './ deps.js' ; 

 console [19659016].  log  ( path .  sep  ) ; 
 console .  log  (  currentDayOfYear  ()  ) ; 

Il vous suffit de modifier une seule référence URL dans deps.js lorsqu'un module est mis à jour.

Une alternative L'option ive est une carte d'importation. Il s'agit d'un petit fichier JSON, généralement nommé import_map.json qui attribue un nom à une URL complète ou partielle:

 {
   "importations" :   {
     ] "chemin /" :   "https://deno.land/std@0.61.0/path/" 
     "datetime /" :   "https : //deno.land/std@0.61.0/datetime/ "
  } 
} 

Vous pouvez référencer les noms de mappe d'importation dans n'importe quel script:

 import   *   as  chemin  de   'chemin / mod.ts' ; 
 import   { currentDayOfYear }   de   'datetime / mod. ts '; 

 console .  log  ( path .  sep  ) ; 
 console .  log  ( currentDayOfYear  () ) ; 

Le fichier JSON est ensuite importé lors de l'exécution de l'application avec deno run : [19659065] deno run
–importmap = import_map.json
– instable
myscript.js

Les cartes d'importation sont actuellement une fonction instable, donc l'indicateur - unstable est requis. Cette fonctionnalité pourrait changer dans les futures versions de Deno.

Investigating Integrity

Le code référencé à partir d'une URL pourrait être modifié ou piraté à votre insu. Des sites de haut niveau ont été compromis car ils étaient directement liés au code client tiers. Imaginez les dommages qu'un script pourrait causer s'il avait accès aux ressources du serveur.

Deno a une sécurité intégrée, donc les scripts doivent être exécutés avec des indicateurs tels que - allow-read et - allow-net pour limiter l'accès au système de fichiers et au réseau. Cela aidera à éviter certains problèmes, mais cela ne remplace pas la vérification de l’intégrité du module!

Deno propose une option de vérification d’intégrité . C'est plus simple si vous utilisez un fichier de dépendances unique (comme décrit ci-dessus) :




 export   *   comme  path  from   'https: / /deno.land/std@0.61.0/path/mod.ts'[19659016[/[19659093[19659013) parseDate  currentDayOfYear }   de [19659015] 'https://deno.land/std@0.61.0/datetime/mod.ts' ; 

La ​​commande deno suivante génère un lock.json ] fichier contenant une somme de contrôle de tous les modules Deno importés:

 deno cache --lock  =  lock.json --lock-write deps.js

Lorsqu'un autre développeur clone votre projet, il peut recharger chaque module et vérifier l'intégrité de chacun pour garantir qu'ils sont identiques au vôtre:

 deno cache --reload --lock  =  lock.json deps.js

Le contrôle d'intégrité n'est pas appliqué par Deno. Il peut être préférable d'exécuter ces processus sous forme de hooks Git automatisés ou similaires.

Utilisation des modules Node.js

De nombreuses API Node.js ont été répliquées pour Deno – voir deno.land/std/node ]. Ce n’est pas une liste complète, mais vous trouverez des modules de fichiers, d’événements, de tampons et d’utilitaires communs.

Une collection de près de 800 modules Deno tiers est disponible sur deno.land/x . Il existe des frameworks de type Express.js, des pilotes de base de données, des fonctions de chiffrement, des outils de ligne de commande, etc.

Vous découvrirez également des listes organisées de modules populaires tels que Awesome Deno .

Cependant, vous pouvez pouvoir importer n'importe lequel des 1,5 million de modules Node.js. Plusieurs CDN peuvent convertir les packages npm / CommonJS en URL de module ES2015, notamment:

Que le module dont vous avez besoin fonctionne sans problème dans Deno est une autre affaire.

Heureusement, les modules multiplateformes qui fonctionnent à la fois sur Node.js et Deno

Plus d'informations sur les modules

Le référencement des URL de modules est controversé et peut être déconcertant pour ceux qui viennent du très populaire npm. Cela dit, Deno a simplifié l'utilisation du module JavaScript. Il répond à plusieurs critiques de npm tout en atténuant de nombreux effets secondaires potentiels des modules ES2015.

Mais c'est loin d'être parfait.

La publication des modules npm est simple et la recherche npmjs.com est simple. Votre terme de recherche peut renvoyer 500 résultats, mais la paralysie des choix est minimisée par le classement des packages par facteurs de popularité, de qualité et de maintenance .

La soumission du code à la liste des modules tiers de Deno est Plus difficile. Les modules doivent passer des tests automatisés, mais il n'y a aucune garantie de qualité et les résultats de la recherche sont classés par ordre alphabétique. Il est peu probable que le système existant soit viable une fois qu'il atteindra quelques milliers de modules.

La mise à jour des paquets est également facile dans npm. Vous pouvez exécuter npm obsolète pour afficher une liste des mises à jour ou simplement npm install lorsque numéros de version plus lâches sont référencés dans package.json .

Il n'y a pas d'option de vérification de mise à jour équivalente dans Deno. Des projets de type gestionnaire de paquets sont disponibles, notamment Trex Update Deno Dependencies et deno-check-updates mais ceux-ci dépendent souvent de import maps ] et s'appuiera toujours sur des URL à versions sémantiques.

Devriez-vous passer à Deno?

Node.js n'est pas mort. Il est mature et possède une décennie de modules, de techniques, de documentation et d’expérience derrière le runtime.

Deno exploite une grande partie de ces connaissances, mais il est très récent et évoluera rapidement au cours des prochaines années. Il est peut-être trop tôt pour parier sur Deno pour une application majeure, mais il y a moins de risques pour les petits projets. Ceux qui utilisent déjà TypeScript ou qui viennent d'autres langages peuvent profiter d'une expérience plus facile, mais les développeurs de Node.js n'auront aucun mal à passer à Deno et inversement.

Cependant, Deno a un avantage intéressant:

  • son ​​système de modules est identique au JavaScript côté client
  • il implémente de nombreuses API de navigateur: vous pouvez référencer un objet window définir des écouteurs d'événements, lancer des Web Workers, effectuer des requêtes de serveur distant avec l'API Fetch (), etc.

Le rêve de bibliothèques JavaScript isomorphes fonctionnant soit sur le client soit sur le serveur a fait un pas en avant significatif.

Deno Foundations

Soyez au courant de Deno. Notre collection Deno Foundations vous aide à faire vos premiers pas dans le monde Deno et au-delà, et nous y ajoutons constamment. Nous vous apporterons les tutoriels dont vous avez besoin pour devenir un pro. Vous pouvez toujours vous référer à notre index tel qu’il est mis à jour à la fin de notre introduction à Deno:

Deno Foundations




Source link