Archives Wild Code School
Node.js

Node 05 - 🚀 Concepts avancĂ©s et alternatives Ă  la CLI de npm

QuĂȘte 5 sur 5 · 2 images archivĂ©es

Objectifs

  • Savoir comment fonctionne le versioning sĂ©mantique.
  • GĂ©rer les dĂ©pendances et les dĂ©pendances de dĂ©veloppement dans package.json.
  • En savoir plus sur l'Ă©cosystĂšme de Node et NPM.

Pré-requis

  1. 1

    Valider la quĂȘte suivante

    QuĂȘtes liĂ©es

Introduction

Jusqu'à présent, tu as appris à utiliser NPM de maniÚre basique.

Cette quĂȘte a pour but d'approfondir un peu plus ta connaissance de NPM, de ses alternatives et des problĂšmes plus gĂ©nĂ©raux de gestion des dĂ©pendances dans tes applications.

Sommaire

Versionnage sémantique

Théoriquement, les numéros de version des paquets sur NPM doivent suivre une convention : le versionnage sémantique (semver). C'est un moyen de faire évoluer la version d'un logiciel donné de maniÚre explicite, afin de minimiser les incompatibilités et les erreurs.

Important !

Le concept du versionnage sĂ©mantique (semver) est primordial dans la gestion des dĂ©pendances d’un projet. Le versionnage sĂ©mantique repose sur trois niveaux de version :

  • Patch : Correction de bugs sans impact sur la compatibilitĂ©, modification du dernier chiffre (ex. 1.0.1 → 1.0.2).
  • Minor : Ajout de nouvelles fonctionnalitĂ©s sans rupture de compatibilitĂ©, modification du deuxiĂšme chiffre (ex. 1.0.0 → 1.1.0).
  • Major : Modification qui casse la compatibilitĂ© avec les versions prĂ©cĂ©dentes ("breaking change" en anglais), modification du premier chiffre (ex. 1.0.0 → 2.0.0).

Pour limiter la portée des mises à jour d'une dépendance, c'est possible d'utiliser des symboles comme ~ (mises à jour mineures et correctifs uniquement) ou ^ (correctifs uniquement) dans le fichier package.json.

C'est important de bien versionner les packages pour éviter des problÚmes d'incompabilité de code.

En moins bref :

▶
Vidéo YouTube
https://www.youtube.com/watch?v=kK4Meix58R4
↗
NPM docs

Semantic versioning

docs.npmjs.com
↗
Semantic versioning

Le site officiel

semver.org

❓Quiz

quiz
true|||true|||true
# Combien de parties devrait avoir un numéro de version suivant le "versioning sémantique" ?
[] 2 : Version majeure et version mineure
[x] 3 : Version majeure, mineure et patch
[] 4 : Version majeure, mineure, patch et hotfix. 
# Tous les paquets sur NPM suivent trÚs strictement la convention de "versionnement sémantique".
[] Vrai
[x] Faux
# Théoriquement, nous pouvons mettre à jour un paquet NPM donné de la version 2.5.3 à la version 2.9.1 sans nous soucier de la compatibilité avec notre code.
[x] Vrai
[] Faux
# Théoriquement, nous pouvons mettre à jour un paquet NPM donné de la version 3.2.6 à la version 4.1.1 sans nous soucier de la compatibilité avec notre code.
[] Vrai
[x] Faux
# Comment pouvons-nous spécifier que nous voulons seulement accepter les mises à jour de correctifs d'un paquet avec la version 1.2.3 ?
[x] 1.2
[x] 1.2.x
[] 1.2.3
[x] ~1.2.3
[] 1.x
[] 1
# Comment pouvons-nous spécifier que nous voulons seulement accepter les mises à jour mineures et les correctifs d'un paquet de version 1.2.3 ?
[x] ^1.2.3
[] 1.2
[] 1.2.x
[] 1.2.3
[x] 1.x
[x] 1

Le fichier package.json

Voici un exemple :

json
{
  "name": "my-super-project",
  "version": "1.0.0",
  "description": "An app that's going to change the world",
  "main": "app.js",
  "scripts": {
    "start": "node app.js",
    "start:watch": "nodemon app.js",
    "clean-packages": "rm -rf node_modules"
  },
  "keywords": ["super", "awesome"],
  "author": "Dave Lopper",
  "license": "ISC",
  "dependencies": {
    "chalk": "^4.1.2"
  },
  "devDependencies": {
    "nodemon": "^2.0.12"
  }
}

Comme tu l'as déjà vu, ce fichier contient des informations comme l'auteur du projet, le numéro de la version actuelle, la description, etc. Ici, nous allons nous concentrer sur certaines propriétés clés :

dependencies

C'est là que nous spécifions quels paquets et quelles versions de ces paquets sont nécessaires à notre projet. Les paquets sont automatiquement ajoutés dans cette section lorsque tu fais npm install <some-package>. Regarde la vidéo ci-dessus sur le versionnement sémantique pour comprendre comment tu peux spécifier des plages de versions.

devDependencies

Ici, tu spécifieras les paquets que tu utilises exclusivement lors du développement. Ces paquets ne seront pas nécessaires en production. Par exemple, les paquets de test, webpack, nodemon, etc.

