Applications Web sur Mobiles

Date et lieu
22 Novembre 2011
Open Source Day, EPITA, France
Orateur
Francois Daoust <fd@w3.org>
Présentation
http://www.w3.org/2011/Talks/1122-mwabp-epita-fd/

This project is funded by the European Union through the Seventh Framework Programme (FP7/2010-2012) under grant agreement n°257800
- Mobile Web Applications (MobiWebApp)

Qui suis-je ?

Couverture du livre « Relever le défi du Web mobile » co-écrit avec Dominique Hazaël-Massieux

Le W3C

Contenu de cette présentation

  1. Un survol rapide du Web mobile
  2. Quels formats pour le Web mobile ?
  3. Les bases de conception pour le Web mobile
  4. CSS pour adapter la présentation
  5. Un peu de JavaScript
  6. Petit, petit, petit
  7. Adaptation de contenu côté serveur

Références en filigrane

Les Bonnes Pratiques pour le développement d’applications Web mobiles

Un survol rapide du Web mobile

Ecueils spécifiques au monde mobile

L’écran

« Vous… vous avez un écran… heu… un écran… très petit »
Cyrano de Bergerac, Acte I scène 4
(version mobile)

En moyenne :

Puissance limitée

Claviers

Dans tous les cas, les saisies sont difficiles sur un terminal mobile.

Pas de souris !

Trois méthodes principales pour interagir avec du contenu :

Bande passante

Bande passante moyenne par type de connexion
Réseau Bande passante moyenne Temps nécessaire
pour télécharger 100Ko
GSM 10 Kb/s 1 mn 20 s
GPRS 50 Kb/s 16 s
EDGE 180 Kb/s 4.5 s
3G 380 Kb/s 2.1 s
3G+ 1 Mb/s 0.8 s
Wi-Fi 30Mb/s 26 ms

NB : 100Ko peuvent très bien coûter $1 !

Latence

Latence aller-retour sur les réseaux mobiles
Réseau Latence Latence pour 10 échanges
GSM 1 s – 2 s 10 s – 20 s
GPRS 600 ms – 700 ms 6 s – 7 s
EDGE 300 ms – 500 ms 3 s – 5 s
3G 100 ms –300 ms 1 s – 3 s
3G+ 50 ms – 150 ms 500 ms – 1 500 ms
Wi-Fi 1 ms – 5 ms 10ms – 50 ms

Un monde très fragmenté

Des formes différentes

Des centaines de téléphones disponibles aux formes différentes
(feature phones, smartphones, flip, barres, écran allongé, etc.)

Quels sont les types de terminaux présents dans la salle ?

Des systèmes d’exploitation différents

Des navigateurs différents

Des navigateurs légers

Les navigateurs légers sont en fait divisés en deux parties, l’une s’exécutant sur le terminal et l’autre sur un serveur

Des opportunités à saisir

De nouveaux types d’interactions

Capteurs et APIs

Géolocalisation:

navigator.geolocation.getCurrentPosition(…)

Accéléromètre / Gyroscope:

addEventListener('devicemotion', …)

Bientôt…

Etat de la batterie:

battery.addEventListener('batterylow', …)

Caméra / Micro:

navigator.getUserMedia('video,audio',…)

Et encore…

S’adapter au type de connexion:

if (navigator.connection.type) == "3g") { … }

Faire du « push » :

var eventsource = new EventSource();
eventsource.onmessage = function(event) { … }

Communications client-server bi-directionnelles :

var socket = new WebSocket(
            'ws://game.example.com:12010/updates');
            socket.onopen = function () { …};

Et encore encore…

Plus tard, connexions P2P (et communications temps réel) :

var connection = new PeerConnection(
            'STUNS example.net',
            signalingCallback);

Plus tard, interactions entre terminaux:

Un terminal très personnel

Un contexte d’utilisation différent

Un seul Web

Le Web est le même pour tous les types de terminaux

Au final…
Il ne peut en rester qu’un !

Quels formats pour le Web mobile ?

Emulateurs

Les bases d’un bon site Web mobile

Rester simple

Maintenir une séparation nette entre les technologies :

Amélioration progressive ?

Il est plus facile de partir de fondations solides et de rajouter quelques extensions que de devoir supprimer certaines fonctionnalités après-coup.

Le Default Delivery Context

Largeur d’écran disponible
120 pixels au minimum
Markup
XHTML Basic 1.1, servi avec le content-type application/xhtml+xml
Codage de caractères
UTF-8
Formats d’image
JPEG, GIF 89a
Poids total maximum d’une page
20 Ko
Couleurs
256 colors au minimum
Prise en charge de CSS
CSS Level 1, avec la règle @media et les types de media.
Script
Pas de prise en charge de scripts côté client

