Cours Dev Web
Cours Dev Web
ion
act
str
e
anc
Ab
ES
erit
6
Inh
mor phism
Poly
G. Cherradi 2025
[Link]
PLAN
à Introduction (Web application, JavaScript avancé)
[Link]
3
Introduction au langage JavaScript
[Link]
[Link]
Introduction au langage JavaScript
[Link]
[Link]
Introduction au langage JavaScript
1. Le navigateur télécharge le fichier HTML
sous forme de bytes
Document
HTML
head body
[Link]
title
h1 div id=div1 div id=div2
My HTML Document
Heading p pclass =p2
P Tag 1 P Tag 2
CSS Object Model (CSSOM)
CSSOM :
[Link]
Document Object Model (DOM)
[Link]
Qu'est-ce que JavaScript ?
JavaScript est un langage de programmation utilisé pour créer du contenu dynamique pour les sites
web. C'est un langage de programmation léger, multiplateforme, mono-thread et dynamiquement
typé. JavaScript est un langage interprété qui exécute le code ligne par ligne, offrant ainsi une plus
grande flexibilité.
à JavaScript est un langage mono-thread, ce qui signifie qu'il exécute une seule tâche à la fois.
à Polyvalent : JavaScript peut être utilisé pour une large gamme de tâches, allant de calculs
simples à des applications côté serveur complexes.
à Asynchrone : JavaScript peut gérer des tâches comme la récupération de données depuis
des serveurs sans bloquer l'interface utilisateur.
[Link]
3
Exemple de code JavaScript et son exécution dans V8
function sum(a, b) {
return a + b;
}
[Link](sum(2, 3));
JavaScript interne: Le JavaScript peut être inséré directement dans un document HTML à l’aide de la balise
<script>. il est généralement inséré soit dans la section <head>, soit dans <body> du document.
<!DOCTYPE html>
<html>
<head></head>
<body>
<h2 style="color: blue;">
JavaScript interne : Code JS placé dans le code HTML
</h2> [Link]
<h3 id="demo" style="color: green;"> regardez la console </h3>
<script>
// Ceci est un commentaire sur une seule ligne
/* Ceci est un commentaire
sur plusieurs lignes */
</script>
</body>
</html>
Les bases du JavaScript : JavaScript externe
External JavaScript : Pour les projets de grande envergure ou lorsque vous réutilisez des scripts sur plusieurs fichiers HTML,
vous pouvez placer votre code JavaScript dans un fichier externe avec l'extension .js. Ce fichier est ensuite lié à votre document
HTML en utilisant l'attribut src à l'intérieur d'une balise <script>.
Avantages : // fichier [Link]
<!DOCTYPE html>
- Temps de chargement plus rapides : Les <html>
fichiers JavaScript externes sont mis en cache <head></head>
par le navigateur, ce qui évite de les recharger à<body>
chaque visite. <h2>JavaScript externe : Code JS dans un fichier séparé
</h2>
[Link]
- Meilleure lisibilité et maintenance : Séparer le <h3 id="demo" style="color: green;"> regardez la console
HTML et le JavaScript rend les deux plus faciles </h3>
à lire et à maintenir. <!-- Lien vers le fichier JavaScript externe -->
<script src="[Link]"></script>
- Séparation des responsabilités : En isolant la </body>
structure (HTML) du comportement (JavaScript), </html>
le code devient plus propre, mieux organisé et
plus modulaire.
// fichier [Link]
- Réutilisation du code :Un seul fichier JavaScript
externe peut être utilisé avec plusieurs pages [Link]("Bonjour ILSI");
HTML. Cela réduit les duplications et simplifie les
mises à jour.
Les bases du JavaScript : Versions de JavaScript (ECMAScript)
Aperçu des principales versions d'ECMAScript, de leurs années de sortie et des fonctionnalités
clés qu'elles ont introduites.
ES6
[Link]
2015 let / const, classes, fonctions fléchées
ES7 à ES13 2016 – 2022 async/await, BigInt, opérateur d’enchaînement optionnel (?.)
Object — Représente des paires clé-valeur : Un objet permet de regrouper plusieurs informations
sous une même structure.
let obj = {
name: "ALI",
age: 25
};
function fun() {
[Link]("ILISI 2025");
}
Les bases du JavaScript : Les variables
Une variable est un espace de stockage utilisé pour conserver en mémoire différents types de données. Elle peut ensuite être
exploitée dans les scripts. Le nom d'une variable peut inclure uniquement des caractères alphanumériques, le symbole $
(dollar) et le caractère _ (underscore). Cependant, elle ne doit pas commencer par un chiffre ni porter le nom d'une fonction
existante en JavaScript. Pour créer une variable, on la déclare et on lui attribue une valeur :
En JavaScript, les variables sont déclarées en utilisant les mots-clés var, let ou const.
var n = 5;
- Var : Le mot-clé var est utilisé pour déclarer
[Link](n);
une variable. Il a une portée globale ou une
var n = 20; // réaffectation autorisée
portée fonctionnelle. [Link]
[Link](n);
let n = 10;
- let : Le mot-clé let introduit dans ES6, a une n = 20; // La valeur peut être mise à jour
portée de bloc et ne peut pas être redéclaré // let n = 15; // Ne peut pas être redéclarée dans
dans la même portée. la même portée
[Link](n);
[Link]
3
On peut utiliser 5 opérateurs arithmétiques : l'addition (+), la soustraction (-), la
Les bases du JavaScript
multiplication : Types
(*), la division de données
(/) et le modulo (%). Le modulo est le reste d'une division.
Par exemple :
<script>
JavaScript prend en charge divers types de données, qui peuvent être largement classés en types primitifs et non primitifs:
var number1 = 3,
number2 = 2, result;
result = number1 *
number2;
alert(result); //
var text ='J\'écris mon texte ici'; /* Avec des apostrophes, le \ sert à
échapper une apostrophe intégrée Affiche
dans: « le
6 »texte, pour ne pas que Javascript
pense que le texte s'arrête là.*/ </script>
ou :
<script>
var number = 3;
number = number + 5;
alert(number); //
Affiche : « 8 »
Les opérateurs arithmétiques : </script>
On peut utiliser 5 opérateurs arithmétiques : l'addition (+), laàsoustraction
qui équivaut : (-), la multiplication (*), la
division (/) et le modulo (%). Le modulo est le reste<script> d'une division. Par exemple : ou : qui équivaut à :
var number = 3;
number += 5;
alert(number); //
[Link] Affiche : « 8 » 3
Valeur vs Référence (Types primitifs vs Objets)
Stack Heap
newname =’AHMED’
name =’AHMED’
Les bases du JavaScript : Les opérateurs arithmétiques
- Les opérateurs arithmétiques :
On peut utiliser 5 opérateurs arithmétiques : l'addition (+), la soustraction (-), la multiplication (*), la
division (/) et le modulo (%). Le modulo est le reste d'une division. Par exemple : ou : qui équivaut à :
- La concaténation : Une concaténation consiste à ajouter une chaîne de caractères à la fin d'une
autre, comme dans cet exemple :
var hi = 'Bonjour ', name ='ILISI’; var text = 'Bonjour ';
var result = hi + name; text += 'ilisi';
alert(result); alert(text);
// Affiche : « Bonjour ILISI » // Affiche « Bonjour ilisi ».
Il y en a 8 :
== : égal à
!= : différent de
=== : contenu et type de variable égal à
!== : contenu ou type de variable différent de
> supérieur à
>= supérieur ou égal à
< : inférieur à
<= : inférieur ou égal à
[Link]
3
Les bases du JavaScript : Data Types
Exploration des types de données et des variables en JavaScript : Comprendre les expressions
courantes
[Link]("ALI"/5); NaN
filter() Retourne un tableau contenant uniquement les éléments qui passent un test. [1,2,3,4].filter(n => n > 2) // [3,4]
find() Retourne le premier élément qui respecte une condition. [1,2,3].find(n => n > 1) // 2
push() Ajoute un élément à la fin du tableau. let a=[1]; [Link](2); // [1,2]
reverse() Inverse l’ordre du tableau. [1,2,3].reverse() // [3,2,1]
map() Retourne un nouveau tableau après transformation de chaque élément. [1,2,3].map(n => n*2) // [2,4,6]
splice() Modifie le tableau (ajout, suppression ou remplacement). let a=[1,2,3]; [Link](1,1) // [1,3]
toString() Transforme le tableau en texte (séparé par des virgules). [1,2,3].toString() // "1,2,3"
Les bases du JavaScript : Le Contexte d’Exécution (Execution Context).
Tout code JavaScript s’exécute à l’intérieur d’un contexte d’exécution, qui est un concept abstrait servant de
conteneur. Il contient toutes les informations sur l’environnement d’exécution du code actuel.
Lorsqu’un programme JavaScript s’exécute, un contexte d’exécution est créé, et son fonctionnement repose sur deux
phases principales.
1. Phase d'Allocation Mémoire (Memory Allocation Phase) : JavaScript réserve de l’espace mémoire pour toutes les
variables et fonctions du script.
function square(num){
var res =num*num;
return res;
}
var square1=square(number);
3
Les bases du JavaScript : fonctions
Fonction en tant que paramètre (Callback Function)
Une fonction callback est une fonction passée en argument à une autre fonction et qui sera exécutée plus
tard. Cela permet d'exécuter du code asynchrone ou de personnaliser le comportement d'une fonction.
- Navigateur → window
- [Link] → global
si la fonction est appelée seule → this est remplacé par l’objet global.
3
Manipulation du DOM: DOM?
Le DOM (Document Object Model) est une représentation en mémoire de la page web sous forme d’un arbre
d’objets.
Chaque balise = un objet
Document
HTML
head body
title
h1 div id=div1 div id=div2
My HTML Document
Heading p pclass =p2
P Tag 1 P Tag 2
Manipulation du DOM ?
Pourquoi manipuler le DOM ?
[Link]
3
Manipulation du DOM : DOM APIs?
3
Manipulation du DOM : Récuperation d’un Élément DOM
1. [Link]("id") : Sélectionne un élément grâce à son identifiant unique.
HTML Js
HTML Js
=> Gère tous les sélecteurs CSS : .class, #id, tag, [attr], etc.
[Link](p => {
[Link]([Link]);
});
"#box"
ID | Type de sélection #id | Exemple CSS | `querySelector()` |
| ----------------- | -------------------- | ---------------------- |
".item"
Classe | ID .class | `#id` | `"#box"` |
| Classe | `.class` | `".item"` |
"div"
Balise div
| Balise | `div` | `"div"` |
Descendant
| Descendant ul li
| `ul li` | `"ul li"` "ul |li"
| Enfant direct | `div > p` | `"div > p"` |
| Attribut div > |p`input[type='text']` | `"input[type='text']"` | "div > p"
Enfant direct
| Pseudo-class | `li:first-child` | `"li:first-child"` |
"input[type='text']"
Attribut | Multiple | `h1, h2`
input[type='text'] | `"h1, h2"` |
"li:first-child"
Pseudo-class li:first-child
"h1, h2"
Multiple h1, h2
Manipulation du DOM : Modification d’un Élément DOM
La modification du DOM consiste à changer le contenu, les attributs, les classes, ou le style d’un
élément existant dans la page. JavaScript permet de modifier dynamiquement l’apparence et le
comportement d’un élément sélectionné grâce aux propriétés du DOM.
[Link] = "red";
[Link] = "30px";
[Link]("active"); // Add
[Link]("active"); // Remove
[Link]("highlight"); // Alterner (toggle)
[Link]("active"); // Vérifier si une classe existe
Manipulation du DOM : Création d’un Élément DOM
La création d’éléments dans le DOM se fait en 3 étapes :
[Link](div);
Manipulation du DOM : Suppression d’un Élément DOM
1. [Link]() : Supprime directement l’element du DOM.
const p = [Link]("p");
[Link]();
[Link](firstItem);
3. innerHTML = " " : Vider complètement un élément => Permet de supprimer tout le contenu d’un élément.
[Link]("btn").addEventListener("click", function() {
alert("Button Clicked!");
});
- Elle permet d’exécuter une fonction une seule fois, après un certain délai.
setTimeout(fonction, délai_en_millisecondes);
setTimeout(() => {
Elle permet d’exécuter une fonction de manière répétée, avec un intervalle de temps fixe.
setInterval(fonction, délai_en_millisecondes);
setInterval(() => {
[Link]("Bonjour");
}, 1000);
Objectif : garder des informations entre les pages ou pendant une session.
localStorage Persistant (même après fermeture du navigateur) Stocker les préférences de l’utilisateur
sessionStorage Session en cours (fermeture onglet → effacé) Stocker l’utilisateur connecté temporairement
Syntaxe :
Example:
Manipulation du DOM : Web Storage API
Les Cookies: Stockage côté client pour sessions et suivi. Petit fichier texte stocké dans le navigateur.
Peut contenir :
- Identifiant de session
- Préférences utilisateur
- Données de suivi (analytics)
Envoyé automatiquement au serveur à chaque requête HTTP.
Syntaxe :
Utilité :
- Suivi des visites, pages consultées, interactions avec le site.
- Personnaliser les annonces en fonction des intérêts et du comportement de navigation.
- Stocker des choix de l’utilisateur : thème, langue, taille du texte, etc.
Les bases du JavaScript : JS object vs Json Object
Un objet JavaScript est une structure de données qui suit la notation key: value, où les clés ne sont
pas nécessairement des chaînes et les valeurs peuvent être de tout type (fonctions, objets imbriqués,
undefined, etc.).
const user = {
name: "Alice",
age: 25, {
isAdmin: false, "name": "Alice",
greet: function() { "age": 25,
[Link]("Hello, " + [Link]); "isAdmin": false
} }
};
[Link]([Link]); // Alice
[Link](); // Hello, Alice
Objet JSON
Un objet JSON (JavaScript Object Notation) est une chaîne de texte qui suit un format spécifique, utilisé pour
échanger des données entre serveurs et clients.
[Link]
Les bases du JavaScript : JS object vs Json
[Link]
Synchrone vs Asynchrone code
Les bases du JavaScript : Event loop
Js Engine
Web APIs
[Link]("Start");
Window
Call stack setTimeout(() => {
[Link]("setTimeout - setTimeout()
Callback"); - DOM APIs
},0); - Fetch()
- localStorage
- Console
[Link]("End"); co
Event loop
callback queue
3
Atelier (Manipulation DOM et Asynchrone) : MVC Pattern
MVC est un pattern architectural qui organise le code en trois parties distinctes
Model (Modèle)
Model (Modèle)
- Représente les données et la logique métier.
Représente- Exemple
les données et la logique
: les utilisateurs, métier.
les produits,...etc.
Avantage : Gère les interactions utilisateur et fait le lien entre Model et View.
- Séparation des responsabilités : chaque partie a un rôle clair .
- RéutilisableExemple
: on peut:appliquer
gérer le MVC
clic sur le bouton
à n’importe login,
quelle vérifierweb
application l’utilisateur et mettre à jour l’affichage.
ou desktop.
- Facilite le débogage et l’évolution : un changement dans la View n’impacte pas le Model.
- Prépare aux frameworks modernes : React, Angular, Vue, Django utilisent des concepts similaires.
Atelier (Manipulation DOM et Asynchrone) : MVC Pattern
Etape1 : créer une arborescence claire, afin de séparer les rôles (HTML, CSS, JS, données).
# Styles de l'application
# Scripts JavaScript
[Link] => # Données simulant le backend
- Lisibilité réduite : Le code devient difficile à lire et à comprendre avec l'augmentation des callbacks imbriqués.
- Gestion des erreurs complexe : Chaque callback doit vérifier s'il y a une erreur, ce qui peut être lourd, répétitif et difficile
à suivre.
- Maintenance compliquée : Ajouter de nouvelles étapes ou modifier des étapes existantes dans une chaîne de callbacks
peut entraîner des erreurs ou des incohérences.
Le callback hell n’est pas un bug, c’est une mauvaise structure de code.
Les bases du JavaScript : Notions Asynchrones
Le problème L'Inversion de Contrôle dans les Callbacks
L’inversion de contrôle, dans le contexte des callbacks, signifie que le développeur ne maîtrise plus directement le moment
d’exécution de son code.
En passant une fonction callback, l’exécution est confiée à l’Event Loop, ce qui peut rendre le flux du programme plus difficile à
comprendre, surtout lorsque les callbacks deviennent imbriqués.
// Fonction principale
Le problème principal ici est que la fonction createCommande
function createCommande() {
délègue le contrôle à la fonction de rappel dans getDataFromServer,
[Link]('Début de la commande...');
et elle ne peut pas contrôler l'ordre d'exécution des actions suivantes.
Le problème de gestion des callbacks
Cela devient imbriqués
problématique quand :
getDataFromServer(function(data) {
processData(data);
saveData(data); - Il y a beaucoup de callbacks imbriqués.
});
- Le flux du programme devient difficile à suivre.
[Link]('Commande en cours...');
} - Vous devez faire des appels multiples dans un ordre précis, et les
erreurs dans l'une des étapes peuvent entraîner des effets en
createCommande(); chaîne.
3
Les bases du JavaScript : Notions Asynchrones (promise)
Une Promise en JavaScript est un objet représentant une opération asynchrone (qui prend du temps) qui n'est pas
encore terminée, mais qui finira bien par donner un résultat dans le futur, ou échouer.
// creation de la promesse
let verifierSiPair =(nombre) =>{
return new Promise((resolve, reject) => { Les promesses permettent
if (nombre % 2 === 0) { d'enchaîner plusieurs opérations
resolve(`Le nombre ${nombre} est pair.`); asynchrones de manière plus
lisiblefalse}';
} else { const jsonString = '{"name": "Alice", "age": 25, "isAdmin": et gérable, tout en
reject(`Le nombre ${nombre} est impair.`); centralisant la gestion des erreurs.
}
const userObject = [Link](jsonString);
});
} [Link]([Link]); // Alice
// Utilisation de la promesse [Link]([Link]); // 25
verifierSiPair(8)
.then(message => [Link](message)) // succès (résolu)
.catch(erreur => [Link](erreur)); //échec (rejeté)
1. En attente (Pending) : La promesse n'est pas encore terminée. L'opération asynchrone est en cours.
2. Réussie (Fulfilled) : L'opération a été terminée avec succès, et tu as le résultat que tu attendais.
3. Échouée (Rejected) : L'opération a échoué, et il y a une erreur ou un problème.*
[Link]
3
Les bases du JavaScript : Notions Asynchrones (Promise)
Les promesses permettent de mieux gérer les opérations asynchrones en offrant une syntaxe plus claire et en
réduisant les risques de "callback hell".
- .then() : Cette méthode est utilisée pour gérer la résolution d'une Promise. Elle prend une fonction callback qui sera
exécutée lorsque la Promise sera résolue avec succès (c'est-à-dire, lorsque l'état de la Promise passe de en attente à
résolue). La valeur que la Promise renvoie à l'intérieur de la fonction resolve() sera passée en paramètre à la fonction de
rappel dans .then().
3
Les bases du JavaScript : Notions Asynchrones (async /await)
async / await est une syntaxe moderne de JavaScript qui permet d’écrire du code asynchrone de
manière plus lisible, plus proche du code synchrone.
[Link]([Link]); // Alice
[Link]([Link]); // 25
3
Les bases du JavaScript : Responsabilité Unique (SRP)
La Solution = l’utilisation des services pour implementer le principe de Responsabilité Unique (SRP).
Service : Un service est une unité logique indépendante du UI. Il permet de centraliser les actions
techniques (API, Storage,logique metier) pour rendre le code réutilisable et plus facile à tester.
En utilisant des services, nous transformons une structure désordonnée en une architecture
professionnelle inspirée de frameworks comme NestJS
//[Link]/skills/badges/
-> Gestion UI
- une donnée peut être invalide - l’utilisateur ne comprend pas ce qui se passe
//[Link]/skills/badges/
- un service externe peut être indisponible - le système devient difficile à maintenir
- Toujours exécuté, que l’erreur survienne ou non - Le code du bloc try est exécuté
- Si pas d’erreur → catch ignoré
- Idéal pour nettoyer des ressources (fermer - Si erreur → exécution de catch
fichiers, libérer mémoire …) - finally s’exécute toujours (si présent)
Les bases du JavaScript : Gestion des erreurs try/catch
Syntaxe générale:
throw permet de signaler explicitement une erreur et de forcer son traitement via try / catch.
Js coté serveur : Framework Nest JS
Pourquoi un backend ?
Il inclut généralement :
[Link] est un environnement d’exécution écrit en C++ qui permet d’exécuter du JavaScript côté serveur.
//[Link]/skills/badges/
JavaScript côté serveur : Environnement [Link]
installer l’environnement d’exécution [Link]
Étape 1 : Télécharger [Link] (LTS)
- Télécharger la version LTS (Long Term Support) npm est le gestionnaire de paquets officiel de [Link].
NestJS est un framework backend basé sur [Link]. Il utilise TypeScript et repose sur
Express pour gérer les requêtes HTTP. Il propose une architecture modulaire,
l’injection de dépendances et des décorateurs pour organiser le code. NestJS est
un framework opinioné.
Les Modules
//[Link]/skills/badges/
- Un module regroupe les parties de l’application liées à une même fonctionnalité.
- Toute application NestJS contient au moins un module : le module racine (AppModule)
Les Contrôleurs
[Link] Contrôleur de base avec une seule route. Il gère les requêtes
HTTP entrantes et retourne les réponses appropriées.
//[Link]/skills/badges/
La structure de base d'une application NestJS
Les contrôleurs sont responsables du traitement des requêtes entrantes et de l’envoi des
réponses au client.
Les contrôleurs reçoivent les requêtes HTTP, appellent les services appropriés et renvoient les
réponses au client.
//[Link]/skills/badges/
La structure de base d'une application NestJS
Les providers d’un module sont des singletons par défaut. Pour les partager entre
modules, ils doivent être exportés..
//[Link]/skills/badges/
Chaque module est automatiquement un module partagé. Une fois créé, il peut être réutilisé par
n'importe quel module.
Back End Server Nest
Étape 2 : Création des Modules et API (Module 1 : Authentification )
[Link]
@Module({
controllers: [authController,],
providers: [authentService,]
})
export class authModule {}
Back End Server Nest
[Link]
@Post('register')
//[Link]/skills/badges/
register(@Body() body:{email: string, password:string}): string {
const {email, password}= body;
return [Link](email, password) ;
}
@Post('login')
login(@Body() body:{email: string, password: string}){
[Link](body)
const {email, password}= body;
return [Link](email, password);
}}
Back End Server Nest
[Link]
import { Injectable } from '@nestjs/common’;
@Injectable()
export class AuthentService {
private users= []; // tableau pour stocker les utilisateur
- Intégrée au navigateur
- Basée sur les Promises
- Utilisée pour communiquer avec une API (backend)
//[Link]/skills/badges/
import { promises as fs } from 'fs' : On importe la version asynchrone du module fs (File System).
import * as path from 'path'; Le module path permet de gérer les chemins de fichiers de façon portable.
async addUser(user) {
const filePath = [Link](__dirname, '..', 'data', '[Link]'); [Link](...)
const data = await [Link](filePath, 'utf-8'); Écrit des données dans un fichier.
const users = [Link](data); //[Link]/skills/badges/
- Si le fichier existe → il est écrasé
[Link](user);
- S’il n’existe pas → il est créé
await [Link](filePath, [Link](users, null, 2));
}
Paramètre Rôle
users Objet JS à convertir
null Aucun filtre
2 Indentation (lisibilité)
Installation de PostgreSQL
1. Télécharger PostgreSQL
[Link]
Choisis
L'introduction le système
du Thunk permet d’exploitation
de découpler(windows, linux,
l'interface macOS)
utilisateur de la logique d'infrastructure. On observe une
abstraction à trois niveaux :
[Link] sous Windows
(Abstraction
Étapes : de l'UI) : Il devient agnostique des services techniques et ne communique qu'avec l'action
asynchrone5.(le Thunk).
Définir le mot de passe du super-utilisateur postgres
1. Lancer le fichier .exe
Le Thunk (Logique d'Orchestration) : Il centralise l'intelligence métier
- Note-le et(important
bien coordonnepourles appelspgAdmin,
PostGIS, aux différents
2. Cliquer sur Next services.
TypeORM…)
- pgAdmin 4
npm install
L'introduction @nestjs/typeorm
du Thunk typeorml'interface
permet de découpler pg utilisateur de la logique d'infrastructure. On observe une
abstraction à trois niveaux :
Etape 2 : Configurer TypeORM :
configurer la connexion à la base de données et déclarer les entités.
Le Hook (Abstraction de l'UI) : Il devient agnostique des services techniques et ne communique qu'avec l'action
asynchrone (le Thunk).
[Link] configure la connexion
Le Thunk (Logique d'Orchestration) : Il centralise l'intelligence métier
à la base deetdonnées
coordonne les être
et doit appels aux différents
importé une seule
[Link] dans le module racine de l’application.
Les Services (Abstraction Technique) : Ils isolent les outils tiers (Axios, AsyncStorage) du reste de l'application,
facilitant ainsi toute maintenance évolutive.
l’option synchronize met automatiquement à jour
le schéma de la base de données à partir des
entités. Elle est utile en phase de développement,
mais dangereuse en environnement de production.
NestJs : TypeORM
Etape 3 : Créer une Entity
Le Hook (Abstraction de l'UI) : Il devient agnostique des services techniques et ne communique qu'avec l'action
asynchrone (le Thunk).
Le Thunk (Logique d'Orchestration) : Il centralise l'intelligence métier et coordonne les appels aux différents
services.
Les Services (Abstraction Technique) : Ils isolent les outils tiers (Axios, AsyncStorage) du reste de l'application,
facilitant ainsi toute maintenance évolutive.
- @InjectRepository(User)
L'introduction du Thunk permet de découpler l'interface utilisateur : demande
de la logique d'infrastructure. à NestJS
On observe une
le repository
abstraction à trois niveaux : activé
- Repository<User>
Le Hook (Abstraction de l'UI) : Il devient agnostique des services techniques et ne est l’API CRUD
communique fourniel'action
qu'avec par
TypeORM
asynchrone (le Thunk).
- Lemétier
Le Thunk (Logique d'Orchestration) : Il centralise l'intelligence service
et est le seul endroit
coordonne qui parle
les appels à la DB
aux différents
services.
Les Services (Abstraction Technique) : Ils isolent les outils tiers (Axios, AsyncStorage) du reste de l'application,
Étape 6 — Écrire les méthodes facilitant
CRUD deainsi toute maintenance évolutive.
base
- create() → crée l’objet (mémoire)
- save() → INSERT/UPDATE
- findOne() → SELECT
- find() → SELECT *
NestJs : Les relations TypeORM
Objectif
Les Services (Abstraction Technique) : Ils isolent les outils tiers (Axios, AsyncStorage) du reste de l'application,
facilitant ainsi toute maintenance évolutive.
Les relations permettent de modéliser ces liens
NestJs : Les relations TypeORM Relation Signification
Relation OneToMany / ManyToOne (la plus utilisée) OneToOne 1↔1
Exemple métier OneToMany 1→N
L'introduction dupeut
- Un User Thunk
avoirpermet
plusieursde découpler l'interface utilisateur de la logique d'infrastructure. On observe une
Accounts
ManyToOne N→1
- Un Account appartient à un seul User abstraction à trois niveaux :
@OneToMany prend deux fonctions callback : ManyToMany N↔N
Le Hook (Abstraction de l'UI) : Il devient agnostique des services techniques et ne communique qu'avec l'action
- la première précise l’entité du côté Many asynchrone (le Thunk).
- la Thunk
Le deuxième précise la
(Logique propriété inverse :qui
d'Orchestration) pointe vers le
Il centralise One
l'intelligence métier et coordonne les appels aux différents
services.
@OneToMany( () => Account, (account) => [Link], {
cascade: true,})
Les Services
accounts: (Abstraction Technique) : Ils isolent les outils tiers (Axios, AsyncStorage) du reste de l'application,
Account[];
facilitant ainsi toute maintenance évolutive.
@ManyToOne( () => user, (user) => [Link])
user: User;
const jsonString
Principales caractéristiques = '{"name":
de [Link] : "Alice", "age": 25, "isAdmin": false}';
const userObject = [Link](jsonString);
- Architecture basée sur des composants : React
utilise une architecture basée sur des composants, ce
[Link]([Link]); // Alice
qui signifie que l'interface utilisateur est divisée en
[Link]([Link]); // 25
petites unités réutilisables appelées composants.
Chaque composant contient sa propre logique, son
rendu et son état. Cela facilite la gestion et l’évolution
des applications.
function Greeting() {
return <h1>Bonjour, le monde !</h1>;
}
3
Configuration et Installation d'un Projet React
Prérequis :
- Installer [Link]
- Vérifier l'installation avec les commandes suivantes :
node -v
npm -v
Création d'un projet React:
npx create-react-app traffic-control
cd traffic-control
npm start
3
React Component
- Un composant React est une fonction ou une
classe JavaScript qui :
- Accepte des props (propriétés) en entrée.
- Retourne un élément React (écrit généralement
en JSX), qui définit la structure de l'interface
utilisateur :
94
ReactJS : Java Script XML (JSX)
- JSX (JavaScript XML) est une extension de syntaxe qui permet
d'écrire du code HTML directem ent dans du JavaS cr ipt .
Cependant, le navigateur ne comprend pas JSX, il doit donc être
transformé en JavaScript avant d’être exécuté import React from 'react';
- App est une fonction qui retourne l'interface utilisateur (UI). Elle est
exportée afin de pouvoir être utilisée ailleurs.
[Link]
3
Premier Démo ReactJS : Todo List
Objectif:
Dans cette démo, nous allons créer une application de gestion de tâches ("Todo List") en utilisant ReactJS.
L'objectif est de comprendre les concepts fondamentaux de React tels que les composants, l'état (state), les
événements, et l'affichage dynamique.
Instructions :
2. Ajouter un état todos dans le composant principal pour stocker la liste des tâches.
[Link]éer un formulaire d'ajout de tâche avec un champ de texte et un bouton pour ajouter une nouvelle tâche à
la liste.
4. Afficher la liste des tâches sous forme d'éléments HTML dans une liste non ordonnée.
5. Ajouter un bouton "Supprimer" à chaque tâche pour permettre à l'utilisateur de supprimer une tâche.
6. Implémenter une fonctionnalité pour marquer une tâche comme terminée (en modifiant le style ou en
ajoutant une case à cocher).
3
ReactJS : ES6 array methods
Nouvelles méthodes des tableaux avec ES6
- Avec ES6, de nouvelles méthodes puissantes ont été introduites pour rendre la manipulation des tableaux plus facile et
plus fonctionnelle.
- Ces méthodes permettent de modifier, itérer et transformer les tableaux de manière concise et élégante.
[Link]
3
ReactJS : ES6 array methods
Nouvelles méthodes des tableaux avec ES6
- Avec ES6, de nouvelles méthodes puissantes ont été introduites pour rendre la manipulation des tableaux plus facile et
plus fonctionnelle.
- Ces méthodes permettent de modifier, itérer et transformer les tableaux de manière concise et élégante.
map() : Créer un nouveau tableau avec des filter() : Créer un tableau avec des éléments filtrés
éléments transformés - La méthode filter() crée un nouveau tableau avec les
- La méthode map() crée un nouveau tableau avec éléments qui satisfont la condition fournie.
les résultats de l'appel d'une fonction pour chaque - Les éléments qui ne passent pas le test sont simplement
élément du tableau. ignorés.
3
ReactJS : ES6 array methods
Nouvelles méthodes des tableaux avec ES6
- Avec ES6, de nouvelles méthodes puissantes ont été introduites pour rendre la manipulation des tableaux plus facile et
plus fonctionnelle.
- Ces méthodes permettent de modifier, itérer et transformer les tableaux de manière concise et élégante.
Montage (Mounting) :
- constructor(): Appelé lors de la création du composant.
- componentDidMount(): Appelé après que le composant soit ajouté au DOM (initialisation).
componentDidMount() {
[Link]("Composant monté !");
}
componentDidUpdate(prevProps, prevState) {
[Link]("Composant mis à jour !");
}
3
ReactJS : Le Cycle de Vie des Composants
Démontée (Unmounting) :
- componentWillUnmount(): Appelé juste avant que le composant ne soit retiré du DOM. Utile
pour effectuer des nettoyages.
componentWillUnmount() {
[Link]("Composant démonté !");
}
Demo pratique
3
ReactJS : Les Composants Fonctionnels
Composant Fonctionnel : Un composant fonctionnel est une fonction JavaScript qui prend des props en
entrée et retourne des éléments React.
3
ReactJS : Le Cycle de Vie dans CF
Depuis React 16.8, les Hooks permettent aux composants fonctionnels de gérer leur état et d'utiliser des effets secondaires,
comme les composants de classe. Cela remplace la gestion du cycle de vie dans les composants fonctionnels.
return (
<div>
</div>
);
};
3
ReactJS : Le Cycle de Vie dans CF
Updating (Mise à jour)
useEffect avec dépendances : Agit comme componentDidUpdate. Il se déclenche après chaque mise
à jour où les dépendances spécifiées changent.
useEffect(() => {
[Link]('Le compteur a changé');
[Link] = `Compteur: ${count}`;
}, [count]); // Se déclenche lorsque `count` change
Unmounting (Démontage)
Retour de la fonction de nettoyage dans useEffect : Agit comme componentWillUnmount,
permettant de nettoyer les effets secondaires.
useEffect(() => {
[Link]('Composant monté !');
// Retour de la fonction de nettoyage (équivalent de componentWillUnmount)
return () => {
[Link]('Composant démonté !');
};
}, []); // Cela se déclenche une seule fois, au démontage
- initialValue: La valeur initiale de la référence (peut être null ou toute autre valeur).
- [Link]: C'est la propriété qui contient la référence. Elle est modifiable sans provoquer un re-rendu.
function FocusInput() {
const inputRef = useRef(null);
const handleFocus = () => {
[Link](); // Utilisation de useRef pour donner le focus à l'input
};
return (
<div>
<input ref={inputRef} type="text" placeholder="Cliquez sur le bouton pour focus" />
<button onClick={handleFocus}>Donner le focus à l'input</button>
</div>
);} 3
Introduction aux APIs
Application Programming Interface (API) est un ensemble de règles et de protocoles permettant à différents logiciels ou
applications de communiquer entre eux. Elle définit les méthodes et les outils que les programmeurs peuvent utiliser pour
intégrer des fonctionnalités spécifiques dans leurs propres applications sans avoir à recréer ces fonctionnalités à partir de zéro.
- Une API sert de pont entre différentes applications ou services, permettant d'envoyer des requêtes, d'obtenir des
réponses et d'interagir de manière fluide avec d'autres systèmes.
- Les API sont couramment utilisées dans le développement d'applications mobiles, web, et de systèmes logiciels afin de
simplifier les tâches et d'améliorer l'interopérabilité entre différents systèmes.
Pourquoi le développement des APIs ?
{
"message": "Traffic light updated successfully",
"status": "green"
}
3
RE ST API
On distingue plusieurs types d’API Web selon leur architecture et leur mode de communication.
1. API REST (Representational State Transfer): est un type d’API web qui suit les principes de l’architecture REST.
Elle permet aux applications de communiquer entre elles via des requêtes HTTP en utilisant des endpoints (URL
spécifiques) pour accéder et manipuler des ressources.
- Stateless : Chaque requête est indépendante, le serveur ne conserve pas l’état du client.
- Utilisation le Protocol HTTP : REST utilise les méthodes standards du protocole HTTP :
- GET : récupérer des données
- POST : créer une nouvelle ressource
- PUT : mettre à jour une ressource existante
- DELETE : supprimer une ressource
- Format des données : REST utilise principalement JSON (mais peut aussi supporter XML).
- Architecture basée sur les ressources : Chaque ressource est identifiée par une URL unique.
3
Stateful vs Stateless Architecture
Dans une architecture stateful, le serveur conserve une trace de l’état ou des informations de session de chaque client
pendant toute la durée de la communication. Cela permet au serveur de se souvenir des requêtes précédentes, de maintenir
des sessions utilisateur et de suivre l’état de l’application au fil du temps. Les informations de session peuvent être stockées
dans la mémoire du serveur, une base de données, ou d'autres mécanismes persistants.
Dans une architecture Stateless, le serveur ne stocke aucune information de session client entre les requêtes. Chaque
requête envoyée par le client est traitée comme une transaction indépendante, sans dépendance aux interactions précédentes.
Les architectures Stateless sont conçues pour être plus évolutives et tolérantes aux pannes, car elles ne nécessitent pas de
ressources serveur pour conserver l’état du client.
Rest API
Les REST APIs respectent la notion de stateless architecture en appliquant les principes suivants :.
- Aucune session stockée côté serveur : le serveur ne conserve aucune information sur l’état du client entre les
requêtes. Chaque requête doit contenir toutes les informations nécessaires pour être traitée indépendamment.
- Chaque requête est indépendante : Les requêtes envoyées au serveur REST doivent être autonomes. Cela signifie
que le serveur ne se souvient pas des requêtes précédentes et ne stocke pas d’état temporaire entre elles.
- Les données de session sont gérées côté client : Dans une architecture REST stateless, si un état ou une session
est nécessaire, c'est au client de le gérer et de l'envoyer à chaque requête.
POST /checkout
Exemple: Content-Type: application/json
Authorization: Bearer <token>
{"cart": [
{ "productId": 1, "quantity": 2 },
{ "productId": 5, "quantity": 1 }]} 3
Introduction aux API Web et Fetch API
fetch est une fonction native de JavaScript permettant de faire des requêtes HTTP (GET, POST, PUT, DELETE, etc.) pour
récupérer ou envoyer des données entre le client (navigateur) et un serveur. fetch est basée sur des promesses et remplace
l'ancienne méthode XMLHttpRequest.
fetch(url, options)
.then(response => [Link]()) // Convertit la réponse en JSON
.then(data => [Link](data)) // Utilise les données
.catch(error => [Link]('Erreur:', error)); // Gère les erreurs
3
Introduction aux API Web et Fetch API
Exemple Simple d'utilisation de fetch
fetch('[Link]
.then(response => {
if (![Link]) { // Vérifie si la réponse est correcte
throw new Error('Erreur de réseau');
}
return [Link](); // Convertir en JSON
})
.then(data => [Link](data)) // Afficher les données
.catch(error => [Link]('Erreur:', error)); // Capturer les
erreurs