Accueil > Intranet Michel Buffa > Programmable Web - Client side 2018-2019

Programmable Web - Client side 2018-2019

De $1

Table des matières
  1. 1. Introduction
    1. 1.1. PROPOSITION TRES INCOMPLETE DU PROJET FIL ROUGE
  2. 2. Séance 1 : Clients "légers", intro à VueJS / Librairies / consommer un Web Service REST / FireBase (back end mobile)
    1. 2.1. TP 1 : Exercices avec VueJS, Firebase et WebServices RESTFUL
      1. 2.1.1. Partie 1 : Faire fonctionner l'exemple VueJS vu en classe, mais avec des fichiers et une table HTML
      2. 2.1.2. Partie 2 : utilisation d'une base de données synchronisée dans le cloud (FireBase)
  3. 3. Séance 2: composants customs, développement en mode CLI
      1. 3.1.1. Développer en mode "CLI" avec un environnement de build/testy   
  4. 4. Séance 3 : introduction à React, quelques infos sur le cloud...
      1. 4.1.1. Exercices d'introduction, dans une IDE en ligne
      2. 4.1.2. Exercice à faire en vous aidant des exercices précédents:
      3. 4.1.3. Exercices avec un environnement "CLI"
  5. 5. Séance 4 : utilisation de données d'un WebService RESTFUL en Ajax avec l'API standard du W3C fetch, hébergement dans le cloud, utilisation via React
    1. 5.1. Support de cours
    2. 5.2. Etude d'un Client et d'un serveur REST
    3. 5.3. Etudiez le code source
    4. 5.4. OPTIONNEL : déployer ce code localement.
    5. 5.5. Déploiement d'une application dans le cloud Heroku
  6. 6. Reprendre l'application react sur les hobbies de la semaine dernière, faites la marcher avec les restaurants
    1. 6.1. Plus difficile : héberger votre application React sur Heroku
  7. 7. Séance 5 : Introduction à Angular 7
  8. 8. 1 : création d'une application "squelette"
    1. 8.1. 2 : affichage d'une liste d'éléments
    2. 8.2. 3 : création d'un nouveau composant
    3. 8.3. 4 : définition d'un événement qui sera envoyé du composant "fils" vers le composant "père"
    4. 8.4. 5 : binding bi-directionnel avec [(ngModel)]="nom"
    5. 8.5. 6 : refaire l'exemple des hobbies complet, mais en angular
  9. 9. Exemples d'applications prêtes à déployer sur Heroku (regardez les README.txt pour les explications)

  1. 1. Introduction
    1. 1.1. PROPOSITION TRES INCOMPLETE DU PROJET FIL ROUGE
  2. 2. Séance 1 : Clients "légers", intro à VueJS / Librairies / consommer un Web Service REST / FireBase (back end mobile)
    1. 2.1. TP 1 : Exercices avec VueJS, Firebase et WebServices RESTFUL
      1. 2.1.1. Partie 1 : Faire fonctionner l'exemple VueJS vu en classe, mais avec des fichiers et une table HTML
      2. 2.1.2. Partie 2 : utilisation d'une base de données synchronisée dans le cloud (FireBase)
  3. 3. Séance 2: composants customs, développement en mode CLI
      1. 3.1.1. Développer en mode "CLI" avec un environnement de build/testy   
  4. 4. Séance 3 : introduction à React, quelques infos sur le cloud...
      1. 4.1.1. Exercices d'introduction, dans une IDE en ligne
      2. 4.1.2. Exercice à faire en vous aidant des exercices précédents:
      3. 4.1.3. Exercices avec un environnement "CLI"
  5. 5. Séance 4 : utilisation de données d'un WebService RESTFUL en Ajax avec l'API standard du W3C fetch, hébergement dans le cloud, utilisation via React
    1. 5.1. Support de cours
    2. 5.2. Etude d'un Client et d'un serveur REST
    3. 5.3. Etudiez le code source
    4. 5.4. OPTIONNEL : déployer ce code localement.
    5. 5.5. Déploiement d'une application dans le cloud Heroku
  6. 6. Reprendre l'application react sur les hobbies de la semaine dernière, faites la marcher avec les restaurants
    1. 6.1. Plus difficile : héberger votre application React sur Heroku
  7. 7. Séance 5 : Introduction à Angular 7
  8. 8. 1 : création d'une application "squelette"
    1. 8.1. 2 : affichage d'une liste d'éléments
    2. 8.2. 3 : création d'un nouveau composant
    3. 8.3. 4 : définition d'un événement qui sera envoyé du composant "fils" vers le composant "père"
    4. 8.4. 5 : binding bi-directionnel avec [(ngModel)]="nom"
    5. 8.5. 6 : refaire l'exemple des hobbies complet, mais en angular
  9. 9. Exemples d'applications prêtes à déployer sur Heroku (regardez les README.txt pour les explications)

