Catégories
Astuces et Design

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 recul d'une décennie. Cela n’en fait pas nécessairement une suite ou un supérieur à Node.js, mais il s’écarte de ce chemin.

Voir également:

Les principales différences: Deno prend en charge nativement TypeScript, la sécurité, les tests et les 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, laissez-moi vous ramener à une époque plus simple…

Modules Node.js

JavaScript n’avait pas de système de module standard en 2009. Cela était en partie à cause de son héritage de navigateur et ES6 / ES2015 était dans plusieurs années.

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 du 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 packages 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).

Modules Deno

Deno opte pour les modules ES2015 que vous import à partir d'une URL absolue ou relative:

import { something } from 'https://somewhere.com/somehow.js';

Le script de cette URL doit export fonctions ou autres valeurs en conséquence, par ex.

export function something() {
  console.log('something was executed');
}

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 exécuté.

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

  1. fichiers se terminant .cjs utiliser CommonJS
  2. fichiers se terminant .mjs utiliser des modules ES
  3. fichiers se terminant .js sont CommonJS SAUF SI le plus proche package.json ensembles "type": "module" ou node est exécuté avec un --input-type=module option.

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

Il n'y a pas de gestionnaire de paquets.

Une critique de npm est la taille même de chaque projet node_modules annuaire. 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 y font référence.

Je sais que vous pensez: «Ahh, mais et si…»

… Mais Deno a des options pour résoudre les problèmes soulevés par les URL des modules.

URL non fiables

Les URL peuvent échouer temporairement, changer ou disparaître définitivement. 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 répertoire dans le référentiel Git / autre de votre projet.

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

DENO_DIR=~/myproject/deno_modules`

Sous Windows cmd utilisation:

> set DENO_DIR="C:myprojectdeno_modules"

ou Windows Powershell:

> $env:DENO_DIR="C:myprojectdeno_modules"

Deno mettra en cache les modules dans ce répertoire lors de l’exécution de votre application afin qu’ils puissent être ajoutés au référentiel de contrôle de source du projet.

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 votre script d'entrée est-il normalement exécuté avec deno run. Le résultat autonome myscript.bundle.js Le fichier peut être déployé sur un serveur actif.

Le regroupement avec les meilleurs attend

Deno prend en charge les await: il n'y a pas besoin d'envelopper await appelle de façon anonyme async fonction. Malheureusement, l'attente de niveau supérieur échoue dans le regroupement, une fonction wrapper doit donc être ajoutée. Il s'agit d'un problème connu qui sera résolu dans une prochaine version.

Finalement: 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 plus sûre.

Versionnage du module

Idéalement, les URL des modules doivent être versionnées afin 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 } from 'https://deno.land/std@0.61.0/http/server.ts';

Il est possible de référencer la branche principale à la place:

import { serve } from 'https://deno.land/std/http/server.ts';

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

Il est possible de publier des modules Deno sur votre propre serveur en utilisant une convention de gestion des versions 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 à version publique.

Mentions de modules multiples

Vous devrez peut-être référencer la même URL de module dans de nombreux fichiers de 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 remplacement fonctionnerait, mais elle est maladroite, sujette aux erreurs et augmente les risques de conflits de fusion.

Vous pouvez également utiliser un seul fichier de dépendances qui importe chaque module 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';


export { parseDate, currentDayOfYear } from 'https://deno.land/std@0.61.0/datetime/mod.ts';

Vous pouvez ensuite référencer les modules Deno depuis deps.js dans tout autre fichier de projet:

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

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

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

Une autre option 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:

{
  "imports": {
    "path/": "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 path from 'path/mod.ts';
import { currentDayOfYear } from '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:

deno run 
  --importmap=import_map.json 
  --unstable 
  myscript.js

Les cartes d'importation sont actuellement une fonction instable, de sorte que --unstable drapeau est requis. La fonctionnalité peut changer dans les futures versions de Deno.

Enquête sur l'intégrité

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 dégâts 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 fournit une option de vérification d'intégrité. C'est plus simple si vous utilisez un seul fichier de dépendances (comme décrit ci-dessus):




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


export { parseDate, currentDayOfYear } from 'https://deno.land/std@0.61.0/datetime/mod.ts';

Le suivant deno commande 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 en tant que 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 communs de fichiers, d’événements, de tampons et d’utilitaires.

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 mai être en mesure d'importer l'un 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, des modules multiplateformes qui fonctionnent à la fois sur Node.js et Deno sans traitement spécial sont susceptibles d'arriver à mesure que l'écosystème d'exécution JavaScript évolue.

Plus de questions de module

Le référencement des URL des 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 de modules npm est simple et la recherche sur npmjs.com est simple. Votre terme de recherche peut renvoyer 500 résultats, mais la paralysie des choix est minimisée en classant les packages par popularité, qualité et facteurs de maintenance.

Envoyer 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 durable une fois qu'il atteindra quelques milliers de modules.

La mise à jour des packages est également facile dans npm. Tu peux courir npm outdated pour afficher une liste de mises à jour ou simplement npm install lorsque des 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 des mises à jour équivalente dans Deno. Des projets de type gestionnaire de packages sont disponibles, notamment Trex, Update Deno Dependencies et deno-check-updates, mais ceux-ci dépendent souvent de cartes d'importation et reposeront toujours sur des URL à versions sémantiques.

Devriez-vous passer à Deno?

Node.js n'est pas mort. Il est mature et compte une dizaine d’années de modules, de techniques, de documentation et d’expérience en matière d’exécution.

Deno exploite une grande partie de ces connaissances, mais elles sont très nouvelles et évolueront rapidement au cours des années à venir. Il est peut-être trop tôt pour parier sur Deno pour une application majeure, mais le risque est moindre 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 problème à passer à Deno et vice-versa.

Cependant, Deno a un avantage intéressant:

  • son système de modules est identique au JavaScript côté client
  • il met en œuvre de nombreuses API de navigateur: vous pouvez référencer un window objet, définissez des écouteurs d'événements, lancez Web Workers, effectuez des requêtes de serveur distant avec l'API Fetch (), etc.

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

Fondations Deno

Soyez au courant avec 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:

➤ Fondations Deno

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *