Retour d'expérience sur les solutions HTML5 permettant de réaliser des applications web accessibles hors connexion.
Session présentée au Google Devfest Nantes 2012
© SQLI GROUP – 2012DÉCONNECTER SON APPLICATION WEB
View Slide
POSSIBILITÉS 4CACHE APPLICATIF 9STOCKAGE DES DONNÉES 21EN LIGNE OU HORS LIGNE ? 33CONCLUSION 39
© SQLI GROUP – 2012 4EXEMPLESPOSSIBILITÉSGMAIL MOBILE LINKEDIN MOBILE LANYRD MOBILE
© SQLI GROUP – 2012POSSIBILITÉS+TOLÉRER LES COUPURES OU L'ABSENCE DE CONNEXION+MISE À JOUR DE L’APPLICATION WEB SEULEMENT SI NÉCESSAIRE+OPTIMISATION DU RAFRAICHISSEMENT DES DONNÉES+SAISIE HORS-LIGNE ET SYNCHRONISATION ULTÉRIEURE5OBJECTIFS
© SQLI GROUP – 2012POSSIBILITÉS+CONSERVER LOCALEMENT L'APPLICATION WEB+STOCKER LOCALEMENT LES DONNÉES MANIPULÉES+CONNAÎTRE L'ÉTAT DE LA CONNEXION+SYNCHRONISER LES DONNÉES AVEC LE SERVEUR6PROBLÉMATIQUES
© SQLI GROUP – 2012POSSIBILITÉS7INGRÉDIENTS+APPLICATION CACHE+CLIENT-SIDE STORAGE+NAVIGATOR.ONLINE
© SQLI GROUP – 2012CACHE APPLICATIF+MISE EN CACHE DES RESSOURCES STATIQUESCACHE MAITRISÉ ET PERSISTANTINTÉRÊT MÊME CONNECTÉ :• AMÉLIORATION DES PERFORMANCES• DIMINUTION DE LA CHARGE SERVEURSUPPORT :9HTML5 APPLICATION CACHE
© SQLI GROUP – 2012CACHE APPLICATIF10APERÇUCACHE MANIFEST# 2012-08-22: v2CACHE:favicon.icoscript.jsstylesheet.cssNETWORK:*FALLBACK:/online /offline.htmlmon-appli.appcache...index.html+A SERVIR AVEC LE TYPE MIME :text/cache-manifest+ET LE HEADER :cache-control: no-cache
© SQLI GROUP – 2012CACHE APPLICATIF+LES PAGES SPÉCIFIANT LE MANIFEST SONT CACHÉESAUTOMATIQUEMENT+NE PAS DÉCLARER LE MANIFEST LUI-MÊME…11SECTION CACHECACHE MANIFESTCACHE:scripts/app.jslib/jquery-1.8.2.min.jsstyles/layout.cssimages/sqli-logo.png
© SQLI GROUP – 2012CACHE APPLICATIF12SECTION NETWORKCACHE MANIFESTNETWORK:*+LISTE DES RESSOURCES À TÉLÉCHARGER DEPUIS LE SERVEUR+TOUTE RESSOURCE NON MISE EN CACHE NE SERA PAS CHARGÉEWILDCARD ( * ) FORTEMENT RECOMMANDÉ
© SQLI GROUP – 2012CACHE APPLICATIF+PAIRES D’URL+RESSOURCES DE REMPLACEMENT EN CAS D’INDISPONIBILITÉ13SECTION FALLBACKCACHE MANIFESTFALLBACK:/img/profiles/ /imgs/profiles/placeholder.png*.html /fallback.html
© SQLI GROUP – 2012CACHE APPLICATIF+LE CACHE APPLICATIF NE SE MET À JOUR QUE SI LE FICHIERMANIFEST ÉVOLUE+MISE À JOUR DES RESSOURCES RÉFÉRENCÉES ?MAINTENIR UN NUMÉRO DE VERSION DANS UN COMMENTAIRE14COMPORTEMENTCACHE MANIFEST# 2012-08-22: v2
© SQLI GROUP – 2012CACHE APPLICATIF+LE TÉLÉCHARGEMENT S’EFFECTUE EN ARRIÈRE PLAN+ÉVÉNEMENTS DE SUIVICHECKING, NOUPDATE, DOWNLOADING, PROGRESS, UPDATEREADY...+LA MISE À JOUR DU CACHE N’EST EFFECTIVE QU’À PARTIR DE LASECONDE VISITE…15PRINCIPE DE MISE À JOUR
© SQLI GROUP – 2012+PRISE EN COMPTE IMMÉDIATE D’UNE NOUVELLE VERSION16FORCER LA MISE À JOURCACHE APPLICATIF// application cache updatingwindow.applicationCache.addEventListener("updateready", function(e) {if (window.applicationCache.status === window.applicationCache.UPDATEREADY) {// An update is available: swap and reloadwindow.applicationCache.swapCache();if (confirm("An update of the application is available.\nDownload it now ?")) {window.location.reload();}}});
© SQLI GROUP – 2012CACHE APPLICATIF+A LA MAIN+VIA MODERNIZR17DÉTECTIONfunction isAppCacheSupported() {return !!window.applicationCache;}if (Modernizr.applicationcache) {// supporté} else {// non supporté}
© SQLI GROUP – 2012CACHE APPLICATIF+GÉNÉRATIONHTTP://WESTCIV.COM/TOOLS/MANIFESTRHTTP://MANIFESTED.DREGSOFT.COMHTTPS://GITHUB.COM/JAMESGPEARCE/CONFESS+VALIDATIONHTTP://MANIFEST-VALIDATOR.COM18OUTILS
© SQLI GROUP – 2012CACHE APPLICATIF+FIREFOX : about:cache?device=offline+CHROME : chrome://appcache-internals19OUTILS
© SQLI GROUP – 2012STOCKAGE DES DONNÉES+STANDARDISATION+PERSISTANCE+CLOISONNEMENT PAR ORIGINE•protocole + sous-domaine + domaine + port21HTML5
© SQLI GROUP – 2012STOCKAGE DES DONNÉES+FILE SYSTEM API+WEB SQL DATABASE+INDEXED DB+WEB STORAGE22L’EMBARRAS DU CHOIX
© SQLI GROUP – 2012STOCKAGE DES DONNÉES+LECTURE / ÉCRITURE DE FICHIERS ET DOSSIERS•FileReader, FileWriter- ENCORE PEU RÉPANDU :- PEU APPROPRIÉ À NOTRE BESOIN23FILE SYSTEM API
© SQLI GROUP – 2012STOCKAGE DES DONNÉES+BASE DE DONNÉES RELATIONNELLE ET TRANSACTIONNELLE- SUPPORT :- SPÉCIFICATION STOPPÉE LE 18 NOVEMBRE 201024WEB SQL DATABASE
© SQLI GROUP – 2012STOCKAGE DES DONNÉES+STOCKAGE DE TYPE NOSQL+ASYNCHRONE+TRANSACTIONNEL+ADAPTÉ AUX GROS VOLUMES DE DONNÉES•Recherche, indexation- VERBEUX- SUPPORT :25INDEXED DB
© SQLI GROUP – 2012STOCKAGE DES DONNÉES+STOCKAGE DE TYPE CLÉ-VALEURSESSION DE NAVIGATION : SESSION STORAGEPERSISTANT : LOCAL STORAGE+SIMPLE D’UTILISATION+DISPONIBILITÉ :- SYNCHRONE- CHAINES DE CARACTÈRES UNIQUEMENT- NON DESTINÉ À ÊTRE RECHERCHÉ26WEB STORAGE
© SQLI GROUP – 2012STOCKAGE DES DONNÉESlocalStorage.setItem(key, value)localStorage.getItem(key)localStorage.removeItem(key)localStorage.lengthlocalStorage.key(index)localStorage.clear()27LOCAL STORAGE : UTILISATION
© SQLI GROUP – 2012STOCKAGE DES DONNÉES28LOCAL STORAGE : STOCKER DES OBJETS+EXTENSION DE L’OBJET STORAGE+ABSTRACTIONSStorage.prototype.setObject = Storage.prototype.setObject || function(key, value) {this.setItem(key, JSON.stringify(value));};Storage.prototype.getObject = Storage.prototype.getObject || function(key) {var value = this.getItem(key);return value && JSON.parse(value);};
© SQLI GROUP – 2012STOCKAGE DES DONNÉES+A LA MAIN+VIA MODERNIZR29LOCAL STORAGE : DÉTECTIONfunction islocalStorageSupported() {try {return 'localStorage' in window && window['localStorage'] !== null;} catch(e){return false;}}if (Modernizr.localstorage) {// supporté} else {// non supporté}
© SQLI GROUP – 2012STOCKAGE DES DONNÉES+FIREFOX (CONSOLE FIREBUG)+CHROME30LOCAL STORAGE : OUTILS
© SQLI GROUP – 2012STOCKAGE DES DONNÉES+CACHE DE DONNÉES LOCAL•MÉCANISMES CLASSIQUES DE MISE À JOURVÉRIFICATION PÉRIODIQUE SI DE NOUVELLES DONNÉES SONT DISPONIBLESLORSQUE LA DURÉE DE VIE DES DONNÉES LOCALES EST EXPIRÉE (TTL)+STOCKAGE TEMPORAIRE ET SYNCHRO ULTÉRIEURE•DÉFINITION DE STRATÉGIES DE SYNCHRONISATIONHORODATAGES, VERSIONINGID GÉNÉRÉ CÔTÉ CLIENT31PROBLÉMATIQUES DE SYNCHRONISATION
© SQLI GROUP – 2012EN LIGNE OU HORS LIGNE ?33SPÉCIFICATION HTML5if (navigator.onLine) {// je suis en ligne} else {// je suis hors ligne}window.addEventListener("online", function(e) {// je suis désormais en ligne}, false);window.addEventListener("offline", function(e) {// je suis désormais hors ligne}, false);+API SYMPATHIQUE MAIS…
© SQLI GROUP – 2012EN LIGNE OU HORS LIGNE ?+QUE SIGNIFIE « ÊTRE EN LIGNE » ?CONNECTÉ À UN RÉSEAU ?TRAVAILLER HORS CONNEXION ?+QUE DIT LA SPEC’ ?34PROBLEMATIQUE DE DÉTECTION
35http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#event-online
© SQLI GROUP – 2012EN LIGNE OU HORS LIGNE ?+MA WEB APP PEUT-ELLE COMMUNIQUER AVEC SON BACK-END ?PING DU SERVEURPÉRIODIQUEVIA AJAX36THE PRAGMATIC PROGRAMMER
© SQLI GROUP – 2012EN LIGNE OU HORS LIGNE ?37PLUGIN JQUERY SERVER OBSERVER+PERMET D'ÊTRE NOTIFIÉ DESCHANGEMENTS DE DISPONIBILITÉDU SERVEUR+ DEUX MÉCANISMES UTILISÉSPING PÉRIODIQUE DU SERVEURVIA UNE REQUÊTE HEADOBSERVATION DE LA RÉUSSITE(OU NON) DES REQUÊTES AJAXÉMISES PAR L’APPLICATIONhttps://github.com/antoine-richard/jquery-server-observer$.serverObserver.enable({url: "/ping",frequency: 5000,onServerOnline: function() {// the server is available},onServerOffline: function() {// the server is unavailable}});
© SQLI GROUP – 2012CONCLUSION39SCÉNARIO : APPLICATION WEB DE MISE EN RAYON POUR GRANDE SURFACEApplication prête. Sauvegarde automatique activéePlacement des produits téléchargé avec succèsTempsPlus tard, hors connexion,le chef de rayon modifiele placement des produitsLe serveur est accessibleUne fois la connexion retrouvée,la base de donnée serveurest mise à jourServeur non joignable, sauvegarde locale du rayonLe placement des produits est désormaissauvegardé sur le serveurRéouverture de l’applicationsuite à une batterie épuisée,toujours hors ligneServeur non joignable, chargement du rayon depuisla base localeServeur non joignable, sauvegarde locale du rayon←←←←←←
© SQLI GROUP – 2012CONCLUSION+UNE APPLICATION WEB DOIT POUVOIR SUPPORTER LES COUPURES DERÉSEAU ET ÊTRE UTILISABLE HORS LIGNE+UNE APPLICATION WEB PEUT OPTIMISER SES TÉLÉCHARGEMENTSAPPLICATIFS ET DE DONNÉES+HTML5 PERMET D’ADRESSER CES PROBLÉMATIQUESDÈS AUJOURD’HUI, GRÂCE À L’UTILISATION CONJOINTEDE CACHE APPLICATIF ET DE STOCKAGE CÔTÉ CLIENT40UN VRAI PLUS POUR LA MOBILITÉ
© SQLI GROUP – 2012CONCLUSION+WHATWG.ORG/SPECS/WEB-APPS/CURRENT-WORK/MULTIPAGE/OFFLINE.HTML+W3.ORG/TR/WEBSTORAGE+W3.ORG/TR/INDEXEDDB+APPCACHEFACTS.INFO+HTML5ROCKS.COM+DIVEINTOHTML5.INFO+CANIUSE.COM+MODERNIZR.COM41RESSOURCES
© SQLI GROUP – 2012@richard_antoine[email protected]