Ajustements acceptables ?

Largeur d’écran disponible
240-300 pixels au minimum
Markup
HTML5 en se basant sur les fonctionnalités de XHTML Basic 1.1
servi avec le content-type text/html
Codage de caractères
UTF-8
Formats d’image
JPEG, GIF 89a, PNG (sans translucidité)
Poids total maximum d’une page
50 Ko
Couleurs
256 colors au minimum
Prise en charge de CSS
CSS Mobile Profile 2.0
Script
Pas de prise en charge de scripts côté client

Fenêtre d’affichage

Unités CSS

Le pixel de référence

Représentation visuelle d’un pixel de référence

Pour un smartphone, si cette définition est bien suivie :

Fenêtre d’affichage en pratique

La directive viewport

Une fenêtre d’affichage de 418 pixels CSS de large
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <title>Forcer la largeur du viewport</title>
  <meta name="viewport" content="width=418,initial-scale=1.0" /> 
 </head>
 <body>[…]</body>
</html>

Revenir au pixel de référence

Revenir au pixel de référence
<meta name="viewport"
           content="width=device-width,initial-scale=1.0" />

Une présentation linéaire

Optimiser la navigation

Aller droit au but

CSS pour adapter la présentation

CSS Media Types

CSS Media Types
Media type Description
all Pour tous les terminaux, valeur par défaut
screen Pour les écrans d’ordinateurs classiques
handheld Pour les écrans de terminaux mobiles
print Pour l’aperçu avant impression et l’impression
projection Pour la projection de transparents

Jouer avec les CSS Media Types…

Règle CSS @media
@media handheld {
  body { margin: 0; }
  h1 { font-size: 1.3em; }
}
Règle CSS @import
@import url("mobile.css") handheld;
Attribut HTML media
<link rel="stylesheet" href="mobile.css" media="handheld" />

… Un jeu de courte durée !

Inutile d’utiliser handheld au final !

CSS Media Queries

Les requêtes de média CSS étendent les media types avec des critères supplémentaires :

Les propriétés numériques se préfixent avec min- et max-.

width ou device-width ?

width parce que la propriété est indépendante du terminal.

Prise en charge des CSS media queries

C.f. Media Queries (une liste de sites qui utilisent les CSS Media Queries)

Exercice : Adaptation CSS

Une méthode possible

  1. S’assurer que l’unité de référence est le pixel de référence
    (directive viewport)
  2. Penser amélioration progressive
    (le contenu HTML fournit la présentation linéaire)
  3. Cibler les cas voulus avec les requêtes de media

Le code HTML de la méthode

<meta name="viewport"
  content="width=device-width,initial-scale=1.0" />
<link rel="stylesheet" type="text/css"
      href="base.css" />
<link rel="stylesheet" type="text/css"
      href="deuxcol.css"
      media="only all and (min-width: 600px)
             and (max-width: 800px)" />
<link rel="stylesheet" type="text/css"
      href="troiscol.css"
      media="only all and (min-width: 801px)" />

Gérer les exceptions

Gérer les exceptions côté client

Gérer les exceptions côté serveur

Refuser de servir le CSS avancé à un terminal IE Mobile sous Apache
RewriteCond %{HTTP_USER_AGENT} " MSIE " [NC]
RewriteCond %{HTTP_USER_AGENT}
 "Windows Phone| IEMobile" [NC]
RewriteRule ^troiscol.css$ [F,L]

Un peu de JavaScript

Bibliothèques JavaScript

Dans l’ensemble, ces bibliothèques sont lourdes pour les navigateurs mobiles (31Ko pour la version compressée de JQuery par exemple).

Bibliothèques orientées mobile

Quelques bonnes pratiques

Vérifier avant d’utiliser

Prise en charge de l’interface de géolocalisation ?
if (window.navigator.geolocation) {
 // Interface de géolocalisation disponible
 […]
} else {
 // Pas d’interface de géolocalisation disponible
 […]
}

Les scripts à la fin

Les navigateurs bloquent temporairement le chargement d’une page lorsqu’ils rencontrent un script.

Grouper les scripts à la fin du contenu HTML lorsque c’est possible :

<html>
 <head>
  <!-- Pas de script ici --> 
 </head>
 <body>
  <script type="text/javascript" src="scripts.js"></script> 
 </body>
</html>

