Programme Premium – JavaScript Moderne (ESM) & Express.js

Parcours complet – 40 exercices avancés structurés

Phase 1 — Modules ESM & Syntaxe Moderne

01 — Export Nommé

Structurer un module utilitaire modulaire.
Créer un module math.js contenant plusieurs fonctions (add, multiply). Importer uniquement add dans un autre fichier.
export const add = (a,b)=>a+b; export const multiply = (a,b)=>a*b;
Favorise une architecture modulaire claire et permet d’importer uniquement les dépendances nécessaires.

02 — Export par Défaut

Définir l’entité centrale d’un module.
Créer une classe Database représentant une connexion et l’exporter par défaut.
class Database{ connect(){ return "connected"; } } export default Database;
Un module ne peut posséder qu’un seul export par défaut. Utilisé pour les services principaux.

03 — Alias d’Import

Éviter les collisions de noms.
Importer une fonction save depuis deux modules différents en les renommant.
import { save as saveUser } from "./user.js"; import { save as saveProduct } from "./product.js";
Le mot-clé “as” améliore la lisibilité et la maintenabilité.

04 — Template Literals

Construire dynamiquement des routes API.
Générer une URL REST dynamique avec id et slug.
const url = `/api/posts/${id}/${slug}`;
Syntaxe moderne plus fiable que la concaténation classique.

05 — Destructuration Objet

Optimiser la lecture des requêtes.
Extraire email et password depuis req.body.
const { email, password } = req.body;
Réduit la répétition et améliore la clarté des contrôleurs.

06 — Destructuration Tableau

Manipulation efficace des collections.
Extraire les deux premiers éléments d’un tableau.
const [first, second] = array;
Permet un accès direct par position.

07 — Spread Operator

Maintenir l’immuabilité.
Cloner un objet user et modifier son rôle.
const updated = { ...user, role:"admin" };
Évite la mutation directe et préserve l’état initial.

08 — Rest Parameters

Créer des fonctions génériques.
Créer une fonction sum acceptant un nombre variable d’arguments.
const sum = (...nums)=>nums.reduce((a,b)=>a+b,0);
Capture les arguments dans un tableau dynamique.

09 — Short Circuit

Définir des valeurs par défaut.
Attribuer un nom par défaut si user.name est vide.
const name = user.name || "Anonyme";
Assure une donnée toujours exploitable.

10 — Optional Chaining

Sécuriser l’accès aux propriétés profondes.
Accéder à user.address.city sans provoquer d’erreur.
const city = user?.address?.city;
Retourne undefined au lieu de déclencher une exception.
Phase 2 — Manipulation JSON & Logique Données

11 — Filter

Filtrer un dataset.
Sélectionner les produits dont le prix dépasse 50.
items.filter(p=>p.price>50);
Retourne un nouveau tableau filtré.

12 — Map

Transformer des données.
Extraire les IDs d’un tableau users.
users.map(u=>u.id);
Produit un tableau dérivé.

13 — Find

Récupérer un élément unique.
Trouver un utilisateur par email.
users.find(u=>u.email===target);
Retourne le premier élément correspondant.

14 — Some

Tester une condition partielle.
Vérifier si au moins un admin existe.
users.some(u=>u.isAdmin);
Retourne true si condition satisfaite.

15 — Every

Valider une condition globale.
Vérifier que tous les produits sont en stock.
items.every(i=>i.qty>0);
Retourne true uniquement si tous valident.

16 — Sort

Ordonner un dataset.
Trier users par ordre alphabétique.
users.sort((a,b)=>a.name.localeCompare(b.name));
Modifie le tableau original.

17 — Reduce

Agréger des données.
Calculer le total d’un panier.
cart.reduce((acc,c)=>acc+c.price,0);
Accumule une valeur finale.

18 — Object.keys

Lister dynamiquement des propriétés.
Récupérer les paramètres de req.query.
Object.keys(req.query);
Retourne un tableau des clés.

19 — Object.entries

Parcourir clé/valeur.
Transformer un objet config en tableau itérable.
Object.entries(config);
Facilite les boucles dynamiques.

20 — JSON Parse/Stringify

Manipuler des données JSON.
Parser une chaîne JSON reçue.
JSON.parse(jsonString);
Standard universel d’échange API.
Phase 3 — Asynchronisme & Promesses

21 — Créer une Promise

Simuler un délai asynchrone.
Créer une fonction wait(ms).
const wait=ms=>new Promise(r=>setTimeout(r,ms));
Base du modèle asynchrone JS.

22 — .then()

Consommer une Promise.
Afficher le résultat d’une fonction asynchrone.
fetchData().then(r=>console.log(r));
Chaînage de promesses.

23 — Async/Await

Simplifier la syntaxe asynchrone.
Réécrire avec await.
const r=await fetchData();
Syntaxe plus lisible.

24 — Try/Catch

Gérer les erreurs async.
Encadrer await avec gestion d’erreur.
try{await fetch();}catch(e){}
Contrôle robuste des exceptions.

25 — Promise.all

Exécuter en parallèle.
Lancer 3 requêtes simultanément.
await Promise.all([f1(),f2(),f3()]);
Optimise la performance réseau.

26 — Promise.race

Implémenter un timeout.
Retourner la première promise résolue.
Promise.race([fetch(),timeout(5000)]);
Permet gestion délai max.

27 — Top-Level Await

Initialisation module ESM.
Utiliser await hors fonction.
const conn=await db.connect();
Autorisé uniquement en ESM.

28 — Fetch GET

Récupérer données externes.
Appeler une API publique.
const res=await fetch(url);
Communication HTTP.

29 — Fetch POST

Envoyer données JSON.
Poster un objet au serveur.
fetch(url,{method:"POST",body:JSON.stringify(data)});
Transmission payload API.

30 — Async Map

Transformer tableau async.
Mapper ids vers fetchById.
await Promise.all(ids.map(id=>fetchById(id)));
Combine map et Promise.all.
Phase 4 — Architecture Backend Avancée

31 — Higher Order Function

Créer fonctions génératrices.
Créer multiplyBy(x).
const multiplyBy=x=>y=>x*y;
Principe fonctionnel avancé.

32 — Middleware Pattern

Pipeline Express.
Modifier req avant next().
const auth=(req,res,next)=>{req.user="Admin";next();};
Architecture modulaire backend.

33 — Closure

Encapsulation d’état.
Créer compteur privé.
const counter=(()=>{let c=0;return()=>c++;})();
Conserve variable interne.

34 — Dynamic Import

Chargement conditionnel.
Importer debug uniquement en dev.
if(dev) await import("./debug.js");
Optimise performance.

35 — Map

Stockage clé/valeur performant.
Stocker sessions.
sessions.set(id,data);
Plus performant que Object dans certains cas.

36 — Set

Supprimer doublons.
Créer tableau unique.
[...new Set(ids)];
Garantit unicité.

37 — Erreur Personnalisée

Centraliser gestion erreur.
Créer classe ApiError.
class ApiError extends Error{constructor(status,msg){super(msg);this.status=status;}}
Standardise réponses API.

38 — Regex

Validation serveur.
Valider format slug.
/^[a-z0-9-]+$/.test(slug);
Sécurise données entrantes.

39 — Variables Environnement

Configuration dynamique.
Lire PORT depuis process.env.
const PORT=process.env.PORT||3000;
Adaptation multi-environnements.

40 — Factory Function

Générer contrôleurs génériques.
Créer createController(Model).
const createCtrl=Model=>({list:()=>Model.find()});
Réduit duplication CRUD.