From 90203c2b98d5462e7933f5a3100200458bf6ed90 Mon Sep 17 00:00:00 2001 From: Thomas Fritsch <thomas@uidlt.fr> Date: Mon, 31 Jan 2022 01:27:04 +0100 Subject: [PATCH] maj readme MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit suppression plugin-proposal-class-properties inutile désormais wording mise en forme synchro cours react --- A-preparatifs.md | 18 ++++--- B-poo.md | 80 +++++++++--------------------- C-modules.md | 7 ++- D-poo-avancee.md | 15 ++++-- images/readme/header-prettier.jpg | Bin 0 -> 23309 bytes 5 files changed, 46 insertions(+), 74 deletions(-) create mode 100644 images/readme/header-prettier.jpg diff --git a/A-preparatifs.md b/A-preparatifs.md index c3d3fce..77697a3 100644 --- a/A-preparatifs.md +++ b/A-preparatifs.md @@ -53,6 +53,8 @@ Il va vous servir de base pour ce nouveau TP. ## A.2. Configuration de Prettier +<img src="images/readme/header-prettier.jpg" /> + _**Lors du précédent TP, vous avez en principe installé l'extension Prettier dans VSCodium.**_ Prettier est un formateur de code automatique qui est le plus populaire à l'heure actuelle dans l'écosystème JavaScript. @@ -69,7 +71,7 @@ Prettier est un formateur de code automatique qui est le plus populaire à l'heu } } ``` - Créez ensuite un fichier `.prettierrc` à la racine du TP : +2. **Créez ensuite un fichier `.prettierrc`** à la racine du TP : ```json { "singleQuote": true, @@ -79,11 +81,11 @@ Prettier est un formateur de code automatique qui est le plus populaire à l'heu "arrowParens": "avoid" } ``` - Enfin, installez le paquet npm `prettier` dans le projet (_nécessaire pour que l'extension fonctionne_) : +3. **Enfin, installez le paquet npm `prettier`** dans le projet (_nécessaire pour que l'extension vscodium fonctionne_) : ```bash npm install --save-dev prettier ``` - Avec cette configuration, vos fichiers JS seront maintenant automatiquement formatés à chaque sauvegarde ! + Avec cette configuration, vos fichiers JS seront maintenant automatiquement formatés à chaque sauvegarde ! Plus besoin de vous tracasser avec les retours à la ligne, les tabulations, les espaces, tout sera géré automatiquement par Prettier ! > _**NB :** si vous souhaitez en savoir plus sur la liste des configurations possibles, rendez vous sur https://prettier.io/docs/en/configuration.html_ @@ -141,7 +143,7 @@ Comme dans le précédent TP lancez un serveur HTTP et la compilation du projet **Lors du précédent TP nous avons créé un fichier `package.json` dans le projet grâce à la commande `npm init`.** Ce fichier sert à plusieurs choses et notamment : -1. **Il permet de conserver l'historique de tous les paquets qui sont installés dans le projet.** C'est en quelque sorte l'équivalent du fichier `pom.xml` de maven. Vérifiez que dans la section `devDependencies` sont bien listés les paquets suivants : +1. **Il permet de conserver l'historique de tous les paquets qui sont installés dans le projet.** C'est en quelque sorte l'équivalent du fichier `pom.xml` en JAVA ou encore du `composer.json` en PHP. Vérifiez que dans la section `devDependencies` sont bien listés les paquets suivants : - `@babel/cli` - `@babel/core` - `@babel/preset-env` @@ -154,7 +156,7 @@ Ce fichier sert à plusieurs choses et notamment : > _**NB :** Le dossier **`node_modules` n'est jamais versionné** (c'est en général un dossier relativement volumineux) mais le **`package.json` lui l'est** car il servira de "recette" pour indiquer aux développeurs qui rejoindraient le projet quels sont les paquets nécessaires._ > - > _En effet, grâce au `package.json`, un nouveau développeur n'a qu'à exécuter la commande `npm install` (sans préciser de nom de paquet) pour installer automatiquement toutes les dépendances du projet (c'est d'ailleurs ce que vous avez fait plus haut) !_ +> _En effet, grâce au `package.json`, un nouveau développeur n'a qu'à exécuter la commande `npm install` (sans préciser de nom de paquet) pour installer automatiquement toutes les dépendances du projet (c'est d'ailleurs ce que vous avez fait au début du TP) !_ 2. **Dans ce fichier on va également pouvoir ajouter des "scripts personnalisés" que l'on pourra lancer à l'aide de la commande `npm run xxxxx`.** C'est cette dernière possibilité que l'on va maintenant exploiter pour nous simplifier la vie dans la suite du TP. @@ -169,7 +171,7 @@ ou ./node_modules/.bin/babel src -d build --verbose --watch --source-maps ``` -Avec le `package.json` **on va créer des "raccourcis" pour lancer ces commandes plus facilement.** +Grâce au `package.json` **on va créer des "raccourcis" pour lancer ces commandes plus facilement.** 1. **Stoppez d'abord la commande "./node_modules/.bin/babel ... --watch ..." que vous aviez lancée au point A.3.2.** 2. Dans VSCodium, **ouvrez le fichier `package.json`** en tapant <kbd>CTRL</kbd>+<kbd>P</kbd> puis le nom du fichier ( <kbd>Enter</kbd> _pour ouvrir le fichier_) 3. **Localisez la section "scripts" du fichier**. Elle doit ressembler à : @@ -215,8 +217,8 @@ Avec le `package.json` **on va créer des "raccourcis" pour lancer ces commandes <img src="images/readme/npm-run-watch.gif" /> - Vous voyez que le watch ne vous rend pas la main sur le terminal, il faut le laisser ouvert pour que la recompilation automatique à chaque sauvegarde continue de fonctionner. + Vous voyez que le watch ne vous rend pas la main sur le terminal, il faut en effet le laisser ouvert car il va permettre de recompiler automatiquement à chaque fois que vous modifierez un fichier ! Essayez de modifier le contenu du fichier main.js, vous verrez que la compilation se relance toute seule ! ## Étape suivante <!-- omit in toc --> -Si la compilation fonctionne, vous pouvez passer à l'étape suivante : [B. La POO](B-poo.md) \ No newline at end of file +Maintenant que votre code compile, vous pouvez passer à l'étape suivante : [B. La POO](B-poo.md) \ No newline at end of file diff --git a/B-poo.md b/B-poo.md index 52893f3..e2fb514 100644 --- a/B-poo.md +++ b/B-poo.md @@ -2,19 +2,22 @@ # B. POO <!-- omit in toc --> +_**Nous allons développer dans ce TP une classe `Component` qui va permettre de générer du code HTML en JS.**_ + +A chaque étape du TP vous allez perfectionner la classe Component pour la rendre capable de gérer des paramètres supplémentaires. + +> _**NB :** Dans ce TP vous coderez dans un premier temps vos classes directement dans le fichier `src/main.js` **sans compiler** votre code et **sans passer par des fichiers (modules) séparés**._ +> +> _Dans la suite du TP on compilera notre code pour le rendre compatible avec tous les navigateurs, et on organisera notre code plus proprement en séparant les classes dans des modules différents._ \ +> _Mais pour le moment on va simplifier la mise en place en remettant ça à plus tard (ne faites pas ça dans la vraie vie !)._ + ## Sommaire <!-- omit in toc --> - [B.1. Rappels de syntaxe](#b1-rappels-de-syntaxe) - [B.1.1. class & propriétés publiques](#b11-class-propriétés-publiques) - [B.1.2. méthodes](#b12-méthodes) -- [B.2. Support des syntaxes modernes](#b2-support-des-syntaxes-modernes) -- [B.3. La classe Component](#b3-la-classe-component) +- [B.2. La classe Component](#b2-la-classe-component) - [B.4. Héritage : La classe Img](#b4-héritage-la-classe-img) -**NB : Dans ce TP vous coderez dans un premier temps vos classes directement dans le fichier `src/main.js` sans passer par des fichiers (modules) séparés.** - -Dans la suite du TP on organisera notre code plus proprement en séparant les classes dans des modules différents. - -Mais pour le moment on va simplifier la mise en place en remettant ça à plus tard (*ne faites pas ça dans la vraie vie !*). ## B.1. Rappels de syntaxe ### B.1.1. class & propriétés publiques @@ -42,9 +45,9 @@ class Character { } } ``` -Attention cependant, cette notation n'est **pas encore dans la spec officielle** d'EcmaScript (_la spec suivie par JavaScript_) mais a des chances d'être intégrée dans la version 2021 d'EcmaScript (ES12) : cf. https://github.com/tc39/proposal-class-fields et https://tc39.github.io/proposal-class-fields/ +Attention cependant, cette notation n'est **pas encore dans la spec officielle** d'EcmaScript (_la spec suivie par JavaScript_) mais devrait être intégrée dans la version 2022 de la spec (ES13) : cf. https://github.com/tc39/proposals/blob/master/finished-proposals.md et https://github.com/tc39/notes/blob/HEAD/meetings/2021-04/apr-19.md#class-fields-private-methods-and-static-class-features-for-stage-4 -Pour pouvoir l'utiliser, il faudra modifier légèrement la configuration de Babel (cf. chapitre suivant). +Ceci dit, Babel permet déjà de l'utiliser ! ### B.1.2. méthodes La création de méthodes d'une classe se fait de la manière suivante : @@ -67,52 +70,9 @@ heisenberg.fullName(); ``` -## B.2. Support des syntaxes modernes -**Comme vu dans le [chapitre précédent](#b11-class-propriétés-publiques), certaines syntaxes que nous allons utiliser dans le TP ne sont pas encore dans la spec officielle** (_c'est le cas pour la déclaration de propriétés d'instance en dehors du constructeur, les propriétés ou méthodes privées ou encore les propriétés et méthodes statiques_). - -Ces fonctionnalités du langages sont **dans un stade relativement avancé de discussion (niveau 3 sur 4)** et ont désormais de grandes chances d'arriver dans la spécification officielle prochainement. Pas de raison de s'en priver donc. - -Pour pouvoir utiliser ces syntaxes, nous allons **modifier la configuration de Babel** qui par défaut n'est capable de compiler que les syntaxes officielles : -1. **Installez le paquet npm ["@babel/plugin-proposal-class-properties"](https://babeljs.io/docs/en/babel-plugin-proposal-class-properties)** : - ```bash - npm install --save-dev @babel/plugin-proposal-class-properties - ``` -2. **Modifiez le fichier `.babelrc`** pour y ajouter le plugin que l'on vient d'installer : - ```json - { - "presets": ["@babel/env"], - "plugins": ["@babel/plugin-proposal-class-properties"] - } - ``` -3. **Stoppez puis relancez la compilation à l'aide de la commande `npm run watch`** et vérifiez qu'aucune erreur n'est remontée dans le terminal. +## B.2. La classe Component -4. **Copiez-collez le code suivant directement dans le fichier `main.js`** : - ```js - class Character { - firstName; - lastName; - constructor(firstName, lastName) { - this.firstName = firstName; - this.lastName = lastName; - } - fullName() { - return `${this.firstName} ${this.lastName}`; - } - } - - const heisenberg = new Character('Walter', 'White'); - console.log( - heisenberg.firstName, - heisenberg.fullName(), - ); - ``` - Vérifiez que la syntaxe employée pour la déclaration des propriétés `firstName` et `lastName` sont correctement prises en compte par le compilateur et que le `console.log` affiche bien les bonnes valeurs dans la console. - - ***Si c'est bon, vous êtes prêt pour la suite !*** - -## B.3. La classe Component -1. **Effacez le code que vous aviez copié/collé dans l'exercice précédent** (_ne conservez que le tableau `data`_) -2. **Dans le fichier `src/main.js` créez une classe `Component` qui s'utilise de la manière suivante :** +1. **Dans le fichier `src/main.js` créez une classe `Component` que vous utiliserez de la manière suivante :** ```js const title = new Component( 'h1' ); document.querySelector('.pageTitle').innerHTML = title.render(); @@ -134,6 +94,10 @@ Pour pouvoir utiliser ces syntaxes, nous allons **modifier la configuration de B **Vérifiez que votre classe fonctionne correctement en inspectant le code généré par votre application avec l'Inspecteur d'éléments des devtools du navigateur.** + > _**NB :** On passe par l'inspecteur d'éléments car visuellement à l'écran, c'est difficile de contrôler le rendu : rien ne s'affiche car on n'a pas précisé de contenu au `<h1>` !_ + + <img src="images/readme/pizzaland-01-h1.png" /> + 3. **Ajoutez un second paramètre au constructeur, nommé `children`.** Modifiez le code de la méthode render() de manière à ce que le code suivant : ```js const title = new Component( 'h1', 'La carte' ); @@ -152,19 +116,21 @@ Pour pouvoir utiliser ces syntaxes, nous allons **modifier la configuration de B ```js const img = new Component( 'img' ); ``` - `render()` doit retourner `<img />` et pas `<img></img>` (_car ce n'est pas un code HTML valide selon la spec du W3C_). + `render()` doit retourner `<img />` (_une balise "auto fermante", c'est à dire sans enfants_) et pas `<img></img>` (_car ce n'est pas un code HTML valide selon la spec du W3C_). **Testez votre classe comme ceci** : ```js const img = new Component( 'img' ); document.querySelector( '.pageContent' ).innerHTML = img.render(); ``` - Vérifiez dans **l'inspecteur d'éléments** que votre image est bien ajoutée dans `pageContent`. + Vérifiez dans **l'inspecteur d'éléments** que votre image est bien ajoutée dans `pageContent` : - > _**NB :** On passe par l'inspecteur d'éléments car visuellement à l'écran, c'est difficile de contrôler le rendu : aucune image ne s'affiche car on n'a pas précisé ni de source ni de taille à l'image !_ + > _**NB :** Comme tout à l'heure avec le `h1`, on passe par l'inspecteur d'éléments car visuellement à l'écran, c'est difficile de contrôler le rendu : aucune image ne s'affiche car on n'a pas précisé ni de source ni de taille à l'image !_ > _**NB2 :** Selon votre navigateur il est possible que l'inspecteur d'éléments n'affiche que `<img>` et pas `<img />`. C'est une simplification faite par les devtools, mais ça ne veut pas dire que votre code ne fonctionne pas. Testez donc votre code avec `console.log(img.render())`, là vous saurez avec certitude si votre méthode retourne bien `<img />`._ + <img src="images/readme/pizzaland-02-inspecteur.png" > + 5. **Ajoutez un paramètre `attribute` en 2e position du constructeur de la classe `Component` : enregistrez ce paramètre dans une propriété d'instance `this.attribute`.** La signature du constructeur sera désormais : diff --git a/C-modules.md b/C-modules.md index 80a4590..8961950 100644 --- a/C-modules.md +++ b/C-modules.md @@ -50,8 +50,7 @@ Nous verrons plus tard dans le TP comment rendre nos modules compatibles avec le { "presets": [ ["@babel/env", {"modules": false}] - ], - "plugins": ["@babel/plugin-proposal-class-properties"] + ] } ``` Pour prendre en compte la nouvelle configuration de Babel, **stoppez (<kbd>CTRL</kbd>+<kbd>C</kbd>) puis relancez** la compilation à l'aide de la commande `npm run watch` @@ -89,7 +88,7 @@ Nous verrons plus tard dans le TP comment rendre nos modules compatibles avec le > export default function checkValue(value){...} // OK aussi ! > ``` -2. **Compilez votre code et testez la page dans le navigateur** : le résultat doit être identique à celui obtenu précédemment : +4. **Compilez votre code et testez la page dans le navigateur** : le résultat doit être identique à celui obtenu précédemment : <img src="images/readme/pizzaland-02.png" > @@ -137,7 +136,7 @@ Comme vu en cours, le bundler le plus employé en JS est [Webpack](https://webpa } ] }, - devtool: 'source-map' + devtool: 'cheap-source-map' } ``` diff --git a/D-poo-avancee.md b/D-poo-avancee.md index 6169a68..7c40043 100644 --- a/D-poo-avancee.md +++ b/D-poo-avancee.md @@ -19,7 +19,7 @@ _**L'objectif de cet exercice est d'utiliser une classe à l'intérieur d'une au 1. **Modifiez le code de la méthode `render()`** de la classe `Component` pour lui permettre de recevoir dans le paramètre `children` : - soit une **chaîne de caractères** (comme c'est déjà le cas actuellement) - - soit un **tableau de chaînes de caractères.** <br>Par exemple : si `tag` vaut `"div"` et que `children` vaut `[ "youpi", "ça", "marche" ]` alors `render()` retournera la chaîne `"<div>youpiçamarche</div>"`. + - soit un **tableau de chaînes de caractères.** <br>Par exemple : si `tagName` vaut `"div"` et que `children` vaut `[ "youpi", "ça", "marche" ]` alors `render()` retournera la chaîne `"<div>youpiçamarche</div>"`. > _**NB :** Pour ne pas alourdir trop le code de la méthode `render()` et pour avoir un code plus lisible, passez le code de rendu des enfants, dans une méthode `renderChildren()`._ @@ -90,6 +90,10 @@ _**L'objectif de cet exercice est d'utiliser une classe à l'intérieur d'une au on **surcharge juste le constructeur** en invoquant celui de `Component` (`super(...)`) et en lui passant les bons `tagName`, `attribute` et `children`. + > _**Attention :** Je pense que vous l'aurez remarqué, le code que je vous ai fourni pour cette classe `PizzaThumbnail` n'est **pas hyper pratique ni lisible** : elle a une utilité dans notre exercice mais ce n'est pas un fonctionnement que je recommande dans la vraie vie ou dans vos futurs projets !_ + > + > _Plutôt que d'imbriquer des `Component` dans des `Component` comme on le fait ici, on aurait pu par exemple **overrider simplement la méthode `renderChildren()`** pour lui faire retourner une **template string** contenant tout le code HTML._ + Dans le `src/main.js`, testez votre classe avec le code suivant : ```js const pizza = data[0]; @@ -152,7 +156,7 @@ naviguer d'une page à l'autre sans rechargement de page ! (_principe de base des [SPA](https://en.wikipedia.org/wiki/Single-page_application)_) ### D.3.1 Rappels de syntaxe -Pour rappel les propriétés et méthodes statiques peuvent se déclarer à l'aide du mot clé `static`. Ces propriétés/méthodes sont définies et s'utilisent au niveau de la classe (et pas de l'instance) comme ceci : +Pour rappel les propriétés et méthodes statiques peuvent se déclarer à l'aide du mot clé `static`. Ces propriétés/méthodes n'existent qu'au niveau de la classe (et pas de l'instance) et s'utilisent comme ceci : ```js class Counter { @@ -208,12 +212,12 @@ class Character { } ``` -Le support des propriétés et méthodes privées est en stage 3/4 de spécification. Ce n'est donc pas encore dans la spec EcmaScript officielle. Néanmoins il est possible de les utiliser grâce au plugin Babel [@babel/plugin-proposal-class-properties](https://babeljs.io/docs/en/babel-plugin-proposal-class-properties) que l'on a déjà installé précédemment (c'est le même que pour les propriétés publiques). +Comme les propriétés publiques, le support des propriétés et méthodes privées n'est pas encore dans la spec officielle mais devrait être intégré à ES2022 (ES13). Néanmoins il est possible de les utiliser grâce au `preset-env` qui inclue ces syntaxes. > _**NB :** Si vous vous demandez pourquoi on écrit `#propriete` et pas `private propriete` comme dans d'autres langages, la réponse se trouve ici :_ https://github.com/tc39/proposal-class-fields/blob/master/PRIVATE_SYNTAX_FAQ.md#why-arent-declarations-private-x ### D.4.2. Rappels getters/setters -Vous pouvez déclarer des getter et des setters de la façon suivante : +Vous pouvez déclarer des getter et des setters de la manière suivante : ```js class Character { @@ -243,5 +247,6 @@ Router.routes = [{ path: '/', page: pizzaList, title: 'La carte' }]; Router.navigate('/'); // affiche une page vide pizzaList.pizzas = data; Router.navigate('/'); // affiche la liste des pizzas - ``` + +**C'est la fin de ce TP, rendez-vous très vite pour le prochain chapitre !** diff --git a/images/readme/header-prettier.jpg b/images/readme/header-prettier.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e8595737b67114f01335cf311eaa2bb0f3ac177e GIT binary patch literal 23309 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 H`2QvVWiV-` literal 0 HcmV?d00001 -- GitLab