Introduction à la programmation Web client en JavaScript
Mercredi 24 avril 2019
Déroulé du mercredi 24/04/19, 10h-17h
https://gonnord.gitlabpages.inria.fr/diu-lyon/bloc1/WEB/README.html
Du PhP à la maturation de l’écosystème JavaScript pendant la guerre des navigateurs
Serveur Web : répond aux requêtes HTTP, sert des pages :
Serveur d’application : génère des pages, gère des applications Web :
Le trio HTML5, CSS3 et JavaScript (ES6+)
https://developer.mozilla.org/en-US/docs/Learn
Des origines à ECMAScript 6 (2015)
Quelques caractéristiques :
Voir What the heck is the event loop anyway?, In The Loop et The browser event loop (source de l’image).
La boucle d’événement, grossièrement
Exemple avec setTimeout
console.log('Start'); // (A)
setTimeout( // (T1)
() => console.log('Call back #1') // (CB1)
, 3000);
console.log('Middle'); // (B)
setTimeout( // (T2)
() => console.log('Call back #2') // (CB2)
, 1500);
console.log('End'); // (C)
Voir javascript.info, Chap. 4, 8 et 9 et Working with objects
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const mycar = new Car('Eagle', 'Talon TSi', 1993);
console.log(mycar.model); //'Talon TSi'
console.log(mycar.constructor); //function Car()
console.log(Object.getPrototypeOf(mycar) === Car.prototype); //true
console.log(mycar instanceof Car); //true
console.log(mycar instanceof Object); //true
La chaîne de prototypes
function Employee() {
this.dept = 'general';
this.name = 'default';
}
function WorkerBee() {
this.projects = [];
}
WorkerBee.prototype = new Employee();
const amy = new WorkerBee;
console.log(amy.name);
console.log(amy.projects);
La chaîne de prototypes
amy.__proto__ === WorkerBee.prototype;
amy.__proto__.__proto__ === Employee.prototype;
amy.__proto__.__proto__.__proto__ === Object.prototype;
amy.__proto__.__proto__.__proto__.__proto__ === null;
Voir javascript.info, Chap. 6, First-class citizens functions, closures et arrows functions
Exemple de programmation fonctionnelle : l’usine à fonctions
// Version ES5
function creer_fonction(nom) {
return function nom_inutile() {
console.log("Bonjour " + nom);
};
}
const maFonction = creer_fonction("Romuald");
maFonction();
// Version ES6 : arrows et template string
const creer_fonction_ES6 = (nom) => () => {console.log(`Bonjour ${nom}`);}
creer_fonction_ES6("Fabien")();
Exemple de programmation fonctionnelle : les méthodes de Array
const liste = [1 , 5 , 10 , 15];
const doubles = liste.map(x => x * 2);
// doubles vaut [2 , 10 , 20 , 30]
const filtres = doubles.filter(x => x > 15) ;
// filtre vaut [20 , 30]
const somme = filtres.reduce((acc, cur) => acc + cur, 0) ;
// somme vaut 50
const s = [1 , 5 , 10 , 15]
.map (x => x * 2)
.filter(x => x > 15)
.reduce ((acc, cur) => acc + cur, 0) ;
Exemple de programmation fonctionnelle : décorateur maybe
function maybe(f,v) {
return function(...x) {
if (f(...x) === undefined) {
return v;
} else {
return f(...x);
}
};
}
const maybe = (f,v) => (...x) => (f(...x)===undefined)?v:f(...x);
Exemple de programmation fonctionnelle : décorateur memoize
function memoize(f) {
let results = new Map();
return function(x) {
if ( !results.get(x) ) {
results.set(x, f(x));
}
return results.get(x);
};
}
Le DOM fait le lien entre JavaScript et les documents (HTML, SVG, XML).
Voir Introduction to the DOM et Document Object Model (DOM)
document.addEventListener("DOMContentLoaded", () => {
let heading = document.createElement("h1");
let heading_text = document.createTextNode("Big Head!");
heading.appendChild(heading_text);
document.body.appendChild(heading);
});
function replace_btn() {
this.value = prompt('Saisir une valeur');
}
document.getElementById('btn-exec').addEventListener('click', replace_btn);
Voir javascript.info, Chap. 11, Overview of Events and Handlers et Callback function, Using Callbacks
Exemple AJAX avec l’API fetch
function chargeInsere(rendu) {
return (url, id) =>
fetch(url)
.then(x => x.json())
.then(rendu)
.then(str => {document.getElementById(id).innerHTML= str;});
}
Wikimedia Commons, Mozilla Developper Network, Node.js®, Ethan Bradley et Axel Rauschmayer.