Vous n'êtes pas connecté. Connexion
|
|
MBDS Madagascar 2018-2019De $1Table des matières
IntroductionDans 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. 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):
TP 1 : Exercices avec VueJS, Firebase et WebServices RESTFULPartie 1 : Faire fonctionner l'exemple VueJS vu en classe, mais avec des fichiers et une table HTMLCeci 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 :
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
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:""
},
// from vue-firebase https://github.com/vuejs/vuefire
firebase: {
restaurants: restaurantsRef
},
methods: {
supprimerRestaurant: function (r) {
//this.restaurants.splice(index, 1);
// See documentation https://github.com/vuejs/vuefire
// 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: 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 :
<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... Recupérer des restaurants sur un Web Service RESTSupport de cours :
Ici vous avez des restaurants sous forme d'API: https://restaurantscloud.herokuapp.com/ Et là la "route" GET qui permet de récupérer les 10 premiers restaurants (il y en a plus de 25.000 dans la base de données distante) : https://restaurantscloud.herokuapp.c...pi/restaurants Et ici un petit exemple JsBin qui affiche les 10 premiers restaurants en utilisant le Web Service REST précédent: https://jsbin.com/peromol/edit?js,output Regardez le code pour comprendre l'utilisation du "cycle de vie d'un composant VueJS" et pour voir comment on utilise l'API fetch. Travail à faire : Modifier l'exemple compilé VueJS que vous venez de faire pour afficher des restaurants en provenance de ce Web Service, au lieu d'afficher des restaurants codés en dur. CORRECTION AVEC PAGINATION ET INSERTION: https://jsbin.com/peromol/edit?html,output Normalement vous avez fait votre propre correction avec des fichiers à compiler : Séance 3 : introduction à REACTSupport de cours React Exercices d'introduction, dans une IDE en ligneOn 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 :
Correction de cet exercice faite par les élyèves : https://codepen.io/miradoniaina/pen/...b?editors=0010 Séance 4 : React en mode CLISi 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 Travail à faire pour installer le mode CLI de React:
Exercice 1 : live coding de l'exemple des hobbies précédemment fait sur codepen (https://codepen.io/miradoniaina/pen/...b?editors=0010) mais en mode CLI
Exercice 2 : persistence des hobbies dans FireBase
ETAPE 1 : Il faut commencer par modifier l'exemple des hobbies pour qu'il fonctionne non pas avec un tableau mais avec un objet. Firebase ne sais synchroniser que des objets, pas des tableaux. On a déjà préparé le terrain avec le dernier exercice de la partie précédente. Dans App.js : this.state = { hobbies : { hobby0: 'tennis', hobby1: 'golf' } // ... }; Il faut modifier plusieurs parties du code en conséquence...
Ex de code: addHobby() {
/* OLD VERSION WITH ARRAY
const oldHobbies = this.state.hobbies;
this.setState({
hobbies: oldHobbies.concat(this.state.input),
input : ""
});
*/
// faire une copie de l'objet hobbies
const hobbies = {...this.state.hobbies};
// Ajouter le nouveau hobby
const timestamp = Date.now();
hobbies[`hobby-${timestamp}`] = this.input.value;
this.setState({hobbies});
console.log(this.state.hobbies)
}
removeHobby(key) {
/* OLD VERSION WITH ARRAYS
const oldHobbies = this.state.hobbies;
const position = oldHobbies.indexOf(hobby);
this.setState({
hobbies: oldHobbies.filter((el, index) => {
return (index !== position)
}),
hobbyWasDeleted : true
});
*/
// faire une copie de l'objet hobbies
const hobbies = {...this.state.hobbies};
// Supprime le hobby dont la cle key a ete passee en parametres
//delete hobbies[key]; // ne marche pas avec firebase
hobbies[key] = null;
// Mettre a jour l'etat
// En ES6 vous pouvez juste taper {'hobbies'} au lieu de {hobbies:hobbies}
this.setState({hobbies});
}
Et pour render, exemple d'iterateur sur un objet, comparer par rapport au code qui itere sur un tableau, dans les exemples vus precedemment: // iterateur sur les proprietes de l'objet
let list = Object.keys(this.state.hobbies).map((key, index) => {
// key = element courant (propriete courante de l'objet)
consthobby = this.state.hobbies[key];
const liStyle = {
backgroundColor:index % 2 === 0 ? 'lightpink' : 'red'
};
return <li key={key} style={liStyle} onClick={() => this.removeHobby(key)}>{hobby}</li>
});
ETAPE 2 : on va devoir, comme pour les exemples faits avec vueJS, utiliser le "cycle de vie" du composant (https://reactjs.org/docs/react-component.html#the-component-lifecycle), et charger des données distantes depuis FireBase quand le composant est "monté", et aussi fermer la connexion quand il est "démonté". On va pour cela définir les méthodes App.js : componentWillMount() { console.log("Will mount") // this runs right before the <App> is rendered } componentWillUnmount() { console.log("Will unmount") } Implémentez ces méthodes et vérifiez bien qu'elles sont appelées... ETAPE 3 : on va créer une base sur FireBase
ETAPE 4 : on ajoute au projet le code pour se connecter à la base: Dans votre projet, créez un fichier base.js, et mettez ceci dedans (attention a copier/coller depuis le site) import Rebase from 're-base'; const base = Rebase.createClass({ // copier les 3 premières lignes de VOTRE config de votre base !!! // NE PRENEZ PAS LES VALEURS QUI SONT ICI !!! apiKey: "AIzaSyCW_WJJb16YVDlsdsd9c0YNNGnfdssorzWGFRU2ScU", authDomain: "react-mbds-firebase.firebaseapp.com", databaseURL: "https://react-mbds-firebase.firebaseio.com" // pas de , à la fin }); export default base; ETAPE 5 : on ajoute le module npm re-base pour "parler à firebase" On ajoute une ligne à package.json pour installer la lib npm qui va bien: "dependencies": { "react": "^16.1.1", "react-dom": "^16.1.1", "react-scripts": "1.0.17", "re-base": "2.2.0"// -> ajouter cette ligne, mettez bien 2.2.0 ! }, Faites "npm install", ça va installer re-base dans node_modules ETAPE 6 : on va utiliser re-base pour synchroniser l'état du composant, c'est-à dire les hobbies: Dans App.js: .... import base from './base'; .... componentWillMount() { //alert("toto") // this runs right before the <App> is rendered this.ref = base.syncState("hobbies", { context: this, state: 'hobbies' }); } componentWillUnmount() { base.removeBinding(this.ref); } Etape 7 : testez ! Sauvez, testez. Ouvrez dans un onglet votre base et regardez les données en sync. Ouvrez deux onglets avec l'appli React, regardez... |
Powered by MindTouch Deki Open Source Edition v.8.08 |