đ SAISON B Semaine 1 Ăpisode 1 - DĂ©couverte de Node.js
đ Notions du jour
- NodeJS, câest quoi ?
- Les modules natifs, ces objets bien pratiques quâon rĂ©cupĂšre grĂące Ă import
- le module Readline
đ Node.js, Câest Quoi ?
Aujourdâhui, je plonge dans un nouveau monde : le backend avec Node.js ! JusquâĂ prĂ©sent, jâutilisais JavaScript pour crĂ©er des interfaces dynamiques dans le navigateur (grĂące Ă Svelte). Mais Node.js, câest JavaScript cĂŽtĂ© serveur ! đ
En résumé :
- Node.js est un environnement dâexĂ©cution pour JavaScript, qui permet de lancer du code hors du navigateur (sur un serveur, par exemple).
- Il est asynchrone et Ă©vĂ©nementiel, ce qui le rend idĂ©al pour les applications qui nĂ©cessitent des requĂȘtes rĂ©seau, des fichiers, ou des bases de donnĂ©es.
Pourquoi utiliser Node.js ?
- Un seul langage (JavaScript) pour le frontend et le backend.
- Une communauté énorme et des milliers de modules disponibles via npm (Node Package Manager).
- Performant grùce à son modÚle non-bloquant (parfait pour les applications en temps réel).
đŠ Les Modules Natifs : Des Outils PrĂȘts Ă lâEmploi
Node.js vient avec des modules natifs (ou built-in modules), qui permettent dâeffectuer des tĂąches courantes sans installer de dĂ©pendances externes. On les importe avec la syntaxe import <module> from "node:<module>".
Voici une sélection des modules les plus utiles, avec des exemples concrets pour chacun.
| Module | Utilité |
|---|---|
fs |
Interagir avec le systÚme de fichiers (lire/écrire des fichiers). |
path |
Manipuler les chemins de fichiers (indĂ©pendamment du systĂšme dâexploitation). |
os |
Interagir avec le SystĂšme dâExploitation. |
http |
CrĂ©er un serveur web ou faire des requĂȘtes HTTP. |
events |
Gérer des événements personnalisés. |
readline |
Lire des entrées utilisateur depuis la console (ligne par ligne). |
đ Le Module fs : Manipuler le SystĂšme de Fichiers
Exemples dâUtilisation :
- Lire un fichier :
// Import the 'fs' module to work with files
import fs from 'node:fs';
// Read a file asynchronously
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) {
console.error("Error reading file:", err);
return;
}
console.log("File content:", data);
});
- Ăcrire dans un fichier :
import fs from 'node:fs';
try {
fs.writeFileSync('file.txt', 'Hello, Node.js !');
console.log("File written successfully!");
} catch (err) {
console.error("File write error :", err);
}
- Lister les fichiers dâun dossier :
import fs from 'node:fs';
fs.readdir('.', (err, files) => {
if (err) {
console.error("Error :", err);
return;
}
console.log("Files in the directory :", files);
});
Cas dâusage :
- Sauvegarder des données utilisateur.
- Lire des fichiers de configuration.
- Traiter des logs ou des exports.
đșïž Le Module path : GĂ©rer les Chemins de Fichiers
Le module path permet de manipuler les chemins de fichiers de maniĂšre cross-platform (compatible Windows, Linux, macOS). Plus besoin de se soucier des / ou \ !
Exemples dâUtilisation :
// Import the 'path' module to handle file paths
import path from 'node:path';
// Join path segments to create a cross-platform path
const filePath = path.join('folder', 'subfolder', 'file.txt');
console.log("Constructed path:", filePath);
// Output (on Unix): "folder/subfolder/file.txt"
// Output (on Windows): "folder\subfolder\file.txt"
- Construire un chemin absolu :
// Import the 'path' module to handle file paths
import path from 'node:path';
// Join path segments to create a cross-platform path
const fullPath = path.join(__dirname, 'directory', 'file.txt');
console.log("Full path:", fullPath);
// Output (on Unix) : "/absolute/path/directory/file.txt"
// Output (on Windows) : "C:\absolute\path\directory\file.txt"
- Extraire le nom de fichier dâun chemin :
const fileName = path.basename('/path/to/file.txt');
console.log("File name:", fileName); // "file.txt"
- RĂ©cupĂ©rer lâextension dâun fichier :
Cas dâusage :
- Construire des chemins dynamiques dans une application.
- Valider ou parser des chemins utilisateur.
- Ăvite les problĂšmes de compatibilitĂ© entre Windows, Linux et macOS.
đ Le Module os : Interagir avec le SystĂšme dâExploitation
Le module os fournit des informations sur le systĂšme dâexploitation et lâenvironnement dâexĂ©cution. IdĂ©al pour adapter le comportement de votre application en fonction de la plateforme.
Exemples dâUtilisation :
- RĂ©cupĂ©rer le systĂšme dâexploitation :
import os from 'node:os';
console.log("OS:", os.platform());
// "linux", "win32", "darwin" (macOS), etc.
- ConnaĂźtre lâarchitecture du processeur :
- Obtenir des informations sur la mémoire :
console.log("Memory:", os.totalmem() / 1024 / 1024, "Mb");
console.log("Free memory :", os.freemem() / 1024 / 1024, "Mb");
- Récupérer les interfaces réseau :
- ConnaĂźtre le rĂ©pertoire personnel de lâutilisateur :
console.log("User folder:", os.homedir());
// "/home/user" (Linux/macOS) or "C:\Users\user" (Windows)
Cas dâusage :
- Adapter le comportement de lâapplication en fonction de lâOS (ex: chemins de fichiers, commandes systĂšme).
- Optimiser les performances en fonction des ressources disponibles (CPU, mémoire).
- Personnaliser lâexpĂ©rience utilisateur (ex: langue, rĂ©pertoire de sauvegarde).
đ Le Module readline : Lire des EntrĂ©es Utilisateur en Console
Le module readline permet de lire des entrĂ©es utilisateur depuis le terminal, ligne par ligne. Câest parfait pour crĂ©er des interfaces en ligne de commande (CLI) ou des scripts interactifs.
đ Exemple : Un Script Interactif avec readline
// Import the 'readline' module to read user input
import * as readline from 'node:readline';
// Create an interface to read from stdin and write to stdout
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// Ask the user a question
rl.question("What's your name? ", (name) => {
console.log(`Hello, ${name}!`);
// Close the interface
rl.close();
});
Explications :
readline.createInterface: CrĂ©e une interface pour lire depuisstdin(lâentrĂ©e standard) et Ă©crire versstdout(la sortie standard).rl.question: Pose une question Ă lâutilisateur et attend sa rĂ©ponse.
Cas dâusage :
- Créer un menu interactif en ligne de commande.
- Automatiser des tĂąches avec des questions/rĂ©ponses (ex: configuration dâun projet).
đĄ Pourquoi Utiliser les Modules Natifs ?
- Pas de dépendances externes : Moins de risques de vulnérabilités ou de conflits de versions.
- Performances optimisées : Ces modules sont compilés avec Node.js, donc trÚs rapides.
- Portabilité : Fonctionnent sur tous les systÚmes (Windows, Linux, macOS).
- Documentation officielle : Bien documentĂ©s et maintenus par lâĂ©quipe Node.js.
đĄ Ce Que Jâai Appris Aujourdâhui
- Node.js Ă©tend JavaScript au backend : Plus besoin dâun navigateur pour exĂ©cuter du JS !
- Les modules natifs sont des outils puissants pour des tùches courantes (fichiers, chemins, entrées/sorties).
readlinepermet de créer des scripts interactifs en ligne de commande, idéal pour des outils CLI ou des prototypes rapides.
âšïž Challenge du jour : "Hit MO'chine" â Un Outil en Ligne de Commande avec Node.js !
đ€ PrĂ©sentation du Challenge
Vous vous souvenez de cette émission des années 90 qui présentait le classement du Hit Parade ?
Aujourdâhui, on va crĂ©er un outil en ligne de commande (CLI) pour Charlu et Lili, deux prĂ©sentateurs fictifs qui veulent afficher les 10 premiĂšres entrĂ©es du hit-parade. Lâobjectif est de rĂ©aliser un script Node.js qui interagit avec lâutilisateur via la console, en utilisant le systĂšme Ă©vĂ©nementiel de Node.js et le module readline.
Fonctionnalités demandées :
- Afficher un message dâaccueil :
"Que souhaitez-vous faire ?". -
Répondre à 3 commandes :
-
chante: Affiche un message personnalisĂ©. classement: Affiche les 10 premiĂšres entrĂ©es du Top 50 (Ă partir dâun tableau fourni).-
quitter: Ferme le programme. -
Bonus : Ajouter une commande
position npour afficher lâentrĂ©e Ă la positionndu classement (ex:position 5affiche le Hit en position 5 du classement).
đŻ Objectif du Challenge
Créer un script interactif en Node.js qui :
- Utilise le module
readlinepour lire les entrées utilisateur. - GÚre des événements pour répondre aux commandes.
- Affiche des données dynamiques (le classement du Top 50).
Les données nous sont fournies sous forme de tableau JavaScript nommé hitParade
đ Ătapes RĂ©alisĂ©es
1ïžâŁ Initialisation du Projet et Import des Modules
Objectif : Dans le fichier index.mjs déjà fournit, importer les modules nécessaires (readline).
Mon code :
// Import the 'readline' module and 'stdin', 'stdout' processes to handle user input
import { stdin, stdout } from "node:process";
import * as readline from "node:readline";
// Create the readline interface
const rl = readline.createInterface({
input: stdin,
output: stdout
});
2ïžâŁ Afficher le Message dâAccueil et GĂ©rer les Commandes
Objectif : Demander Ă lâutilisateur "Que souhaitez-vous faire ?" et Ă©couter ses rĂ©ponses pour dĂ©clencher les actions correspondantes.
Mon code :
/**
* The main question prompt displayed to the user.
* @type {string}
*/
const question = `Que souhaitez-vous faire ?
- Tapez 'chante' pour que Charlu & Lili chantent le générique de Hit MO'chine,
- Tapez 'classement' pour afficher le classement des 10 premiers Hits du Top 50,
- Tapez 'position <n>' oĂč <n> reprĂ©sente la position de la chanson que vous souhaitez afficher (un nombre compris entre 1 et 10).
- Tapez 'quitter' pour quitter.
`;
/**
* The jingle played when the user selects 'chante'.
* @type {string}
*/
const jingle = "Je m'appelle Charlu, je m'appelle Lili, vous ĂȘtes chez O'clock !";
/**
* Initializes the readline interface and handles user input events.
*/
const rl = readline.createInterface({ input: stdin, output: stdout });
// Display the main question prompt to the user
console.log(question);
/**
* Event listener for each line of user input.
* Handles different commands: 'chante', 'classement' and 'quitter'.
*/
rl.on('line', (userAnswer) => {
switch(userAnswer.toLowerCase()) {
// If the user input is equal to 'chante'
case "chante":
// Display the jingle into the console
console.log(`\n${jingle}\n`);
break;
// If the user input is equal to 'classement'
case "classement":
// Display the Hit Parade ranking into the console
console.log(`\nVoici le classement des 10 premiers Hits du Top 50 :`);
hitParade.forEach((element, index) => {
console.log(`${index + 1}. ${element}`);
});
console.log("");
break;
// If the user input is equal to 'quitter'
case "quitter":
// Display a goodbye message
console.log("\nAu revoir !");
rl.close(); // Close properly the readline handler
return; // Stop the function
// Else, display an error message
default:
console.error("\nJe n'ai pas compris votre demande.")
}
// Re-display the question prompt after each command
console.log(question);
});
3ïžâŁ Bonus : afficher lâentrĂ©e Ă la position n du classement
Bonus : Commande position n :
- Utilisation des expressions réguliÚres pour détecter la commande. Lors de la correction, l'enseignant a utilisé la méthode
startsWith()mais j'ai voulu essayer les expressions réguliÚres pour m'entraßner. - Extraction du numéro avec
split(). - Recherche de lâentrĂ©e correspondante dans le tableau
hitParade.
Mon code final avec la gestion de la position 'n' :
| index.mjs | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | |
đ„ïž Rendu Final du Programme

đĄ Ce Que Jâai Appris avec ce Challenge
- Utiliser
readlinepour créer des interfaces en ligne de commande interactives. - Gérer les entrées utilisateur de maniÚre asynchrone avec des callbacks.
- Découper et analyser des commandes (ex:
position 5) pour extraire des informations. - Fermer proprement un programme avec
rl.close().