Les paquets sont automatiquement ajoutés dans cette section lorsque tu fais npm install --save-dev <some-package> ou npm install -D <some-package>.

scripts

Ici tu peux définir les commandes que npm pourra exécuter avec npm run <nom-du-script>. Les scripts sont un bon moyen d'avoir des raccourcis et de documenter des tùches spéciales relatives au projet.

↗
NPM docs

Scripts

docs.npmjs.com
↗
npm-run-all

Un package permettant d'exécuter plusieurs commandes dans un seul script pour tout les OS

npmjs.com

Le fichier package-lock.json

Ce fichier est destinĂ© Ă  prĂ©server un comportement cohĂ©rent du module en "verrouillant" les versions des paquets entre diffĂ©rents environnements. Tu ne devrais jamais avoir Ă  modifier ce fichier toi-mĂȘme car NPM le met Ă  jour automatiquement lorsque tu installes ou dĂ©sinstalles quelque chose.

↗
NPM docs

Package locks

docs.npmjs.com

❓Quiz

quiz
true|||true|||true
# Le fichier package.json peut ĂȘtre utilisĂ© pour configurer des alias de commandes utiles pour le projet.
[x] Vrai
[] Faux
# Je veux installer "jest", qui est un framework de test.
[x] npm install --save-dev jest
[] npm install jest
# C'est une bonne pratique d'éditer le fichier package-lock.json à la main
[] Vrai
[x] Faux

Auditer les paquets pour les vulnérabilités de sécurité

Conscient des problÚmes de sécurité dans son systÚme de paquets, NPM a publié un outil pour analyser tes paquets et tester les failles de sécurité connues. Pour lancer la vérification, il suffit de taper ce qui suit à la racine de ton projet :

npm audit
↗
NPM docs

Auditer des paquets

docs.npmjs.com

Mise Ă  jour des paquets

La mise Ă  jour des paquets peut ĂȘtre importante, car les mises Ă  jour de sĂ©curitĂ© sont publiĂ©es assez souvent et peuvent protĂ©ger ton application contre des attaques potentielles :

npm update

Cela permettra de récupérer automatiquement la derniÚre version acceptable des paquets disponibles dans le registre NPM.

↗
NPM docs

Mettre Ă  jour des paquets

docs.npmjs.com

Correction d'un paquet

À un moment donnĂ© dans ta carriĂšre de dĂ©veloppeur, tu rencontreras peut-ĂȘtre des bibliothĂšques prĂ©sentant un bug.

Si le bug est vraiment critique et empĂȘche ton application de fonctionner correctement, si tu peux le corriger et si l'Ă©quipe Ă  l'origine du paquet est trop lente pour le corriger elle-mĂȘme ou accepter ta Pull Request, il sera peut-ĂȘtre judicieux de corriger le paquet que tu utilises.

Pour plus de détails :

↗
patch-package

Un outil pour t'aider Ă  corriger un paquet en cas d'urgence

npmjs.com

Le modÚle de dépendance

Tu sais que ton projet peut avoir des dépendances externes, mais as-tu réalisé que ces dépendances peuvent également avoir leurs propres dépendances, qui à leur tour ont leurs propres dépendances, et ainsi de suite ?

Comment NPM gÚre-t-il tout ce bazar ? Voici un article trÚs complet sur la façon dont NPM résout les dépendances :

↗
Understanding the npm dependency model

Et peut-ĂȘtre comprendre ce qu'est une "peer dependency"

lexi-lambda.github.io

Des alternatives Ă  la CLI de NPM

NPM a été publié pour la premiÚre fois en 2010. Au fil des années, des alternatives à l'interface de ligne de commande officielle de NPM sont apparues.

Ces alternatives ont pour but d'améliorer les performances, la sécurité et la stabilité par rapport à la CLI par défaut, tout en restant compatibles avec presque tous les paquets NPM existants.

Yarn

Yarn a été publié en 2016, soutenu par de grandes entreprises comme Facebook et Google. Tu peux l'installer avec NPM (ce qui est un peu bizarre, non ?) :

npm install -g yarn
▶
Vidéo YouTube
https://www.youtube.com/watch?v=0DGClZD5LEM
↗
Yarn

Le site officiel

yarnpkg.com

PNPM

PNPM (Performant NPM) version 1 est sorti en 2017. Au moment de la rĂ©daction de cette quĂȘte, c'est le gestionnaire de paquets le plus rapide en ville d'aprĂšs ses benchmarks. L'autre avantage principal est que PNPM supporte les mĂȘmes commandes que la CLI par dĂ©faut de NPM.

Si tu veux l'essayer :

npm install -g pnpm
▶
Vidéo YouTube
https://www.youtube.com/watch?v=KdHiziZsz7s
↗
PNPM

Le site officiel

pnpm.io

❓Quiz

quiz
true|||true|||true
# Yarn a exactement les mĂȘmes commandes que la CLI officielle de NPM.
[x] Faux
[] Vrai
# Une dépendance peut avoir des dépendances
[x] Vrai
[] Faux
# Comment rechercher les problÚmes de sécurité connus dans nos dépendances ?
[] npm find-security-issues
[x] npm audit
[] npm run security-checks

Ressources partagĂ©es sur cette quĂȘte