Manipuler un arbre DOM de manière efficace

JS dans les navigateurs légers

Les navigateurs légers sont en fait divisés en deux parties, l’une s’exécutant sur le terminal et l’autre sur un serveur

Petit, petit, petit

Bande passante

Bande passante moyenne par type de connexion
Réseau Bande passante moyenne Temps nécessaire
pour télécharger 100Ko
GSM 10 Kb/s 1 mn 20 s
GPRS 50 Kb/s 16 s
EDGE 180 Kb/s 4.5 s
3G 380 Kb/s 2.1 s
3G+ 1 Mb/s 0.8 s
Wi-Fi 30Mb/s 26 ms

NB : 100Ko peuvent très bien coûter $1 !

Latence

Latence aller-retour sur les réseaux mobiles
Réseau Latence Latence pour 10 échanges
GSM 1 s – 2 s 10 s – 20 s
GPRS 600 ms – 700 ms 6 s – 7 s
EDGE 300 ms – 500 ms 3 s – 5 s
3G 100 ms –300 ms 1 s – 3 s
3G+ 50 ms – 150 ms 500 ms – 1 500 ms
Wi-Fi 1 ms – 5 ms 10ms – 50 ms

Nombre de requêtes

Pour afficher une page Web:

Les « combines »

Autres gains possibles

Réduire la taille du contenu

But :

Amancir le contenu textuel

Réduire les images ?

Maigrir sans cookies

Tirer partie du cache

Différents types de caches :

Fonctionnement d’un cache

Il suffit de répondre à deux questions :

C.f. « Un tutoriel de la mise en cache » de Mark Nottingham (en français).

Date d’expiration d’un document

Spécifiée dans deux en-têtes HTTP, souvent utilisés ensemble :

Quelle durée de validité utiliser ?

Valeurs de Cache-Control recommandées
Type de document Durée Directive Cache-Control
Static HTML page 1 semaine Cache-Control: max-age=6004800
Dynamic HTML page 1 heure Cache-Control: max-age=3600
« Real-time » HTML page 2 minutes Cache-Control: max-age=120
CSS, image, script 1 mois Cache-Control: max-age=2592000

Version du document

Spécifiée dans deux autres en-têtes HTTP, souvent utilisés ensemble :

La version peut aussi s’inclure dans le nom du document :

<script type="text/javascript" src="script-v1.7.js">
</script>

Préciser les directives côté serveur

Par exemple, sous Apache :

# Enable the mod_expires module
ExpiresActive On 
 
# Set expiration date per document type
ExpiresByType text/html "access plus 1 week"
ExpiresByType text/css "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"

Que mettre en cache ?

TOUT ce qui peut l’être
(HTML, CSS, images, scripts, contenu AJAX, etc.)

Et la compression ?

Compression sous Apache

Sous réserve d’activer le module mod_deflate :

Avec une extension dédiée
AddType .htmlc text/html
AddEncoding gzip .htmlc

Passer en mode offline

Data storage:

window.localStorage

Better, but later:

var db = window.indexedDB.open(dbname);

HTML5 Application Cache:

<html manifest='manifest_file'>

Adaptation de contenu côté serveur

Pourquoi adapter côté serveur ?

Comment adapter côté serveur ?

En-têtes HTTP

Adaptation basée sur Accept-*

Sous Apache :

Options +MultiViews

En supposant la requête suivante :

GET /img HTTP/1.1
Host: example.com
Accept: text/html,image/png,image/jpeg;q=0.8
[…]

Le serveur cherche img.png, puis img.jpg dans le répertoire demandé.

La jungle des User-Agent

Les chaines User-Agent:

Il y a des dizaines de milliers de possibilités.

Adaptation simple et limitée

RewriteEngine on
 
RewriteCond %{HTTP_USER_AGENT} "android" [NC]
RewriteRule ^/$ /index-android.html [L]
 
RewriteRule ^/$ /index.html [L]
 
Header merge vary "User-Agent"

Adaptation plus générique

Les bases de decription de terminaux fournissent ce genre d’information :

Cours sur le Web mobile

http://www.w3.org/Mobile/training/
Prochains cours en Janvier/Février 2012
Twitter: @W3Training

Conclusion

Merci !

Orateur
Francois Daoust <fd@w3.org>
Présentation
http://www.w3.org/2011/Talks/1122-mwabp-epita-fd/
Questions
???

MobiWebApp logo

This project is funded by the European Union through the Seventh Framework Programme (FP7/2010-2012) under grant agreement n°257800
- Mobile Web Applications (MobiWebApp)