Introduction

Dans ce cours nous allons jouer avec des technologies front-end dans le cadre d'une approche "moderne" de la programmation de WebApps. Nous allons uniquement utiliser des services dans le cloud, des plateformes de service, ou bien des clients RESTful de WebServices comme ceux que vous développerez dans le cadre du cours "Programmable Web - server side".

L'approche moderne ce sont donc des clients "webapps" single page, basés HTML/CSS/JavaScript. Au passage : ce sont les trois seuls langages "standards du Web" qu'un navigateur comprend.

PROPOSITION TRES INCOMPLETE DU PROJET FIL ROUGE

Séance 1 : Clients "légers", intro à VueJS / Librairies / consommer un Web Service REST / FireBase (back end mobile)

Support de cours :

Live coding: back end RESTFUL et clients légers.

Exemples fait en cours (liste de restaurants, avec ajout et suppression):

  1. En pur JavaScript avec utilisation des APIs du DOM (append, createElement, removeChild, innerHTML) et de la sector API (document.querySelector...) : https://jsbin.com/pemaric/edit?html,js,output
  2. Le même exemple mais en utilisant des librairies pour simplifier certaines parties (ici utilisation de lodash pour la génération d'ids, de jQuery pour simplifier l'utilisation du DOM): https://jsbin.com/tiyirud/1/edit?html,js,output
  3. Enfin, encore le même exemple mais avec l'utilisation du framework VueJS en mode déclaratif : https://jsbin.com/jiqowib/edit?html,js,output

TP 1 : Exercices avec VueJS, Firebase et WebServices RESTFUL

Partie 1 : Faire fonctionner l'exemple VueJS vu en classe, mais avec des fichiers et une table HTML

Ceci est le dernier exemple vu en classe dans JsBin: https://jsbin.com/jiqowib/edit?html,js,output

Ici vous trouverez le fichier exo1_vueJS_table.zip  qui contient le même exemple mais fonctionnant avec des fichiers. Dezippez-le et utilisez un serveur Web pour ouvrir le fichier index.html. Je vous suggère d'utiliser un serveur ultra léger comme Web Server For Chrome (extension pour Google Chrome)

