Les programmes consistent habituellement en plusieurs fichiers
Les programmes utilisent habituellement des dépendances externes (react, mithril, angular, lodash)
Votre programme sera probablement importer par d'autre programmes
Il est façile de copier quelque chose
Il est façile de réutiliser quelque chose
On veut calculer la moyenne d'un groupe d'étudiant. Nous travaillons dans un fichier students.js
et nous avons un fichier stats.js avec des fonctions statistiques fait par une statisticienne.
stats.js¶// stats.js
function average(lst){
if(lst.length < 1){
return NaN;
}
let sum = 0;
let n = 0;
for(const e of lst){
sum += e;
n += 1;
}
return sum / n;
}
students.js¶// students.js
function getFinalGrades(students){
const grades = [];
for(const student of students){
if(student.finalGrade){
grades.push(finalGrade);
}
}
return grades;
}
function studentAverage(students){
const finalGrades = getFinalGrades(students);
const ret = average(finalGrades);
if(isNaN(ret)){
return "Aucune note entrées";
}
return ret + "%";
}
Être capable de "merger" les deux fichiers dans le bon ordre
Être capable d'importer des fonction de n'importe où
C'est un fichier javascript
Le fichier utilise une extension .js ou .jsm (javascript module)
C'est une fichier qui peut importer d'autres modules
C'est une fichier qui peut exporter des choses
C'est un fichier qui est dans son propre "scope"/"namespace"
Si un module students.js utilise la fonction average du module stats.js on dira que le module students.js importe la fonction average du module stats.js.
Si la fonction average du module stats.js peut être importer par un aute module, on dira que la fonction average est exporté par stats.js.
Un module stats.js doit être consentant pour exporter une fonction average.
Le module students.js n'a pas besoin de l'accord stats.js pour importer la fonction average
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>title</title>
<script type="module" src="script.js"></script>
</head>
<body>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>title</title>
<script type="module" src="script.js"></script>
</head>
<body>
<button onclick=sayHello() id="hello-button">Say Hello</button>
</body>
</html>
script.js contient la fonction sayHello(), cliquer le bouton ne fera rien :(function sayHello(){
alert("Bonjour monde!");
}
document.getElementById("hello-button").addEventListener('click', sayHello);
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<script type="module" src="script.js"></script>
</head>
<body>
<button id="hello-button">Say Hello</button>
</body>
</html>
import {average} from "./stats.js";
import {average} from "https://cdn.jsdelivr.net/gh/didiercrunch/cours-420-301-ah@main/modules-examples/stats.js";
import {average} from "https://cdn.jsdelivr.net/gh/didiercrunch/cours-420-301-ah@main/modules-examples/stats.js";
console.log(average([1,2,3,4]))
2.5
import {average} from "./stats.js";
^ ^ ^ ^
1 2 3 4
import est réservéfrom est réservéimport {average} from "./stats.js";
console.log(average([10, 20, 30]));
averageaverage définit dans ./stats.jsimport {average, std} from "./stats.js";
console.log(average([10, 20, 30]));
console.log(std([10, 20, 30]));
average et stdaverage et std définient dans ./stats.jsimport {std as standardDeviation} from "./stats.js";
console.log(standardDeviation([10, 20, 30]));
std mais la renommons standardDeviation./stats.jsimport * as stats from "./stats.js";
console.log(stats.average([10, 20, 30]));
/stats.js et les mettons dans un objet stats./stats.js
export const INFINITY = 30;
export function average(lst){
return 0;
}
export function std(lst){
return 0;
}
export const INFINITY = 30;
^ ^ ^ ^
1 2 3 4
export est réservéexport function average(lst){
return 0;
}
Une super BD https://hacks.mozilla.org/2018/03/es-modules-a-cartoon-deep-dive/
La vraie doc: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules
V8 (aka google) https://v8.dev/features/modules