SlideShare une entreprise Scribd logo
Stockage local dans les navigateurs
●   Olivier Thomas




●   CTO, Webtyss
●   othomas@webtyss.com
●   @webtyss
Pourquoi du stockage local ?
●   Des WebApps, pas de "simples" sites Web...
    ●   Proposer une expérience utilisateur identique, avec ou sans connexion


●   Indispensable pour rivaliser avec les applications natives

●   La gestion du offline, primordiale pour les applis mobiles
Les différents types de stockage
●   Stockage local de données utilisateurs
    ●   Cookies
    ●   Local Storage (également appelé Web Storage, HTML 5 Storage ou
        Dom Storage)
    ●   Web SQL Database (WebDB)
    ●   IndexedDB


●   Caching
    ●   Stockage de pages et ressources associées
Les challenges du stockage local
                      des données
●   De la capacité !

●   De la persistence, au-delà des refresh de page!

●   Une manipulation des données à la fois puissante et souple
    pour l'utilisateur

●   Laisser à l'utilisateur le libre choix sur les données à échanger
    avec le serveur
Cookies

●   Stockage de petites quantités d’informations sous un format
    clé/valeur

●   Cookies de sessions vs Cookies persistents
    ●   Utilisation de l’attribut “expires”


●   Max 4KB de données par cookie et 20 cookies par domaine

●   Les cookies transitent systématiquement entre le navigateur et
    le site --> overhead
Manipulation des cookies

●   Option 1 : Manipulation des cookies au niveau de l’enveloppe
    HTTP
    ●   Poser un cookie

    Set-Cookie : NOM=VALEUR; domain=NOM_DE_DOMAINE;
    expires=DATE

●   Option 2 : Manipulation des cookies au niveau javascript
    ●   Utilsation de l’objet document.cookie

    ●   var expire = new Date();
        var unAn = expire.getTime() + (365*24*60*60*1000);
        expire.setTime(unAN);
        document.cookie = "JDNCookie=Test; expires=" +
        expire.toGMTString();
Implémentation "Local Storage"

●   Stockage de données au format "Clé / Valeur"

●   Les avantages :

    ●   Un stockage réellement persistent


    ●   Une API très simple à utiliser


    ●   Mécanisme d'événements pour intercepter les modifications effectuées
        sur l'espace de stockage
Local Storage

●   Les limitations

    ●   Plus grande capacité de stockage que les cookies mais limitation à 5MB
        par domaine


    ●   Stockage de données de n'importe quel type mais sous forme de chaînes
        --> Sérialisation et Désérialisation nécessaires !


    ●   Un mode de stockage peu propice aux structures de données complexes
Local Storage - Code

●   L'accès au stockage local s'effectue par l'objet
    window.localStorage

●   Des méthodes simples de manipulation de données
    ●   clear()
    ●   getItem()
         ●  value = window.localStorage.getItem(key)
    ●   setItem()
         ● window.localStorage.setItem(key, value)
    ●   removeItem
    ●   Key
Local Storage - itération

Disponibilité d'une fonction 'length'


for (var i = 0; i < localStorage.length; i++) {
     var key = localStorage.key(i);
     var value = localStorage.getItem(key);
   }
Local Storage - Evénements

Ajout d'un listener sur l'événement 'storage'


window.addEventListener("storage", function(event) {
   var key = event.key;
   var newValue = event.newValue;
   var oldValue = event.oldValue;
   var url = event.url;
   var storageArea = event.storageArea;
   // handle the event
  });
Local Storage : détecter si la
               fonctionnalité est supportée
Manuellement ou via l'utilisation de script spécialisé (ex:
 Modernizr)


if (Modernizr.localstorage) {
      // window.localStorage is available!
    } else {
      // no native support for local storage :(
    }
Local Storage - Navigateurs
                         supportés




●   Local Storage est aujourd'hui supporté par l'ensemble des
    navigateurs fixes et mobiles.
Web SQL Database

●   Toute la puissance (et les inconvénients) d'une base de
    données relationnelle dans le navigateur