Travail à faire : 

  1. Générer la liste des restaurants non pas dans une liste mais dans un tableau à deux colonnes.
  2. Utiliser quelques règles CSS pour que le tableau soit plus joli
  3. Afficher dans le H1 le nombre de restaurants. Ce nombre devra être mis à jour automatiquement lorsqu'on ajoute ou enlève des restaurants à la liste
  4. Utiliser la syntaxe v-bind:style="{proprieteCSS:valeur}" pour changer le style des restaurants dynamiquement. La valeur peut être retournée par une fonction ou une expression comme par exemple: v-bind:style="{color:getColor(index)}". Essayez donc d'afficher de cette manière les lignes paires d'une certaine couleur, les lignes impaires d'une autre couleur.
  5. Idem, mais avec une classe CSS. Vous créerez la classe CSS "bordureRouge" dans le fichier css/styles.css, et vous n'ajoutrez cette classe CSS qu'à la 4ème ligne du tableau (qui s'affichera donc encadrée en rouge). Lisez donc la page de documentation suivante : https://vuejs.org/v2/guide/class-and-style.html

CORRECTION FAITE EN CLASSE (ne pas regarder avant d'avoir fini): 

  •  

Partie 2 : utilisation d'une base de données synchronisée dans le cloud (FireBase)

ETAPE 1 : on va créer une base sur FireBase

  • Allez sur https://firebase.google.com/
     
  • Cliquez sur "accèder à la console" ou "Get Started" selon la langue...
     
  • Cliquez sur "+" pour ajouter un projet, appelez-le "EPURestaurants" par exemple. Dans les fenêtres de dialogue cochez toutes les cases dans la fenêtre.
     
  • Faites défiler la page centrale et cliquez sur la case Jaune "Database"
     
  • Dans la page suivante, ne choisissez pas le premier choix mais faites défiler la page et choisissez la case en jaune "Realtime Database"
     
  • Choisissez le mode "test" sans authentification.
      
  • Cliquez à gauche en haut, sur l'icône à droite de "Project Overview", choisissez "paramètres du projet", et au milieu de la page sur "Ajouter Firebase à votre application Web", une fenêtre s'ouvre avec des bouts de JS. Voir cette image 
  • Gardez cet onglet ouvert, vous allez devoir coller la configuration à votre application.

ETAPE 2 : ajouter le support pour FireBase à votre application

Si vous aviez fait l'exercice 1 avec jsBin, voici ici une version avec des fichiers, que je vous conseille de récupérer: exo1_vueJS_table_corrige.zip 

On va donc utiliser FireBase mais aussi une librairie spéciale pour utiliser FireBase avec VueJS: vue-fire (documentation sur https://github.com/vuejs/vuefire).

Pour cela vous allez ajouter ces lignes à votre page HTML (dans le <head>...</head>, avant votre script à vous (script.js)

Mettez-les AVANT l'inclusion de votre fichier script.js !!! Ce dernier utilise des variables définies dans ces deux fichiers.

 

Ensuite, dans le fichier script.js, vous allez ajouter ces lignes (configuration de firebase) : pensez à mettre entre parenthèse une copie de la valeur de la BD que vous aurez créée :

 

window.onload = init;

// FIREBASE INIT
var firebaseApp = firebase.initializeApp(
// ICI COPIER LA VALEUR DE LA VARIABLE CONFIG DE FIREBASE (A PRENDRE SUR LE SITE DE VOTRE BD)
);
 
var db = firebaseApp.database();
var restaurantsRef = db.ref('restaurants');

Et enfin, voici le nouveau code de la vue :

 

function init() {
new Vue({
el: "#app",
data: {
nom: "",
cuisine:""
},
firebase: {
restaurants: restaurantsRef
},
methods: {
supprimerRestaurant: function (r) {
//this.restaurants.splice(index, 1);
// each elem of the array has a .key property generated by vue-fire
restaurantsRef.child(r['.key']).remove();

},
ajouterRestaurant: function () {
let nouveauRestaurant = {
nom:this.nom,
cuisine:this.cuisine,
id:_.uniqueId("restaurant_")
}

restaurantsRef.push(nouveauRestaurant);

// on remet à zéro les champs
this.nom = "";
this.cuisine = "";
}
}
});

Notez l'apparition d'une propriété "firebase" dans la l'objet passé en paramètre à la Vue. On travaillera dans le template HTML avec la propriété/modèle "restaurants" et dans le code JS sur la variable restaurantsRef qui correspond à la BD distance. Voir documentation de vue-fire pour plus de détails : https://github.com/vuejs/vuefire

Séance 2: composants customs, développement en mode CLI

Nous avons vu des "Vues" (parties HTML "augmentées"), mais tous les frameworks modernes introduisent la notion de "composant".

Examinons un exemple simple sur JsBin (une liste de hobbies). On peut ajouter des hobbies ou cliquer sur un hobby pour le supprimer. C'est très proche de ce qu'on avait fait avec des restaurants lors de la première séance.

Et voici l'exemple avec un composant custom pour modéliser un hobby.

Et bien, on peut aller plus loin en commençant à "découper" l'application en "composants" réutilisables. Un composant est associé à un élément HTML "custom", par exemple <app-hobby name="tennis">. On rajoute toujours un "-" dans le nom des éléments HTML custom pour les distinguer des éléments standards HTML5. 

Chaque composant aura son propre template HTML, ses propres "modèles", ses propres méthodes, mais il peut en plus avoir des "props", c'est-à-dire des "modèles" construits à partir des valeurs des attributs HTML passés en paramètre.

Exemple : <app-hobby name="Jeux Vidéo"></app-hobby>

Voici un exemple de déclaration:

déclaration composant

 Dans de gros projets, on mettra les différents composants dans des fichiers différents. On ne travaillera plus en mode "déclaratif" mais en mode "CLI" (command line interface).

Développer en mode "CLI" avec un environnement de build/testy   

Cette fois-ci, pour terminer l'introduction à VueJS, le plus élégant/simple des trois gros frameworks "industriels" modernes (React, VueJS, Angular), nous allons regarder comment on peut développer avec "un environnement de développement", qu'on appelle "CLI" pour "Command Line Environment". 

Les trois frameworks cités, mais aussi Polymer dont on vient de parler, proposent un environnement "CLI".

Travail à faire :

  1. Installer Vue-cli: exécuter "npm install -g vue-cli", si vous êtes sous Linux ou Mac OS, il se peut que vous deviez faire "sudo npm install -g vue-cli" (essayez d'abord sans le sudo).

    Idem, sous windows il se peut que vous deviez avoir ouvert le terminal DOS en mode "administrateur".
     
  2. Créez un répertoire pour le TP
     
  3. Allez dans ce répertoire en mode ligne de commande, depuis votre terminal
     
  4. On va maintenant créer une application VueJS avec le mode "webpack-simple" (cf la page de doc: https://github.com/vuejs/vue-cli), on peut en effet créer plusieurs types de projets avec vue-cli.

    La commande à exécuter est "vue init webpack-simple nom_de_votre_app", je suggère quelques chose comme nom qui ressemble à "my-app-vue-cli1" par exemple. Vous exécuterez donc la commande : "vue init webpack-simple my-app-vue-cli1"

    Vous devrez alors répondre à un petit questionnaire, en général vous faites "enter", répondez "non" si on vous demande d'utiliser "SAAS" (un pré-processeur CSS comme LESS).

    Cela va créer un sous-répertoire my-app-vue-cli qui contiendra tout ce qu'il faut pour démarrer :
    • Une application exemple,
    • un environnement de développement,
    • Des fichiers de configuration pour webpack etc.
       
  5. Allez dans le répertoire de l'application et faites "npm install" pour installer les dépendances (de l'environnement de développement, et du framework)

     
  6. Exécutez l'application de test avec "npm run dev". Si jamais vous avez une page qui affiche "ERR EMPTY RESPONSE", il se peut que vous deviez changer le port du serveur de dev. Allez dans le fichier webpack.config.js et ajoutez une ligne "port:3000" par exemple, dans la config du devserver. 

    Voici ce que j'ai dans ma config:

    devServer: {
        historyApiFallback: true,
        noInfo: true,
        overlay: true,
        port:3000
    },
     
  7. Etudier le code du fichier main.js, index.html et App.vue

  8. Créer dans src/components (vous créerez ce dossier) un composant User.vue qui affiche le nom d'un utilisateur
    Ici un exemple de code: User.vue

  9. Créer un composant Info.vue qui affiche juste des infos supplémentaires sous forme de <p>, et qui soit LOCAL à User.vue (voir Live Coding) (vous le déclarerez dans un champ "components" de User.vue. Pensez à importer Info.vue dans User.vue

  10. Déclarez User comme composanrt global dans le main.js, il sera ainsi utilisable partout, dans n'importe quel fichier .vue

  11. Ajoutez <app-user></app-user> dans App.vue, pensez à faire un import de User.vue dans App.vue

  12. Essayez d'ajouter le support pour <app-user nom="Michel"></app-user> par exemple, en déclarant une prop "nom" dans User.vue
     
  13. En étant sûr d'être dans le répertoire du projet faites "npm install -save vue-router" pour installer le module de routage de vueJS.

  14. Dans main.js ajoutez les lignes relatives au routeur (import, Vue.use, définition des routes, etc.) pour que le fichier ressemble à ceci :
    import Vue from 'vue';
    import VueRouter from 'vue-router';
    import App from './App.vue';
    import User from './components/User.vue';
    import Blog from './components/Blog.vue';
    import Compte from './components/Compte.vue';

    // Définition des routes
    Vue.use(VueRouter);

    const routes = [
        {path:'/blog', component: Blog},
        {path:'/compte', component: Compte},
        {path:'/', component: User},
    ]

    const router = new VueRouter({
        routes: routes,
        mode:'history'
    })
    // La ligne ci-dessous rend le composant User utilisable
    // partout, dans tous les fichiers .vue
    // C'est un GLOBAL COMPONENT
    Vue.component("app-user", User);

    new Vue({
    el: '#app',
    router:router,
    render: h => h(App)
    })
  15. Remplacez le template de App.vue par le code suivant et testez:
<template>
  <div id="app">
    Hello {{msg}}

    <div>
      <router-link to="/">Home</router-link>
      <router-link to="/blog">Blog</router-link>
      <router-link to="/compte">compte</router-link>
    </div>

    <router-view></router-view>

    <app-user></app-user>
      <p>Ceci est un test</p>
  </div>
</template>

Correction de l'exercice: live conding...

Séance 3 : introduction à React, quelques infos sur le cloud...

Support de cours React

Exercices d'introduction, dans une IDE en ligne

On peut faire du react dans JsBin/JsFiddle/CodePen, mais croyez-moi, juste pour de petits exemples !

Exercice à faire en vous aidant des exercices précédents:

Pour vous donner une idée du résultat attendu,voici l'équivalent en VueJS: http://jsbin.com/guwetoy/1/edit?html,output

Je conseille de partir de cet exemple React: le composant en classe ES6

En vous aidant de l'exemple fait en classe en live coding, voud devrez faire incrémentalement, en testant après chaque étape :

  1. Créez un <div> et affichez dedans un composant Root avec React (l'App des exemples)
     
  2. Affichez un tableau de hobbies dans ce <div> (foot, tennis, jeux video, etc.) sous la forme d'une liste. Chaque hobby sera un <li>. Vous fournirez des hobbies par défaut.
     
  3. Ajoutez un bouton 'Nouveau Hobby' et un champ input pour saisir le nom du hobbie à rajouter. La liste doit se mettre à jour.
     
  4. Rendez les hobbies clickables pour qu'on puisse les supprimer
     
  5. Un message <p>Hobby supprimé !</p> devra apparaitre lorsqu'un hobby est supprimé
     
  6. Ajoutez un compteur de hobbies (<p>Hobbies: 4</p>) au-dessus de la liste des hobbies, qui indiquera le nombre de hobbies dans la liste.
     
  7. Vous changerez les styles CSS des éléments de la liste pour qu'ils s'affichent en rouge et vert à chaque ligne, en alternance. Vous utiliserez aussi des classes CSS dynamiques pour afficher le compteur en rouge si le nombre de hobbies est supérieur à trois, en vert sinon. 
     
  8. Chaque <li>, chaque hobby, sera maintenant dans un composant <Hobby/> 

ICI UNE CORRECTIONhttps://codepen.io/w3devcampus/pen/b...m?editors=1010

Exercices avec un environnement "CLI"

Si on va voir la page de facebook sur "how to start with React", il y a un chapitre qui concerne le mode "CLI": https://reactjs.org/docs/add-react-to-a-new-app.html

  1. Vous devez avoir nodeJS correctement installé (node, npm, etc, tout ceci doit fonctionner...)
     
  2. Installez l'extension Google Chrome "React Developer Tools" (https://chrome.google.com/webstore/d...jfkapdkoienihi), elle existe aussi pour Firefox.
     
  3. Installez une bonne fenêtre terminal pour Windows -si vous êtes sous windows comme http://cmder.net/ ou autre (github bash, etc.) si je vous vois avec une fenêtre DOS basique vous allez m'entendre !
     
  4. Installer les packages "babel" et "emmet" si vous êtres sous Sublime Text 3 ou Atom. Ca doit etre ok pour Visual Studio Code, WebStorm etc.
     
  5. Ouvrir la ligne de commande et exécuter la commande "npm install -g create-react-app",
    • Pour vérifier que ça fonctionne, créez un autre répertoire nommé "react_cli" et cd dedans,
    • Executez "create-react-app hello-world" (ça prend du temps, quelques minutes)...
    • Allez dans le répertoire créé (cd hello-world), et faites "npm install" (là aussi, quelques minutes)
    • Exécutez le progralle en tapant "npm start", ça doit ouvrir automatiquement le browser sur le port 3000 et afficher une page avec le logo React qui tourne.
    • Editez le code du fichier src/App.js, changez le texte et sauvez -> la page Web de l'application doit se rafraichir automatiquement.
       
  6. Maintenant on va étudier le code, regardez les fichiers html, js, les configs etc.
     
  7. Essayez de modifier la partie "render" de App.js... hmmm ok. Bon, on va faire un simple composant <Username name="toto"/> qu'on va mettre dans un sous répertoire "components" dans les sources, il va simplement afficher un nom passé en attribut/props dans un paragraphe en couleur. Vous ajouterez dans <App/> Plusieurs instances de ce composant.

Exercice: refaire dans le projet les hobbies en mode CLI !

Séance 4 : utilisation de données d'un WebService RESTFUL en Ajax avec l'API standard du W3C fetch, hébergement dans le cloud, utilisation via React

Support de cours

Etude d'un Client et d'un serveur REST

  1. Jouez avec l'application suivante : https://restaurantscloud.herokuapp.com/ l'application est sur le cloud heroku et la base de données sur le cloud mlabs.com. Vous verrez comment on peut faire ce type d'hébergement...

L'pplication est une application qui contient du code backend NodeJS/Express mais aussi du code front-end écrit en pur vanilla JS, et qui montre des cas typiques de consommation de WebService RESTful en consultation (GET), insertion (POST), modification (PUT) et suppression (DELETE) à l'aide du protocole HTTP et de l'API Ajax fetch aujourd'hui présente en standard dans tous vos navigateurs.

Etudiez le code source

Récupérez le code source ici HEROKU_simple.zip, vous n'avez pas besoin de l'exécuter puisque cette application est déjà déployée sur Heroku.

  • Etudiez le code client (index.html et script.js). Où sont les requêtes Ajax ?
  • Etudiez le code serveur. Où sont les WebServices ? Où se trouve le code qui utilise la base de données ?

OPTIONNEL : déployer ce code localement.

  1. Le code utilise une collection de restaurants prises dans les tutoriaux de mongoDB. Vous pouvez récupérer cette collection et l'insérer dans votre MongoDB local en téléchargant cette archive  primer-dataset.jsonet en l'important dans votre mongoDB local soir à l'aide de la ligne de commande ci-dessous, soit avec l'aide d'un outil d'administration pour MongoDB tel que Compass, 3T Studio, RoboMongo etc. 

    mongoimport --db test --collection restaurants --drop --file primer-dataset.json
  2. Allez dans le répertoire où vous avez dézippé HEROKU_simple.zip, faites "npm install" puis "node serverCrudWithMongo.js" ou "npm start". Si ça ne marche pas, c'est que le wifi de la fac ne vous laisse pas accèder à mongoDB dans le cloud (regardez dans le source l'URL de la BD !). Donc soit vous utilisez un VPN, soit votre tel en partage de connexion, soit changez l'URL de la base mongoDB dans le bon fichier pour utiliser non pas la base dans le cloud mais votre base local (dans : app_modules/crud-mongo.js)

Déploiement d'une application dans le cloud Heroku

  • Déployer une BD MongoDB sur mlabs.com : regardez cette vidéo : https://www.youtube.com/watch?v=GDqtv1eGGpA

    Allez, allez, n'ayez pas peur, déployez donc la BD des restaurants sur mlabs.com ! Une fois que c'est fait, essayez d'y accéder à l'aide d'un outil d'administration. Si ça ne marche pas il se peut que le wifi de l'EPU ne laisse pas passer les ports. Essayez avec un VPN ou si vous n'en avez pas, en partage de connection 4G.
     
  • Déployer ensuite l'application client Heroku.com (changez l'URL de la BD):  regardez cette vidéo : https://www.youtube.com/watch?v=MxfxiR8TVNU

Reprendre l'application react sur les hobbies de la semaine dernière, faites la marcher avec les restaurants

ou bien modifiez votre propre application, pour non pas afficher des hobbies à partir de données en ligne, mais des restaurants (affichez juste les noms et les cuisines par exemple). Bien sûr vous utiliserez les données du web service que vous venez tout juste de déployer dans le cloud !

Imaginez comment vous pourriez ajouter ou modifier ou supprimer un restaurant à partir de cette application.

Vous pouvre regarder le code de cette application faite par un étudiant (attention, fonctionne avec une BD et des WebServices tournant en local, vous aurez peut-être besoin de modifier l'URL de la BD MongoDB pour que ça marche):  Project_react.zip 

Plus difficile : héberger votre application React sur Heroku

Mais non, c'est hyper facile! Cherchez donc sur Google! S'il y a bien un framework supporté day one par Heroku, c'est bien React ! 

Séance 5 : Introduction à Angular 7

Supports de cours :

  • Aller voir le prof avec une clé USB et 900Mo de libres au moins...

1 : création d'une application "squelette"

  1. Installer angular-cli : dans une fenêtre de terminal, tapez la commande "npm install -g @angular/cli" (éventuellement avec "sudo" avant si vous êtes sous Linux ou Mac OS)

  2. Créez un répertoire "exo1Angular" et faites cd dans ce répertoire,
  3. Générez une application "squelette" angular en tapant la commande "ng new angular-framework-intro"
  4. Faites cd angular-framework-intro et ouvrez visual studio code sur ce répertoire (commande "code ." sur Mac)
  5. Faites npm install pour installer les modules nécessaires (pour l'application et pour l'environnement de développement)
  6. Exécutez le projet en lançant la commande ng serve --open dans le répertoire
  7. Ok, maintenant faites "view source" sur la page, que remarquez-vous ? Comparez avec React et VueJS... Qu'en déduisez-vous ? A propos, est-ce qu'on a installé une extension dans le browser ?
  8. Etudions maintenant la structure du projet....

2 : affichage d'une liste d'éléments

  1. Regardez le fichier index.html, remarquez l'élément <app-root></app-root>, est-ce du HTML standard ?
  2. Regardez les fichiers src/app.component.tssrc/app.component.html et src/app.component.css
  3. Modifiez le fichier de templates app.components.html et faites ctrl-s,
  4. Regardez le fichier app.module.ts, Angular va vous obliger à mettre à jour ce fichier très régulièrement.
  5. Maintenant on va effacer le contenu du fichier de template, et on va essayer d'afficher une liste d'éléments : CA SE PASSE EN LIVE CODING (une correction sera postée ici à la fin), utilisation de *ngFor (<li *ngFor="let el of elements">...</li> si elements est la propriété du composant -un tableau de chaines de caractères-), un peu l'équivalent du v-for de VueJS.
  6. Ajout d'un bouton pour ajouter un nouvel élément, utilisation de (click)="expression" comme attribut,
  7. Regardons comment afficher une ligne verte, une ligne rouge, etc. Utilisation de [ngStyle]="{propriété CSS : expression}", écrire une fonction getColor(element) comme dans les exemples qu'on avait fait avec VueJS et React, et l'appeler dans l'expression).

: création d'un nouveau composant

  • On va créer "manuellement" un nouveau composant intitulé "username", qui sera juste un<li> qui affichera la valeur de la propriété username. Pour cela, créer le fichier "app/username.component.ts, et il doit ressembler à cela.
    REMARQUE: vous pouvez utiliser la ligne de commande pour ajouter un nouveau composant: 

    > ng generate component username

import { Component, Input } from "@angular/core";

@Component ({
    selector: 'app-username',
    template:`
    <p>{{username}}</p>
    `
})

export class UsernameComponent {
    @Input() username :string;
}

Remarquez qu'on n'a pas utilisé ici de template html séparé, à la place on a mis le template directement sous forme de chaine de caractère entre les caractères `....`

Le @Input sert à définir une propriété qu'on pourra passer via des attributs HTML, c'est l'équivalent des "props" de VueJS et de React.

Maintenant, ajoutez des instances de ce composant dans le template app.components.html:

<app-username [username]="'Michel'"></app-username>

<app-username [username]="'John'"></app-username>

Regardez ce que cela donne.... rien, ouvrez la console de debug...

C'est normal, il faut déclarer le composant dans le fichier app.module.ts (c'est pénible... mais vous verrez qu'on peut automatiser cela en créant les composants avec la ligne de commande)... Ajoutez le composant dans app.module.ts et cela devrait fonctionner.

Maintenant on veut pouvoir cliquer sur un nom et afficher un message dans le template du composant principal. On va faire comme en VueJS : envoyer un événement quand on clique sur le nom.

4 : définition d'un événement qui sera envoyé du composant "fils" vers le composant "père"

  1. Dans le composant (app/username/username.component.ts), définir un événement comme ceci: 
export class UsernameComponent {
    @Input() username :string;
    @Output() userClicked = new EventEmitter<string>(); // définition d'un événement

    onUsernameClicked() {
        this.userClicked.emit(this.username);            // émission de l'événément
    }
}

Et dans le template (app/username/username.component.ts) :

    template:`
       <p (click)="onUsernameClicked()">{{username}}</p>
    `

Ainsi, dans le template du composant (app.component.html) qui instancie ce composant, on pourra écouter l'événement "userClicked" :

<app-username [username]="'Michel1'" (userClicked)="onUserWasClicked($event)"></app-username>
<app-username [username]="'John'"    (userClicked)="onUserWasClicked($event)"></app-username>

Et maintenant on peut écrire la méthode onUserWasClicked(username) dans app.component.ts :

onUserWasClicked(username: string) {
    alert(username);
}

Testez l'application : en cliquant sur un nom, ça doit afficher une alerte avec la valeur associée.

5 : binding bi-directionnel avec [(ngModel)]="nom"

  • Définissez un champs de saisie dans le template pour une propriété "nom" que vous ajouterez dans le fichier .ts de app.component.ts
  • Dans le template, affichez la valeur de cette propriété en-dessous du champs de saisie. 
  • Tapez quelque chose dans le champ de saisie
  • Plus simple qu'en React non ? Ca ressemble au v-model de VueJS non ?

ICI UNE CORRECTION DES ETAPES PRECEDENTES (exemple fait en live). Dezippez, cd dans le repertoire, npm install puis ng serve --open

6 : refaire l'exemple des hobbies complet, mais en angular

 En vous aidant de l'exemple précédent : 

  1. Dans le composant app.component (.ts/html/), définissez un tableau de hobbies et affichez-les dans une liste (fournissez quelques hobbies par défaut)
     
  2. Ajoutez un bouton 'Nouveau Hobby'  + un champ <input>. Quand on clique le bouton on ajoutera le hobby et la vue se mettra à jour
     
  3. Rendez chaque hobby clickable. Si on clique un hobby on le supprime 
     
  4. Faites apparaitre un message <p>Hobby supprimé! dans un </p> qui ne sera visible que lorsque au moins un hobby a été supprimé (soyez créatifs! Il y a plusieurs manières de faire)
     
  5. Ajouter un compteur de hobbies (<p>Nombre de Hobbies: ...</p>) au-dessus de la liste des hobbies
     
  6. Changez le style CSS du compteur, selon sa valeur: vert si moins de 3 hobbies, rouge sinon
     
  7. Transformez les éléments <li> en un composant réutilisable <app-hobby>
     
  8. On veut remplir les hobbies au démarrage de l'application en récupérant les hobbies au format JSON sur l'URL : https://my-json-server.typicode.com/...ffa/hobbies/db (au passage, j'ai utilisé les services de jsonplaceholder.typicode.com pour servir un fichier json qui se trouve sur un de mes repository github). LIVE CODING AVEC LE PROF pour voir comment créer un service
    • Commande pour créer un service : "ng generate service hobby" (va créer le fichier hobby.service.ts et le fichier pour les tests)
    • Correction de cet exercice

Exemples d'applications prêtes à déployer sur Heroku (regardez les README.txt pour les explications)

Note, lisez les README.txt qui sont dans les archives suivantes.

Pour fonctionner sur Heroku, un projet doit :

  1. Heroku ne sait pas servir de pages statiques, donc si projet vue ou angular, il faut embarquer express et un server.js minimal qui va lancer la page index.html
  2. Se compiler en mode "build" (et pas "dev") une fois sur heroku. Pour cela il faut un script "postinstall" dans package.json
    1. Et donc avoir les bonnes "dependencies" dans le package.json
    2. TESTEZ VOTRE PROJET EN LOCAL EN MODE BUILD AVANT DE DEPLOYER SUR HEROKU
  3. Pouvoir se lancer par "npm start", il faut un script "start" dans package.json

Exemples de projets qui marchent et qui sont prêts à être déployés sur Heroku. Lisez les READMEs inclus !

 

Mots clés:
FichierTailleDateAttaché par 
 HEROKU_angular.zip
Aucune description
1637.21 Ko09:23, 24 Jan 2019MichelBuffaActions
 HEROKU_REACT.zip
Aucune description
328.8 Ko09:23, 24 Jan 2019MichelBuffaActions
 HEROKU_simple.zip
Aucune description
3.54 Mo18:19, 23 Jan 2019MichelBuffaActions
 HEROKU_VUEJS.zip
Aucune description
450.39 Ko09:22, 24 Jan 2019MichelBuffaActions
 primer-dataset.json
Aucune description
11.32 Mo18:41, 23 Jan 2019MichelBuffaActions
 Project_react.zip
Aucune description
570.74 Ko21:57, 23 Jan 2019MichelBuffaActions
 SupportCours2.zip
Aucune description
4.14 Mo06:10, 10 Jan 2019MichelBuffaActions
 SupportsDeCoursReactRedux.zip
Aucune description
2.18 Mo18:29, 16 Jan 2019MichelBuffaActions
Images (1)
Voir 1 - 1 sur 1 images | Voir tout
Aucune description
Img1.jpg  Actions
Commentaires (0)
Vous devez être connecté pour poster un commentaire.