Projet NodeJS

Nous sommes prêts à initialiser notre projet NodeJS, et ajouter typescript.

Initialiser un nouveau projet

Nous commençons des nouveaux projets node en initialisant le projet. Dans le terminal de VSCode :

npm init

Vous répondez à toutes les questions. À l'issue de cette instruction est le fichier crucial au projet : package.json

{
  "name": "server",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

package.json et npm

Le fichier package.json est l'indexe de votre projet. Il contient plusieurs informations utiles pour votre projet :

  • Son nom, sa version etc.

  • scripts: La liste de commandes possibles avec npm run ....

  • dependencies: Les librairies tierces venant des dépôts node à inclure dans notre projet. C'est la liste essentielle pour tourner notre projet en production.

  • devDependencies: Les librairies supplémentaires pour compléter notre environnement de dev. Typiquement, ce sont les librairies de test, ou des types à inclure (si on utilise TypeScript)

Les entrées dependencies et devDependencies sont automatiquement gérés par la commande npm. En effet npm est le node package manager et on l'utilise pour installer, mettre à jour, ou enlever les librairies.

Par exemple, nous allons installer Express :

On voit que package.json s'est mis à jour automatiquement :

On voit apparaître le dossier node_modules qui contient toutes les librairies tierces de notre projet.

D'autres commandes de npm sont :

Les packages déployés par npm évoluent en utilisant un système de versioning :

  • Patch : sont les corrections de bug, et ne changent pas le comportement ou compatibilité de la librairie

  • Version mineure : Normalement rétrocompatible dans la même version mineure, mais peut-être avec des refactoring ou des modifications (normalement ajouts) plus importants

  • Version majeure : Risque de casser votre projet, il y aura des breaking changes, modifications qui risquent de casser votre code, par exemple, changer l'API, enlever les fonctions obsolètes, etc.

Dans package.json nous pouvons exprimer les limites de npm update, en utilisant les symboles suivants :

Source de l'imagearrow-up-right

Dans package.json si on voit :

  • un tilde ~ devant la version : on va fixer la version mineure, mais autoriser les mises à jour de la version patch

  • un caret ^ devant la version : on va fixer la version majeure, mais autoriser les mises à jour de la version mineure

  • aucun symbole devant la version : on ne va jamais mettre à jour la version

On peut aussi préciser la version majeure, et laisser npm choisir la version mineure et patch automatiquement :

Mon premier script avec NodeJS

Nous allons créer un nouveau fichier src/hello.js :

Il est facile d'exécuter notre premier script avec la commande node:

circle-check

Exécuter comme un script shell

On peut utiliser un shebang qui permet de rendre notre script exécuter comme n'importe quel script :

Et, en rendant notre fichier exécutable, on pourrait l'invoquer comme un script shell:

Exécuter avec npm

La version plus classique de lancer un script node est en utilisant package.json, notamment le tableau scripts :

On lance notre script avec :

Le champ scripts est très utile pour créer et configurer plusieurs façons de lancer notre code :

  • Lancer le serveur en mode développement

  • Lancer le serveur en mode production

  • Lancer un script d'utilité qui, par exemple, agit de façon ponctuelle sur votre base de données

  • Lancer des tests

  • Lancer des outils de validation de votre code (linter, orthographe, etc)

Par exemple, on aimerait que notre code se lance automatiquement dès qu'on apporte une modification. Pour cela, on va utiliser le package nodemon qui surveille notre base de code et relance le script dès qu'une modification est détectée :

L'option --save-dev précise que cette dépendance n'est utile que pour l'environnement de développement. Justement, si on regarde package.json, on voit qu'il y a une nouvelle section qui s'appelle devDependencies :

Ces dépendances sont ignorées lors de la mise en production. L'idée est d'optimiser l'artéfact de production et exclure tous les modules qui ne sont pas utiles ou potentiellement risqués.

On modifie notre package.json afin d'utiliser nodemon au lieu de node :

package.json

Relancez votre script :

Si on modifie src/hello.js, on voit que nodemon relance le script à chaque fois qu'on le sauvegarde. 🔥 Pratique ! 🔥

À noter : Si nodemon ne relance pas votre script après une modification, il faut ajouter l'option -L pour activer le legacy polling.

Mis à jour