Module Web Avance 1
Module Web Avance 1
X
Javascript et NodeJS
2
Vous avez dit NodeJS ?
4
L'event loop, un mono-thread A l'inverse un serveur Apache a
un thread par client.
Quand une requête est reçue elle est ajoutée à la queue qui est consommée par l'event loop. Chaque
opération est effectuée dans le mono-thread, une par une. Si une opération I/O bloquante a besoin
d'accéder à la base de donnée par exemple, on utilise un pool de thread C++. On assigne l'opération à un
thread du pool qui répondra une fois celle-ci terminée via un callback à l'event loop puis au client.
Password-Based Key
Derivation Function : utilisée
par exemple par certains
gestionnaires de mots de passe
6
Exemple d'opération asynchrone non-bloquante
7
4 threads dans le pool par défaut
9
Du côté des navigateurs
http://latentflip.com/loupe/
10
Les bases du Javascript
11
Déclarer des variables
● var
● let
● const
12
Limite de bloc d'instruction
if (true) {
Les variables déclarées avec let et const sont uniquement disponible dans le contexte du bloc
dans lequel elles sont définies.
Elles ne peuvent pas être déclarées deux fois dans le même contexte.
13
Pourquoi il ne faut pas utiliser var ?
var times = 4;
if (times > 3) {
14
Comportement de const
const greeting = {
message: "say Hi",
times: 4
}
console.log("Hello World")
function greetings() {
console.log("Hello World")
16
Déclarer des objets ou des tableaux
myArray.push("toto");
console.log(myArray[0]); // "titi"
myObject.firstname = "John";
myObject["name"] = "Doe";
17
Les boucles et itérations
const object = { a: 1, b: 2, c: 3 };
● L’objet global dans le cas du contexte d’exécution global (window dans un navigateur web)
● La valeur de this
● L’environnement lexical extérieur : C’est une référence vers l’environnement lexical englobant
l’environnement lexical du contexte d’exécution.
Le moteur effectue du “hoisting” : tout le code du contexte d’exécution est parcouru et l’espace mémoire
est réservé pour toutes les fonctions et variables de son environnement lexical. Les fonctions sont
stockées entièrement tandis que les variables sont initialisé à “undefined”.
Le hoisting permet d’appeler une fonction avant sa déclaration. Pour ce qui est des variables, si on appelle
une variable avant sa déclaration, elle aura bien une valeur: undefined. Cependant, si elle n’a pas été
déclarée, JavaScript renverra une erreur.
20
Phase de création en exemple (1)
var num = 2;
function pow(num) {
return num * num;
}
21
Phase de création en exemple (2)
var num = 2;
function pow(num) {
return num * num;
}
res = pow(num);
22
Le contexte d'exécution : phase d'exécution
Le code est exécuté ligne par ligne de façon synchrone. function f1() {
var age = 18;
Lorsqu'on appelle une variable, le context d'exécution va d'abord f2();
regarder si cette variable se trouve dans l'environnement lexical }
interne. Dans le cas contraire, il va regarder si elle est dans function f2() {
l'environnement lexical externe jusqu'à remonter à function a() {
l'environnement global. console.log(age);
}
a();
}
23
Un peu de documentation
24
Manipulations de tableaux et
d'objets
25
Array: filter
const new_array = arr.filter(function callback(element, index, array) {
// Return true or false
}[, thisArg])
const students = [
{ name: 'Quincy', grade: 96 },
{ name: 'Jason', grade: 84 },
{ name: 'Alexis', grade: 100 },
{ name: 'Sam', grade: 65 },
{ name: 'Katie', grade: 90 }
];
// [ { name: 'Quincy', grade: 96 }, { name: 'Alexis', grade: 100 }, { name: 'Katie', grade: 90 } ]
26
Array: map map crée une copie du tableau en
mémoire !
const persons = [
{firstname : "Malcom", lastname: "Reynolds"},
{firstname : "Kaylee", lastname: "Frye"},
{firstname : "Jayne", lastname: "Cobb"}
];
function getFullName(item) {
return [item.firstname,item.lastname].join(" ");
}
27
Array: reduce
const r=array.reduce(function(total, currentValue, currentIndex, arr) {
} , initialValue)
console.log(petCounts);
/* Output: { dog: 2, chicken: 3, cat: 1} */
28
Spread operator …
29
Structure de données avancées
30
Set()
monSet.add(1); // { 1 }
monSet.add(5); // { 1, 5 }
monSet.add(5); // { 1, 5 } const o = { a: 1, b: 2 };
monSet.add("du texte"); // { 1, 5, 'du texte' } monSet.add(o);
monSet.size; // 3
monSet.delete(5); // retire 5 du set
31
Map()
32
Les classes en Javascript
33
Déclarer une classe Pas de hoisting pour les classes !
get area() {
return this.calcArea();
}
On peut déclarer des champs publics :
calcArea() {
- En les déclarant à la racine de la classe return this.largeur * this.hauteur;
- En y accédant avec this.nomDeLaVariable }
}
On peut déclarer des champs privés en mettant un #
const carré = new Rectangle(10, 10);
devant.
console.log(carré.area);
34
Méthodes statiques
class Point {
constructor(x, y) {
Les méthodes static sont appelées par rapport à la
this.x = x;
classe entière et non par rapport à une instance this.y = y;
donnée. }
console.log(Point.distance(p1, p2));
35
Les sous-classes
36
Les modules et packages
37
Chaque fichier est un module
En CommonJS:
38
Les packages
"name": "my-api",
Un paquet est une arborescence de dossiers décrite par un "version": "1.0.0",
"description": "My description",
fichier package.json. Le paquet est constitué du dossier "source": "src/index.js",
contenant le fichier package.json et de tous les "main": "dist/main.js",
"types": "dist/types.d.ts",
sous-dossiers jusqu'au prochain dossier contenant un autre "type": "module",
fichier package.json, ou un dossier nommé "scripts": {
"start": "node dist/main.js",
node_modules. "build": "parcel build src/index.ts",
"watch": "parcel watch src/index.ts"
},
"author": "Me",
"license": "ISC",
Le fichier package.json contient les métadonnées de base "devDependencies": {
de votre application NodeJS comme par exemple son nom, "@types/express": "^4.17.17",
"@types/lodash": "^4.14.197",
sa description, les dépendances externes, les points },
d'entrée… "dependencies": {
"express": "^4.18.2",
"lodash": "^4.17.21",
}
39
Les gestionnaires de packages
Les gestionnaires de packages tel que npm vous permettent de télécharger des dépendances externes.
Elles seront ajoutées à votre fichier package.json et seront téléchargées dans node_modules.
Il existe d'autres gestionnaires de paquets avec des avantages différents tels que Yarn ou PNPM.
40
Asynchrone et NodeJS
41
Callback
La fonction de callback est une fonction qui sera appelée une fois l'opération asynchrone
terminée.
Par convention:
1. le premier paramètre est une instance de la classe Error – si l’opération a échoué – ou
null;
2. le deuxième paramètre est le résultat de l’exécution de l’opération, dans le cas où elle
s’est exécutée sans erreur. C’est la valeur qu’on aurait passé à return si notre fonction
était synchrone.
42
Rappel: les opérations async s'exécutent en //
Quand on appelle plusieurs fonctions asynchrones de suite, leurs callback respectifs ne sont pas
forcément exécutés dans le même ordre !
43
Promises
fs.promises.readFile(music).then((data) => {
console.log('data', data);
}).catch((error) => {
console.error(error);
});
Le concept de promesse (Promise) a été intégré à Javascript pour simplifier le séquençage des
appels asynchrones et améliorer la visibilité.
Le résultat final de cette fonction peut être récupéré en appelant .then() et .catch().
Une promesse peut être:
● Résolue : resolve si l'opération s'est exécutée avec succès
● Rejetée : reject si une erreur s'est produite
new Promise(function (resolve, reject) {...}
44
Faire des chaînes de Promises
45
Async/Await
async et await ont été ajoutés à Javascript pour simplifier et rendre plus lisible la définition et
l'appel des fonctions asynchrones à base de promesses.
await attend la fin d'une opération avant d'effectuer la suivante, l'ordre est garanti.
C'est une méthode de la librairie standard NodeJS qui convertit une méthode dont la réponse est sous
forme de callback en une réponse sous forme de promesse.
readdir('process.cwd()')
.then(files => {
console.log(files)
})
.catch(err => {
console.log(err)
})
47
Un peu de documentation
48
Autres
49
Les émetteurs d'évènements
NodeJS inclut une librairie standard nommée events qui permet de gérer des événements.
eventEmitter.emit("monEvenement", {"donneeA":"1","donneeB":"2"});
eventEmitter.on("monEvenement", function(data) {
console.log(data.donneeA);
console.log(data.donneeB);
});
50
Polyfilling
• Polyfilling est un terme utilisé pour remplacer une méthode existante dans la spécification
JavaScript, mais qui n’est pas encore prise en charge par un moteur JavaScript particulier.
51