●   Taille de stockage bien supérieure à 5MB (potentiellement
    jusqu'à 1GB)

●   La plupart des implémentations reposent sur SQLLite

●   Implémentation supportée par les navigateurs mobiles
WebSQL - Normalisation
Web SQL Database - Ouverture de
                   BDD
var db = window.openDatabase(
  "MyDB",
  "",
  "My super database",
  1024);
Web SQL Database
                                Vérification de la version
Gérer les versions de la base et la création des tables
if (db.version != "1") {
             db.changeVersion(db.version, "1", function(tx) {
             // User's first visit. Initialize database.
                var tables = [
                           { name: "users", columns: ["id INTEGER PRIMARY KEY", "name TEXT"]},
                           { name: "groups", columns: ["id INTEGER PRIMARY KEY", "name TEXT"]},
                           { name: "users_groups", columns: ["userId INTEGER", "groupId INTEGER", date TEXT"]}
                ];

                for (var index = 0; index < tables.length; index++) {
                           var table = tables[index];
                           tx.executeSql("CREATE TABLE " + table.name + "(" + table.columns.join(", ") + ");");
                }

                }, null, function() {loadData(db);}
           );
}else {
           // User has been here before, no initialization required.
           loadData(db);
}
WebDatabase : insertion de
                           données
db.transaction(function(tx) {
  for (var index = 0; index < myTable.length; index++) {
    var myValue = myTable[index];
    tx.executeSql("INSERT INTO users (name) VALUES (:name);", [myValue],
           function(tx, results) {
                     // Do something here after the insert
            });
  }
});
WebDatabase : lecture
                   d'enregistrements

db.readTransaction(
        function(tx) {
                  tx.executeSql("SELECT * FROM users",
                  function(tx, results) {
                            var rows = results.rows;
                            for (var index = 0; index < rows.length; index++) {
                                       var item = rows.item(index);
                                       var element = document.createElement("div");
                                       element.textContent = item.name;

         document.getElementById("usersList").appendChild(element);
                         }
                });
         }
);
WebDatabase : support des
                 navigateurs




●   Fonctionnalité non supportée par Firefox

●   A venir dans IE
IndexedDB

●   Une alternative à WebDB avec les mêmes objectifs : fournir une
    solution de stockage local avancé pour les applications HTML5

●   Repose sur une implémentation "NoSQL" basée sur un concept
    de "DataStore"

●   L'ensemble des accès est asynchrone
IndexedDB - Code

Ouverture de la base et vérification de la version
var request = window.indexedDB.open("MyDB“, "My great database");
request.onsuccess = function(event) {
              var db = event.result;
              if (db.version != "1") {
                             // User's first visit, initialize database.
                             var createdObjectStoreCount = 0;
                             var objectStores = [
                                             { name: "users", keyPath: "id", autoIncrement: true },
                                             { name: "groups", keyPath: "id", autoIncrement: true },
                                             { name: "users_groups", keyPath: "", autoIncrement: true } ];

                            function objectStoreCreated(event) {
                                          if (++createdObjectStoreCount == objectStores.length) {
                                                        db.setVersion("1").onsuccess = function(event) { loadData(db);};
                                          }
                            }

                            for (var index = 0; index < objectStores.length; index++) {
                                           var params = objectStores[index];
                                           request = db.createObjectStore(params.name, params.keyPath, params.autoIncrement);
                                           request.onsuccess = objectStoreCreated;
                            }
              } else {
                            loadData(db);
              }
};
IndexedDB : insertion de données


var request = window.indexedDB.open("MyDB", "My great database");
request.onsuccess = function(event) {
           var objectStore = event.result.objectStore("users");
           for (var index = 0; index < users.length; index++) {
                      var user = users[index];
                      objectStore.add(user).onsuccess = function(event) {
                                 document.getElementById("display").textContent = "Saved record
for " + user.name + " with id " + event.result;
                      };
           }
};
indexedDB : lecture
                           d'enregistrements

var request = window.indexedDB.open("MyDB", "My great database");
request.onsuccess = function(event) {
  // Enumerate the entire object store.
  request = event.result.objectStore("users").openCursor();
  request.onsuccess = function(event) {
    var cursor = event.result;
    // If cursor is null then we've completed the enumeration.
    if (!cursor) {
      return;
    }
    var element = document.createElement("div");
    element.textContent = cursor.value.name;
    document.getElementById("usersList").appendChild(element);
    cursor.continue();
   };
};
indexedDB : Browser support
Synthèse : support des browsers




               source : http://www.html5rocks.com/en/features/storage
Wrappers javascript

●   Lawnchair :
    ●   une interface unifiée qui supporte les différentes implémentations


●   IndexedDB Polyfill
    ●   Wrapper IndexedDB autour de WebSQL
Stockage des pages et ressources
              associées dans le navigateur
●   Utilisation d'un fichier "Manifest" permettant de décrire le
    comportement des ressources

●   Un seul fichier Manifest à la racine de la WebApp, toutes les
    pages de la WebApp pointant sur ce fichier
Structure d'un fichier Manifest

●   Un MIME Type spécfique: text/cache-manifest
●   Utilisation d’une extension “ .appcache”
●   Header d'un fichier manifest : CACHE MANIFEST
●   3 sections :
    ●   CACHE : liste les ressources devant être obligatoirement mises en
        cache
    ●   NETWORK : liste les ressources nécessitant obligatoirement d'être
        connecté. La wilcard * permet d'ajouter au cache les ressources
        référencées sur d'autres domaines
    ●   FALLBACK : liste les ressources à afficher lorsque la page consultée en
        offline n'est pas dans le cache
Exemple de fichier Manifest
CACHE MANIFEST
  # rev 42


NETWORK:
  /tracking.cgi
CACHE:
  /clock.css
  /clock.js
  /clock-face.jpg


FALLBACK:
/ /pageNotFound.html
Manipulation du cache par
                             Javascript

●   Différents événements renvoyés lorsque le navigateur lit
    lanifeste
●   Accès programmatique au cache : window.applicationCache


var appCache = window.applicationCache;

appCache.update();

if (appCache.status == window.applicationCache.UPDATEREADY) {
          appCache.swapCache();
}
Trucs et astuces sur AppCache
●   Utilisez des outils de génération automatique du Manifeste (ex:
    HTML5 BoilerPlate)

●   En mode développement, configurez votre serveur Web pour
    un TTL de 0 pour servir le fichier Manifeste.

●   Possibilité de voir le contenu du cache
    ●   Sous Chrome : chrome:appcache-internals
Détection des modes offline / online
●   fonction navigator.online()
    ●   permet de détecter si le navigateur est connecté


●   Evénements :
    ●   document.body.addEventListener("online", function () {...}
    ●   document.body.addEventListener("offline", function () {...}


●   Attention, navigator.online() renvoie true dès qu’on est connecté
    à un réseau mais sans nécessairement de connexion internet
    ●   Possibilité d’implémenter un polling par xmlHTTPRequest
OWF12/HTML 5 local storage , olivier thomas, cto at webtyss

Contenu connexe

Tendances

Construisez votre première application MongoDB
Construisez votre première application MongoDBConstruisez votre première application MongoDB
Construisez votre première application MongoDB
MongoDB
 
Journées SQL Server 2011 Extended Events
Journées SQL Server 2011  Extended Events Journées SQL Server 2011  Extended Events
Journées SQL Server 2011 Extended Events
David BAFFALEUF
 
introduction à MongoDB
introduction à MongoDBintroduction à MongoDB
introduction à MongoDB
Abdoulaye Dieng
 
Azure Data Factory, Mouvement de données hybride
Azure Data Factory, Mouvement de données hybrideAzure Data Factory, Mouvement de données hybride
Azure Data Factory, Mouvement de données hybride
Jean-Pierre Riehl
 
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
MongoDB
 
Mongo db et nosql
Mongo db et nosqlMongo db et nosql
Mongo db et nosql
Xavier MARIN
 
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...Fabien Potencier
 
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
MongoDB
 
Tout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pasTout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pas
Pierre-Alban DEWITTE
 
L'expérience client au centre de la donnée @AirFrance
L'expérience client au centre de la donnée @AirFranceL'expérience client au centre de la donnée @AirFrance
L'expérience client au centre de la donnée @AirFrance
MongoDB
 
Présentation de ElasticSearch / Digital apéro du 12/11/2014
Présentation de ElasticSearch / Digital apéro du 12/11/2014Présentation de ElasticSearch / Digital apéro du 12/11/2014
Présentation de ElasticSearch / Digital apéro du 12/11/2014
Silicon Comté
 
[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?
[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?
[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?
Sébastien Prunier
 
Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...
Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...
Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...
MongoDB
 
Mongo DB
Mongo DBMongo DB
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de donnéesMongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
SOAT
 
Hadoop et son écosystème - v2
Hadoop et son écosystème - v2Hadoop et son écosystème - v2
Hadoop et son écosystème - v2
Khanh Maudoux
 
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
Bruno Bonnin
 
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 2/3 - HTML5, CSS3, Twitte...
ENIB 2015-2016 - CAI Web -  S01E01- Côté navigateur 2/3 - HTML5, CSS3, Twitte...ENIB 2015-2016 - CAI Web -  S01E01- Côté navigateur 2/3 - HTML5, CSS3, Twitte...
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 2/3 - HTML5, CSS3, Twitte...
Horacio Gonzalez
 
Modélisation de données pour MongoDB
Modélisation de données pour MongoDBModélisation de données pour MongoDB
Modélisation de données pour MongoDB
MongoDB
 

Tendances (20)

Construisez votre première application MongoDB
Construisez votre première application MongoDBConstruisez votre première application MongoDB
Construisez votre première application MongoDB
 
Journées SQL Server 2011 Extended Events
Journées SQL Server 2011  Extended Events Journées SQL Server 2011  Extended Events
Journées SQL Server 2011 Extended Events
 
introduction à MongoDB
introduction à MongoDBintroduction à MongoDB
introduction à MongoDB
 
Azure Data Factory, Mouvement de données hybride
Azure Data Factory, Mouvement de données hybrideAzure Data Factory, Mouvement de données hybride
Azure Data Factory, Mouvement de données hybride
 
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
 
Mongo db et nosql
Mongo db et nosqlMongo db et nosql
Mongo db et nosql
 
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
Découpler votre code pour assurer la réutilisabilité et la maintenabilite ...
 
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
 
Tout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pasTout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pas
 
L'expérience client au centre de la donnée @AirFrance
L'expérience client au centre de la donnée @AirFranceL'expérience client au centre de la donnée @AirFrance
L'expérience client au centre de la donnée @AirFrance
 
Pg jsonb format 16-9
Pg jsonb format 16-9Pg jsonb format 16-9
Pg jsonb format 16-9
 
Présentation de ElasticSearch / Digital apéro du 12/11/2014
Présentation de ElasticSearch / Digital apéro du 12/11/2014Présentation de ElasticSearch / Digital apéro du 12/11/2014
Présentation de ElasticSearch / Digital apéro du 12/11/2014
 
[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?
[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?
[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?
 
Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...
Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...
Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...
 
Mongo DB
Mongo DBMongo DB
Mongo DB
 
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de donnéesMongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
 
Hadoop et son écosystème - v2
Hadoop et son écosystème - v2Hadoop et son écosystème - v2
Hadoop et son écosystème - v2
 
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
 
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 2/3 - HTML5, CSS3, Twitte...
ENIB 2015-2016 - CAI Web -  S01E01- Côté navigateur 2/3 - HTML5, CSS3, Twitte...ENIB 2015-2016 - CAI Web -  S01E01- Côté navigateur 2/3 - HTML5, CSS3, Twitte...
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 2/3 - HTML5, CSS3, Twitte...
 
Modélisation de données pour MongoDB
Modélisation de données pour MongoDBModélisation de données pour MongoDB
Modélisation de données pour MongoDB
 

Similaire à OWF12/HTML 5 local storage , olivier thomas, cto at webtyss

Azure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmediaAzure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmedia
Microsoft
 
Mettez du temps réel dans votre Drupal avec Node JS
Mettez du temps réel dans votre Drupal avec Node JSMettez du temps réel dans votre Drupal avec Node JS
Mettez du temps réel dans votre Drupal avec Node JSMatthieu Guillermin
 
Tableau de bord Yammer sous SharePoint 2013
Tableau de bord Yammer sous SharePoint 2013Tableau de bord Yammer sous SharePoint 2013
Tableau de bord Yammer sous SharePoint 2013
Philippe Sfeir
 
Jquery - introduction au langage
Jquery - introduction au langageJquery - introduction au langage
Jquery - introduction au langage
StrasWeb
 
HTML5 en projet
HTML5 en projetHTML5 en projet
HTML5 en projet
Normandy JUG
 
FORMATION javascript.pdf
FORMATION javascript.pdfFORMATION javascript.pdf
FORMATION javascript.pdf
OualidBelbrik
 
Cours yeoman backbone box2d
Cours yeoman backbone box2dCours yeoman backbone box2d
Cours yeoman backbone box2dhugomallet
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications JavaAntoine Rey
 
Notions de base de JavaScript
Notions de base de JavaScriptNotions de base de JavaScript
Notions de base de JavaScript
Kristen Le Liboux
 
CocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical RecordCocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical Record
CocoaHeadsRNS
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans Drupal
Adyax
 
Softshake 2013 Apiness SA l'envers du décor
Softshake 2013 Apiness SA l'envers du décorSoftshake 2013 Apiness SA l'envers du décor
Softshake 2013 Apiness SA l'envers du décor
michaelmiguel2013
 
Softshake apiness l'envers du décor
Softshake apiness l'envers du décorSoftshake apiness l'envers du décor
Softshake apiness l'envers du décor
ApinessSA
 
Optimisation du stockage share point 2010
Optimisation du stockage share point 2010Optimisation du stockage share point 2010
Optimisation du stockage share point 2010
Nicolas Georgeault
 
Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big DataJournées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
David Joubert
 
Introduction à node.js
Introduction à node.js Introduction à node.js
Introduction à node.js
Microsoft Technet France
 
Vert.x
Vert.xVert.x
Vert.x
Xavier MARIN
 
Paris RailsCamp 2009
Paris RailsCamp 2009Paris RailsCamp 2009
Paris RailsCamp 2009
Olivier Gutknecht
 
Introduction aux RIA (Rich Internet Applications)
Introduction aux RIA (Rich Internet Applications)Introduction aux RIA (Rich Internet Applications)
Introduction aux RIA (Rich Internet Applications)
Tugdual Grall
 
Solution Linux 2009 - JavaScript
Solution Linux 2009 - JavaScriptSolution Linux 2009 - JavaScript
Solution Linux 2009 - JavaScript
Raphaël Semeteys
 

Similaire à OWF12/HTML 5 local storage , olivier thomas, cto at webtyss (20)

Azure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmediaAzure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmedia
 
Mettez du temps réel dans votre Drupal avec Node JS
Mettez du temps réel dans votre Drupal avec Node JSMettez du temps réel dans votre Drupal avec Node JS
Mettez du temps réel dans votre Drupal avec Node JS
 
Tableau de bord Yammer sous SharePoint 2013
Tableau de bord Yammer sous SharePoint 2013Tableau de bord Yammer sous SharePoint 2013
Tableau de bord Yammer sous SharePoint 2013
 
Jquery - introduction au langage
Jquery - introduction au langageJquery - introduction au langage
Jquery - introduction au langage
 
HTML5 en projet
HTML5 en projetHTML5 en projet
HTML5 en projet
 
FORMATION javascript.pdf
FORMATION javascript.pdfFORMATION javascript.pdf
FORMATION javascript.pdf
 
Cours yeoman backbone box2d
Cours yeoman backbone box2dCours yeoman backbone box2d
Cours yeoman backbone box2d
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
 
Notions de base de JavaScript
Notions de base de JavaScriptNotions de base de JavaScript
Notions de base de JavaScript
 
CocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical RecordCocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical Record
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans Drupal
 
Softshake 2013 Apiness SA l'envers du décor
Softshake 2013 Apiness SA l'envers du décorSoftshake 2013 Apiness SA l'envers du décor
Softshake 2013 Apiness SA l'envers du décor
 
Softshake apiness l'envers du décor
Softshake apiness l'envers du décorSoftshake apiness l'envers du décor
Softshake apiness l'envers du décor
 
Optimisation du stockage share point 2010
Optimisation du stockage share point 2010Optimisation du stockage share point 2010
Optimisation du stockage share point 2010
 
Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big DataJournées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
 
Introduction à node.js
Introduction à node.js Introduction à node.js
Introduction à node.js
 
Vert.x
Vert.xVert.x
Vert.x
 
Paris RailsCamp 2009
Paris RailsCamp 2009Paris RailsCamp 2009
Paris RailsCamp 2009
 
Introduction aux RIA (Rich Internet Applications)
Introduction aux RIA (Rich Internet Applications)Introduction aux RIA (Rich Internet Applications)
Introduction aux RIA (Rich Internet Applications)
 
Solution Linux 2009 - JavaScript
Solution Linux 2009 - JavaScriptSolution Linux 2009 - JavaScript
Solution Linux 2009 - JavaScript
 

Plus de Paris Open Source Summit

#OSSPARIS19 : Control your Embedded Linux remotely by using WebSockets - Gian...
#OSSPARIS19 : Control your Embedded Linux remotely by using WebSockets - Gian...#OSSPARIS19 : Control your Embedded Linux remotely by using WebSockets - Gian...
#OSSPARIS19 : Control your Embedded Linux remotely by using WebSockets - Gian...
Paris Open Source Summit
 
#OSSPARIS19 : A virtual machine approach for microcontroller programming : th...
#OSSPARIS19 : A virtual machine approach for microcontroller programming : th...#OSSPARIS19 : A virtual machine approach for microcontroller programming : th...
#OSSPARIS19 : A virtual machine approach for microcontroller programming : th...
Paris Open Source Summit
 
#OSSPARIS19 : RIOT: towards open source, secure DevOps on microcontroller-bas...
#OSSPARIS19 : RIOT: towards open source, secure DevOps on microcontroller-bas...#OSSPARIS19 : RIOT: towards open source, secure DevOps on microcontroller-bas...
#OSSPARIS19 : RIOT: towards open source, secure DevOps on microcontroller-bas...
Paris Open Source Summit
 
#OSSPARIS19 : The evolving (IoT) security landscape - Gianluca Varisco, Arduino
#OSSPARIS19 : The evolving (IoT) security landscape - Gianluca Varisco, Arduino#OSSPARIS19 : The evolving (IoT) security landscape - Gianluca Varisco, Arduino
#OSSPARIS19 : The evolving (IoT) security landscape - Gianluca Varisco, Arduino
Paris Open Source Summit
 
#OSSPARIS19: Construire des applications IoT "secure-by-design" - Thomas Gaza...
#OSSPARIS19: Construire des applications IoT "secure-by-design" - Thomas Gaza...#OSSPARIS19: Construire des applications IoT "secure-by-design" - Thomas Gaza...
#OSSPARIS19: Construire des applications IoT "secure-by-design" - Thomas Gaza...
Paris Open Source Summit
 
#OSSPARIS19 : Detecter des anomalies de séries temporelles à la volée avec Wa...
#OSSPARIS19 : Detecter des anomalies de séries temporelles à la volée avec Wa...#OSSPARIS19 : Detecter des anomalies de séries temporelles à la volée avec Wa...
#OSSPARIS19 : Detecter des anomalies de séries temporelles à la volée avec Wa...
Paris Open Source Summit
 
#OSSPARIS19 : Supervision d'objets connectés industriels - Eric DOANE, Zabbix
#OSSPARIS19 : Supervision d'objets connectés industriels - Eric DOANE, Zabbix#OSSPARIS19 : Supervision d'objets connectés industriels - Eric DOANE, Zabbix
#OSSPARIS19 : Supervision d'objets connectés industriels - Eric DOANE, Zabbix
Paris Open Source Summit
 
#OSSPARIS19: Introduction to scikit-learn - Olivier Grisel, Inria
#OSSPARIS19: Introduction to scikit-learn - Olivier Grisel, Inria#OSSPARIS19: Introduction to scikit-learn - Olivier Grisel, Inria
#OSSPARIS19: Introduction to scikit-learn - Olivier Grisel, Inria
Paris Open Source Summit
 
#OSSPARIS19 - Fostering disruptive innovation in AI with JEDI - André Loesekr...
#OSSPARIS19 - Fostering disruptive innovation in AI with JEDI - André Loesekr...#OSSPARIS19 - Fostering disruptive innovation in AI with JEDI - André Loesekr...
#OSSPARIS19 - Fostering disruptive innovation in AI with JEDI - André Loesekr...
Paris Open Source Summit
 
#OSSPARIS19 : Comment ONLYOFFICE aide à organiser les travaux de recherches ...
#OSSPARIS19 : Comment ONLYOFFICE aide à organiser les travaux de recherches  ...#OSSPARIS19 : Comment ONLYOFFICE aide à organiser les travaux de recherches  ...
#OSSPARIS19 : Comment ONLYOFFICE aide à organiser les travaux de recherches ...
Paris Open Source Summit
 
#OSSPARIS19 : MDPH : une solution collaborative open source pour l'instructio...
#OSSPARIS19 : MDPH : une solution collaborative open source pour l'instructio...#OSSPARIS19 : MDPH : une solution collaborative open source pour l'instructio...
#OSSPARIS19 : MDPH : une solution collaborative open source pour l'instructio...
Paris Open Source Summit
 
#OSSPARIS19 - Understanding Open Source Governance - Gilles Gravier, Wipro Li...
#OSSPARIS19 - Understanding Open Source Governance - Gilles Gravier, Wipro Li...#OSSPARIS19 - Understanding Open Source Governance - Gilles Gravier, Wipro Li...
#OSSPARIS19 - Understanding Open Source Governance - Gilles Gravier, Wipro Li...
Paris Open Source Summit
 
#OSSPARIS19 : Publier du code Open Source dans une banque : Mission impossibl...
#OSSPARIS19 : Publier du code Open Source dans une banque : Mission impossibl...#OSSPARIS19 : Publier du code Open Source dans une banque : Mission impossibl...
#OSSPARIS19 : Publier du code Open Source dans une banque : Mission impossibl...
Paris Open Source Summit
 
#OSSPARIS19 : Libre à vous ! Raconter les libertés informatiques à la radio -...
#OSSPARIS19 : Libre à vous ! Raconter les libertés informatiques à la radio -...#OSSPARIS19 : Libre à vous ! Raconter les libertés informatiques à la radio -...
#OSSPARIS19 : Libre à vous ! Raconter les libertés informatiques à la radio -...
Paris Open Source Summit
 
#OSSPARIS19 - Le logiciel libre : un enjeu politique et social - Etienne Gonn...
#OSSPARIS19 - Le logiciel libre : un enjeu politique et social - Etienne Gonn...#OSSPARIS19 - Le logiciel libre : un enjeu politique et social - Etienne Gonn...
#OSSPARIS19 - Le logiciel libre : un enjeu politique et social - Etienne Gonn...
Paris Open Source Summit
 
#OSSPARIS19 - Conflits d’intérêt & concurrence : la place de l’éditeur dans l...
#OSSPARIS19 - Conflits d’intérêt & concurrence : la place de l’éditeur dans l...#OSSPARIS19 - Conflits d’intérêt & concurrence : la place de l’éditeur dans l...
#OSSPARIS19 - Conflits d’intérêt & concurrence : la place de l’éditeur dans l...
Paris Open Source Summit
 
#OSSPARIS19 - Table ronde : souveraineté des données
#OSSPARIS19 - Table ronde : souveraineté des données #OSSPARIS19 - Table ronde : souveraineté des données
#OSSPARIS19 - Table ronde : souveraineté des données
Paris Open Source Summit
 
#OSSPARIS19 - Comment financer un projet de logiciel libre - LUDOVIC DUBOST, ...
#OSSPARIS19 - Comment financer un projet de logiciel libre - LUDOVIC DUBOST, ...#OSSPARIS19 - Comment financer un projet de logiciel libre - LUDOVIC DUBOST, ...
#OSSPARIS19 - Comment financer un projet de logiciel libre - LUDOVIC DUBOST, ...
Paris Open Source Summit
 
#OSSPARIS19 - BlueMind v4 : les dessous technologiques de 10 ans de travail p...
#OSSPARIS19 - BlueMind v4 : les dessous technologiques de 10 ans de travail p...#OSSPARIS19 - BlueMind v4 : les dessous technologiques de 10 ans de travail p...
#OSSPARIS19 - BlueMind v4 : les dessous technologiques de 10 ans de travail p...
Paris Open Source Summit
 
#OSSPARIS19 - Tuto de première installation de VITAM, un système d'archivage ...
#OSSPARIS19 - Tuto de première installation de VITAM, un système d'archivage ...#OSSPARIS19 - Tuto de première installation de VITAM, un système d'archivage ...
#OSSPARIS19 - Tuto de première installation de VITAM, un système d'archivage ...
Paris Open Source Summit
 

Plus de Paris Open Source Summit (20)

#OSSPARIS19 : Control your Embedded Linux remotely by using WebSockets - Gian...
#OSSPARIS19 : Control your Embedded Linux remotely by using WebSockets - Gian...#OSSPARIS19 : Control your Embedded Linux remotely by using WebSockets - Gian...
#OSSPARIS19 : Control your Embedded Linux remotely by using WebSockets - Gian...
 
#OSSPARIS19 : A virtual machine approach for microcontroller programming : th...
#OSSPARIS19 : A virtual machine approach for microcontroller programming : th...#OSSPARIS19 : A virtual machine approach for microcontroller programming : th...
#OSSPARIS19 : A virtual machine approach for microcontroller programming : th...
 
#OSSPARIS19 : RIOT: towards open source, secure DevOps on microcontroller-bas...
#OSSPARIS19 : RIOT: towards open source, secure DevOps on microcontroller-bas...#OSSPARIS19 : RIOT: towards open source, secure DevOps on microcontroller-bas...
#OSSPARIS19 : RIOT: towards open source, secure DevOps on microcontroller-bas...
 
#OSSPARIS19 : The evolving (IoT) security landscape - Gianluca Varisco, Arduino
#OSSPARIS19 : The evolving (IoT) security landscape - Gianluca Varisco, Arduino#OSSPARIS19 : The evolving (IoT) security landscape - Gianluca Varisco, Arduino
#OSSPARIS19 : The evolving (IoT) security landscape - Gianluca Varisco, Arduino
 
#OSSPARIS19: Construire des applications IoT "secure-by-design" - Thomas Gaza...
#OSSPARIS19: Construire des applications IoT "secure-by-design" - Thomas Gaza...#OSSPARIS19: Construire des applications IoT "secure-by-design" - Thomas Gaza...
#OSSPARIS19: Construire des applications IoT "secure-by-design" - Thomas Gaza...
 
#OSSPARIS19 : Detecter des anomalies de séries temporelles à la volée avec Wa...
#OSSPARIS19 : Detecter des anomalies de séries temporelles à la volée avec Wa...#OSSPARIS19 : Detecter des anomalies de séries temporelles à la volée avec Wa...
#OSSPARIS19 : Detecter des anomalies de séries temporelles à la volée avec Wa...
 
#OSSPARIS19 : Supervision d'objets connectés industriels - Eric DOANE, Zabbix
#OSSPARIS19 : Supervision d'objets connectés industriels - Eric DOANE, Zabbix#OSSPARIS19 : Supervision d'objets connectés industriels - Eric DOANE, Zabbix
#OSSPARIS19 : Supervision d'objets connectés industriels - Eric DOANE, Zabbix
 
#OSSPARIS19: Introduction to scikit-learn - Olivier Grisel, Inria
#OSSPARIS19: Introduction to scikit-learn - Olivier Grisel, Inria#OSSPARIS19: Introduction to scikit-learn - Olivier Grisel, Inria
#OSSPARIS19: Introduction to scikit-learn - Olivier Grisel, Inria
 
#OSSPARIS19 - Fostering disruptive innovation in AI with JEDI - André Loesekr...
#OSSPARIS19 - Fostering disruptive innovation in AI with JEDI - André Loesekr...#OSSPARIS19 - Fostering disruptive innovation in AI with JEDI - André Loesekr...
#OSSPARIS19 - Fostering disruptive innovation in AI with JEDI - André Loesekr...
 
#OSSPARIS19 : Comment ONLYOFFICE aide à organiser les travaux de recherches ...
#OSSPARIS19 : Comment ONLYOFFICE aide à organiser les travaux de recherches  ...#OSSPARIS19 : Comment ONLYOFFICE aide à organiser les travaux de recherches  ...
#OSSPARIS19 : Comment ONLYOFFICE aide à organiser les travaux de recherches ...
 
#OSSPARIS19 : MDPH : une solution collaborative open source pour l'instructio...
#OSSPARIS19 : MDPH : une solution collaborative open source pour l'instructio...#OSSPARIS19 : MDPH : une solution collaborative open source pour l'instructio...
#OSSPARIS19 : MDPH : une solution collaborative open source pour l'instructio...
 
#OSSPARIS19 - Understanding Open Source Governance - Gilles Gravier, Wipro Li...
#OSSPARIS19 - Understanding Open Source Governance - Gilles Gravier, Wipro Li...#OSSPARIS19 - Understanding Open Source Governance - Gilles Gravier, Wipro Li...
#OSSPARIS19 - Understanding Open Source Governance - Gilles Gravier, Wipro Li...
 
#OSSPARIS19 : Publier du code Open Source dans une banque : Mission impossibl...
#OSSPARIS19 : Publier du code Open Source dans une banque : Mission impossibl...#OSSPARIS19 : Publier du code Open Source dans une banque : Mission impossibl...
#OSSPARIS19 : Publier du code Open Source dans une banque : Mission impossibl...
 
#OSSPARIS19 : Libre à vous ! Raconter les libertés informatiques à la radio -...
#OSSPARIS19 : Libre à vous ! Raconter les libertés informatiques à la radio -...#OSSPARIS19 : Libre à vous ! Raconter les libertés informatiques à la radio -...
#OSSPARIS19 : Libre à vous ! Raconter les libertés informatiques à la radio -...
 
#OSSPARIS19 - Le logiciel libre : un enjeu politique et social - Etienne Gonn...
#OSSPARIS19 - Le logiciel libre : un enjeu politique et social - Etienne Gonn...#OSSPARIS19 - Le logiciel libre : un enjeu politique et social - Etienne Gonn...
#OSSPARIS19 - Le logiciel libre : un enjeu politique et social - Etienne Gonn...
 
#OSSPARIS19 - Conflits d’intérêt & concurrence : la place de l’éditeur dans l...
#OSSPARIS19 - Conflits d’intérêt & concurrence : la place de l’éditeur dans l...#OSSPARIS19 - Conflits d’intérêt & concurrence : la place de l’éditeur dans l...
#OSSPARIS19 - Conflits d’intérêt & concurrence : la place de l’éditeur dans l...
 
#OSSPARIS19 - Table ronde : souveraineté des données
#OSSPARIS19 - Table ronde : souveraineté des données #OSSPARIS19 - Table ronde : souveraineté des données
#OSSPARIS19 - Table ronde : souveraineté des données
 
#OSSPARIS19 - Comment financer un projet de logiciel libre - LUDOVIC DUBOST, ...
#OSSPARIS19 - Comment financer un projet de logiciel libre - LUDOVIC DUBOST, ...#OSSPARIS19 - Comment financer un projet de logiciel libre - LUDOVIC DUBOST, ...
#OSSPARIS19 - Comment financer un projet de logiciel libre - LUDOVIC DUBOST, ...
 
#OSSPARIS19 - BlueMind v4 : les dessous technologiques de 10 ans de travail p...
#OSSPARIS19 - BlueMind v4 : les dessous technologiques de 10 ans de travail p...#OSSPARIS19 - BlueMind v4 : les dessous technologiques de 10 ans de travail p...
#OSSPARIS19 - BlueMind v4 : les dessous technologiques de 10 ans de travail p...
 
#OSSPARIS19 - Tuto de première installation de VITAM, un système d'archivage ...
#OSSPARIS19 - Tuto de première installation de VITAM, un système d'archivage ...#OSSPARIS19 - Tuto de première installation de VITAM, un système d'archivage ...
#OSSPARIS19 - Tuto de première installation de VITAM, un système d'archivage ...
 

OWF12/HTML 5 local storage , olivier thomas, cto at webtyss

  • 1.
  • 2. Stockage local dans les navigateurs
  • 3. Olivier Thomas ● CTO, Webtyss ● othomas@webtyss.com ● @webtyss
  • 4. Pourquoi du stockage local ? ● Des WebApps, pas de "simples" sites Web... ● Proposer une expérience utilisateur identique, avec ou sans connexion ● Indispensable pour rivaliser avec les applications natives ● La gestion du offline, primordiale pour les applis mobiles
  • 5. Les différents types de stockage ● Stockage local de données utilisateurs ● Cookies ● Local Storage (également appelé Web Storage, HTML 5 Storage ou Dom Storage) ● Web SQL Database (WebDB) ● IndexedDB ● Caching ● Stockage de pages et ressources associées
  • 6. Les challenges du stockage local des données ● De la capacité ! ● De la persistence, au-delà des refresh de page! ● Une manipulation des données à la fois puissante et souple pour l'utilisateur ● Laisser à l'utilisateur le libre choix sur les données à échanger avec le serveur
  • 7. Cookies ● Stockage de petites quantités d’informations sous un format clé/valeur ● Cookies de sessions vs Cookies persistents ● Utilisation de l’attribut “expires” ● Max 4KB de données par cookie et 20 cookies par domaine ● Les cookies transitent systématiquement entre le navigateur et le site --> overhead
  • 8. Manipulation des cookies ● Option 1 : Manipulation des cookies au niveau de l’enveloppe HTTP ● Poser un cookie Set-Cookie : NOM=VALEUR; domain=NOM_DE_DOMAINE; expires=DATE ● Option 2 : Manipulation des cookies au niveau javascript ● Utilsation de l’objet document.cookie ● var expire = new Date(); var unAn = expire.getTime() + (365*24*60*60*1000); expire.setTime(unAN); document.cookie = "JDNCookie=Test; expires=" + expire.toGMTString();
  • 9. Implémentation "Local Storage" ● Stockage de données au format "Clé / Valeur" ● Les avantages : ● Un stockage réellement persistent ● Une API très simple à utiliser ● Mécanisme d'événements pour intercepter les modifications effectuées sur l'espace de stockage
  • 10. Local Storage ● Les limitations ● Plus grande capacité de stockage que les cookies mais limitation à 5MB par domaine ● Stockage de données de n'importe quel type mais sous forme de chaînes --> Sérialisation et Désérialisation nécessaires ! ● Un mode de stockage peu propice aux structures de données complexes
  • 11. Local Storage - Code ● L'accès au stockage local s'effectue par l'objet window.localStorage ● Des méthodes simples de manipulation de données ● clear() ● getItem() ● value = window.localStorage.getItem(key) ● setItem() ● window.localStorage.setItem(key, value) ● removeItem ● Key
  • 12. Local Storage - itération Disponibilité d'une fonction 'length' for (var i = 0; i < localStorage.length; i++) { var key = localStorage.key(i); var value = localStorage.getItem(key); }
  • 13. Local Storage - Evénements Ajout d'un listener sur l'événement 'storage' window.addEventListener("storage", function(event) { var key = event.key; var newValue = event.newValue; var oldValue = event.oldValue; var url = event.url; var storageArea = event.storageArea; // handle the event });
  • 14. Local Storage : détecter si la fonctionnalité est supportée Manuellement ou via l'utilisation de script spécialisé (ex: Modernizr) if (Modernizr.localstorage) { // window.localStorage is available! } else { // no native support for local storage :( }
  • 15. Local Storage - Navigateurs supportés ● Local Storage est aujourd'hui supporté par l'ensemble des navigateurs fixes et mobiles.
  • 16. Web SQL Database ● Toute la puissance (et les inconvénients) d'une base de données relationnelle dans le navigateur ● Taille de stockage bien supérieure à 5MB (potentiellement jusqu'à 1GB) ● La plupart des implémentations reposent sur SQLLite ● Implémentation supportée par les navigateurs mobiles
  • 18. Web SQL Database - Ouverture de BDD var db = window.openDatabase( "MyDB", "", "My super database", 1024);
  • 19. Web SQL Database Vérification de la version Gérer les versions de la base et la création des tables if (db.version != "1") { db.changeVersion(db.version, "1", function(tx) { // User's first visit. Initialize database. var tables = [ { name: "users", columns: ["id INTEGER PRIMARY KEY", "name TEXT"]}, { name: "groups", columns: ["id INTEGER PRIMARY KEY", "name TEXT"]}, { name: "users_groups", columns: ["userId INTEGER", "groupId INTEGER", date TEXT"]} ]; for (var index = 0; index < tables.length; index++) { var table = tables[index]; tx.executeSql("CREATE TABLE " + table.name + "(" + table.columns.join(", ") + ");"); } }, null, function() {loadData(db);} ); }else { // User has been here before, no initialization required. loadData(db); }
  • 20. WebDatabase : insertion de données db.transaction(function(tx) { for (var index = 0; index < myTable.length; index++) { var myValue = myTable[index]; tx.executeSql("INSERT INTO users (name) VALUES (:name);", [myValue], function(tx, results) { // Do something here after the insert }); } });
  • 21. WebDatabase : lecture d'enregistrements db.readTransaction( function(tx) { tx.executeSql("SELECT * FROM users", function(tx, results) { var rows = results.rows; for (var index = 0; index < rows.length; index++) { var item = rows.item(index); var element = document.createElement("div"); element.textContent = item.name; document.getElementById("usersList").appendChild(element); } }); } );
  • 22. WebDatabase : support des navigateurs ● Fonctionnalité non supportée par Firefox ● A venir dans IE
  • 23. IndexedDB ● Une alternative à WebDB avec les mêmes objectifs : fournir une solution de stockage local avancé pour les applications HTML5 ● Repose sur une implémentation "NoSQL" basée sur un concept de "DataStore" ● L'ensemble des accès est asynchrone
  • 24. IndexedDB - Code Ouverture de la base et vérification de la version var request = window.indexedDB.open("MyDB“, "My great database"); request.onsuccess = function(event) { var db = event.result; if (db.version != "1") { // User's first visit, initialize database. var createdObjectStoreCount = 0; var objectStores = [ { name: "users", keyPath: "id", autoIncrement: true }, { name: "groups", keyPath: "id", autoIncrement: true }, { name: "users_groups", keyPath: "", autoIncrement: true } ]; function objectStoreCreated(event) { if (++createdObjectStoreCount == objectStores.length) { db.setVersion("1").onsuccess = function(event) { loadData(db);}; } } for (var index = 0; index < objectStores.length; index++) { var params = objectStores[index]; request = db.createObjectStore(params.name, params.keyPath, params.autoIncrement); request.onsuccess = objectStoreCreated; } } else { loadData(db); } };
  • 25. IndexedDB : insertion de données var request = window.indexedDB.open("MyDB", "My great database"); request.onsuccess = function(event) { var objectStore = event.result.objectStore("users"); for (var index = 0; index < users.length; index++) { var user = users[index]; objectStore.add(user).onsuccess = function(event) { document.getElementById("display").textContent = "Saved record for " + user.name + " with id " + event.result; }; } };
  • 26. indexedDB : lecture d'enregistrements var request = window.indexedDB.open("MyDB", "My great database"); request.onsuccess = function(event) { // Enumerate the entire object store. request = event.result.objectStore("users").openCursor(); request.onsuccess = function(event) { var cursor = event.result; // If cursor is null then we've completed the enumeration. if (!cursor) { return; } var element = document.createElement("div"); element.textContent = cursor.value.name; document.getElementById("usersList").appendChild(element); cursor.continue(); }; };
  • 28. Synthèse : support des browsers source : http://www.html5rocks.com/en/features/storage
  • 29. Wrappers javascript ● Lawnchair : ● une interface unifiée qui supporte les différentes implémentations ● IndexedDB Polyfill ● Wrapper IndexedDB autour de WebSQL
  • 30. Stockage des pages et ressources associées dans le navigateur ● Utilisation d'un fichier "Manifest" permettant de décrire le comportement des ressources ● Un seul fichier Manifest à la racine de la WebApp, toutes les pages de la WebApp pointant sur ce fichier
  • 31. Structure d'un fichier Manifest ● Un MIME Type spécfique: text/cache-manifest ● Utilisation d’une extension “ .appcache” ● Header d'un fichier manifest : CACHE MANIFEST ● 3 sections : ● CACHE : liste les ressources devant être obligatoirement mises en cache ● NETWORK : liste les ressources nécessitant obligatoirement d'être connecté. La wilcard * permet d'ajouter au cache les ressources référencées sur d'autres domaines ● FALLBACK : liste les ressources à afficher lorsque la page consultée en offline n'est pas dans le cache
  • 32. Exemple de fichier Manifest CACHE MANIFEST # rev 42 NETWORK: /tracking.cgi CACHE: /clock.css /clock.js /clock-face.jpg FALLBACK: / /pageNotFound.html
  • 33. Manipulation du cache par Javascript ● Différents événements renvoyés lorsque le navigateur lit lanifeste ● Accès programmatique au cache : window.applicationCache var appCache = window.applicationCache; appCache.update(); if (appCache.status == window.applicationCache.UPDATEREADY) { appCache.swapCache(); }
  • 34. Trucs et astuces sur AppCache ● Utilisez des outils de génération automatique du Manifeste (ex: HTML5 BoilerPlate) ● En mode développement, configurez votre serveur Web pour un TTL de 0 pour servir le fichier Manifeste. ● Possibilité de voir le contenu du cache ● Sous Chrome : chrome:appcache-internals
  • 35. Détection des modes offline / online ● fonction navigator.online() ● permet de détecter si le navigateur est connecté ● Evénements : ● document.body.addEventListener("online", function () {...} ● document.body.addEventListener("offline", function () {...} ● Attention, navigator.online() renvoie true dès qu’on est connecté à un réseau mais sans nécessairement de connexion internet ● Possibilité d’implémenter un polling par xmlHTTPRequest