L'en-tête de requête d'indication client Save-Data disponible dans les navigateurs Chrome, Opera et Yandex permet aux développeurs de proposer des applications plus légères et plus rapides aux utilisateurs qui activent le mode Économiseur de données dans leur navigateur.
Le besoin de pages légères

Tout le monde s'accorde à dire que des pages Web plus rapides et plus légères offrent une expérience utilisateur plus satisfaisante, permettent une meilleure compréhension et une meilleure mémorisation du contenu, et augmentent les conversions et les revenus. Une étude de Google a montré que "… les pages optimisées se chargent quatre fois plus vite que la page d'origine et utilisent 80 % d'octets en moins. Comme ces pages se chargent beaucoup plus rapidement, nous avons également constaté une augmentation de 50 % du trafic vers ces pages."
Et, bien que le nombre de connexions 2G soit enfin en baisse, la 2G était encore la technologie réseau dominante en 2015. La pénétration et la disponibilité des réseaux 3G et 4G augmentent rapidement, mais les coûts de possession et les contraintes réseau associés restent un facteur important pour des centaines de millions d'utilisateurs.
Ce sont des arguments de poids en faveur de l'optimisation des pages.
Il existe d'autres méthodes pour améliorer la vitesse du site sans l'intervention directe d'un développeur, comme les navigateurs proxy et les services de transcodage. Bien que ces services soient très populaires, ils présentent des inconvénients majeurs : compression simple (et parfois inacceptable) des images et du texte, incapacité à traiter les pages sécurisées (HTTPS), optimisation uniquement des pages visitées via un résultat de recherche, etc. La popularité de ces services est en soi un indicateur que les développeurs Web ne répondent pas correctement à la forte demande des utilisateurs pour des applications et des pages rapides et légères. Mais atteindre cet objectif est un parcours complexe et parfois difficile.
En-tête de requête Save-Data
Une technique assez simple consiste à laisser le navigateur vous aider, en utilisant l'en-tête de requête Save-Data. En identifiant cet en-tête, une page Web peut personnaliser et offrir une expérience utilisateur optimisée aux utilisateurs soumis à des contraintes de coût et de performances.
Les navigateurs compatibles (ci-dessous) permettent à l'utilisateur d'activer un mode d'économie de données qui autorise le navigateur à appliquer un ensemble d'optimisations pour réduire la quantité de données requise pour afficher la page. Lorsque cette fonctionnalité est exposée ou annoncée, le navigateur peut demander des images de résolution inférieure, différer le chargement de certaines ressources ou acheminer les requêtes via un service qui applique d'autres optimisations spécifiques au contenu, telles que la compression des ressources d'image et de texte.
Prise en charge des navigateurs
- Chrome 49 et versions ultérieures annonce
Save-Datalorsque l'utilisateur active l'option "Économiseur de données" sur mobile ou l'extension "Économiseur de données" sur les navigateurs pour ordinateur. - Opera 35 et versions ultérieures annonce
Save-Datalorsque l'utilisateur active le mode Opera Turbo sur ordinateur ou l'option Économies de données sur les navigateurs Android. - Yandex 16.2+ annonce
Save-Datalorsque le mode Turbo est activé sur les navigateurs mobiles ou pour ordinateur.
Détection du paramètre Save-Data…
Pour déterminer quand proposer l'expérience "allégée" à vos utilisateurs, votre application peut vérifier l'en-tête de requête d'indications client Save-Data. Cet en-tête de requête indique que le client préfère réduire l'utilisation des données en raison de coûts de transfert élevés, de vitesses de connexion lentes ou d'autres raisons.
Lorsque l'utilisateur active le mode d'économie de données dans son navigateur, celui-ci ajoute l'en-tête de requête Save-Data à toutes les requêtes sortantes (HTTP et HTTPS).
À l'heure où nous écrivons ces lignes, le navigateur n'annonce qu'un seul jeton *on- dans l'en-tête (Save-Data: on), mais cela pourrait être étendu à l'avenir pour indiquer d'autres préférences utilisateur.
Il est également possible de détecter si Save-Data est activé en JavaScript :
if ('connection' in navigator) {
if (navigator.connection.saveData === true) {
// Implement data saving operations here.
}
}
Il est essentiel de vérifier la présence de l'objet connection dans l'objet navigator, car il représente l'API Network Information, qui n'est implémentée que dans Chrome, Chrome pour Android et les navigateurs Samsung Internet. À partir de là, il vous suffit de vérifier si navigator.connection.saveData est égal à true. Vous pouvez implémenter toutes les opérations d'enregistrement de données dans cette condition.
Si votre application utilise un service worker, elle peut inspecter les en-têtes de requête et appliquer la logique appropriée pour optimiser l'expérience.
Le serveur peut également rechercher les préférences annoncées dans l'en-tête de requête Save-Data et renvoyer une autre réponse (balisage différent, images et vidéos plus petites, etc.).
Conseils d'implémentation et bonnes pratiques
- Lorsque vous utilisez
Save-Data, fournissez des appareils d'interface utilisateur compatibles et permettez aux utilisateurs de basculer facilement entre les expériences. Exemple :- Informez les utilisateurs que
Save-Dataest compatible et encouragez-les à l'utiliser. - Permettez aux utilisateurs d'identifier et de choisir le mode à l'aide d'invites appropriées et de boutons d'activation/désactivation ou de cases à cocher intuitifs.
- Lorsque le mode d'économie de données est sélectionné, annoncez-le et proposez un moyen simple et évident de le désactiver et de revenir à l'expérience complète si l'utilisateur le souhaite.
- Informez les utilisateurs que
- N'oubliez pas que les applications légères ne sont pas des applications de moindre qualité. Ils n'omettent pas de fonctionnalités ni de données importantes, mais sont simplement plus conscients des coûts impliqués et de l'expérience utilisateur. Exemple :
- Une application de galerie photo peut fournir des aperçus de résolution inférieure ou utiliser un mécanisme de carrousel moins lourd en code.
- Une application de recherche peut renvoyer moins de résultats à la fois, limiter le nombre de résultats contenant beaucoup de contenus multimédias ou réduire le nombre de dépendances requises pour afficher la page.
- Un site d'actualités peut afficher moins d'articles, omettre les catégories moins populaires ou fournir des aperçus multimédias plus petits.
- Fournissez une logique de serveur pour vérifier l'en-tête de requête
Save-Dataet envisagez de fournir une réponse de page alternative plus légère lorsqu'il est activé (par exemple, réduire le nombre de ressources et de dépendances requises, appliquer une compression de ressources plus agressive, etc.).- Si vous diffusez une autre réponse basée sur l'en-tête
Save-Data, n'oubliez pas de l'ajouter à la liste Vary (Vary: Save-Data) pour indiquer aux caches en amont qu'ils doivent mettre en cache et diffuser cette version uniquement si l'en-tête de requêteSave-Dataest présent. Pour en savoir plus, consultez les bonnes pratiques concernant l'interaction avec les caches.
- Si vous diffusez une autre réponse basée sur l'en-tête
- Si vous utilisez un service worker, votre application peut détecter quand l'option d'économie de données est activée en vérifiant la présence de l'en-tête de requête
Save-Dataou en vérifiant la valeur de la propriéténavigator.connection.saveData. Si elle est activée, déterminez si vous pouvez réécrire la requête pour récupérer moins d'octets ou utiliser une réponse déjà récupérée. - Envisagez d'enrichir
Save-Dataavec d'autres signaux, tels que des informations sur le type de connexion et la technologie de l'utilisateur (voir l'API NetInfo). Par exemple, vous pouvez proposer l'expérience légère à tout utilisateur disposant d'une connexion 2G, même siSave-Datan'est pas activé. À l'inverse, ce n'est pas parce que l'utilisateur dispose d'une connexion 4G "rapide" qu'il ne souhaite pas économiser des données, par exemple en itinérance. Vous pouvez également augmenter la présence deSave-Dataavec l'indication clientDevice-Memorypour mieux vous adapter aux utilisateurs d'appareils disposant d'une mémoire limitée. La mémoire de l'appareil de l'utilisateur est également annoncée dans l'indication clientnavigator.deviceMemory.
Recettes
Les possibilités offertes par Save-Data ne sont limitées que par votre imagination. Pour vous donner une idée de ce qu'il est possible de faire, examinons quelques cas d'utilisation. Vous trouverez peut-être d'autres cas d'utilisation en lisant ce document. N'hésitez pas à faire des tests pour voir ce qui est possible.
Recherche de Save-Data dans le code côté serveur…
Bien que l'état Save-Data soit quelque chose que vous pouvez détecter en JavaScript via la propriété navigator.connection.saveData, il est parfois préférable de le détecter côté serveur. Dans certains cas, l'exécution de JavaScript peut échouer. De plus, la détection côté serveur est le seul moyen de modifier le balisage avant qu'il ne soit envoyé au client, ce qui est impliqué dans certains des cas d'utilisation les plus avantageux de Save-Data.
La syntaxe spécifique permettant de détecter l'en-tête Save-Data dans le code côté serveur dépend du langage utilisé, mais l'idée de base doit être la même pour tout backend d'application. En PHP, par exemple, les en-têtes de requête sont stockés dans le tableau superglobal $_SERVER à des index commençant par HTTP_. Cela signifie que vous pouvez détecter l'en-tête Save-Data en vérifiant l'existence et la valeur de la variable $_SERVER["HTTP_SAVE_DATA"] comme suit :
// false by default.
$saveData = false;
// Check if the `Save-Data` header exists and is set to a value of "on".
if (isset($_SERVER["HTTP_SAVE_DATA"]) && strtolower($_SERVER["HTTP_SAVE_DATA"]) === "on") {
// `Save-Data` detected!
$saveData = true;
}
Si vous effectuez cette vérification avant l'envoi d'un balisage au client, la variable $saveData contiendra l'état Save-Data et sera disponible n'importe où sur la page. Maintenant que nous avons illustré ce mécanisme, voyons quelques exemples d'utilisation pour limiter la quantité de données que nous envoyons à l'utilisateur.
Diffuser des images basse résolution pour les écrans haute résolution
Un cas d'utilisation courant des images sur le Web consiste à diffuser des images par ensembles de deux : une image pour les écrans"standards" (1x) et une autre deux fois plus grande (2x) pour les écrans haute résolution (par exemple, Retina Display). Cette classe d'écrans haute résolution n'est pas nécessairement limitée aux appareils haut de gamme et devient de plus en plus courante. Dans les cas où une expérience d'application plus légère est préférable, il peut être judicieux d'envoyer des images de résolution inférieure (1x) à ces écrans, plutôt que des variantes plus grandes (2x). Pour ce faire, lorsque l'en-tête Save-Data est présent, nous modifions simplement le balisage que nous envoyons au client :
if ($saveData === true) {
// Send a low-resolution version of the image for clients specifying `Save-Data`.
?><img src="butterfly-1x.jpg" alt="A butterfly perched on a flower."><?php
}
else {
// Send the usual assets for everyone else.
?><img src="butterfly-1x.jpg" srcset="butterfly-2x.jpg 2x, butterfly-1x.jpg 1x" alt="A butterfly perched on a flower."><?php
}
Ce cas d'utilisation est un exemple parfait du peu d'efforts nécessaires pour répondre à la demande d'un utilisateur qui vous demande spécifiquement de lui envoyer moins de données. Si vous ne souhaitez pas modifier le balisage dans le backend, vous pouvez également obtenir le même résultat en utilisant un module de réécriture d'URL tel que mod_rewrite d'Apache. Il existe des exemples de configuration relativement simples.
Vous pouvez également étendre ce concept aux propriétés CSS background-image en ajoutant simplement une classe à l'élément <html> :
<html class="<?php if ($saveData === true): ?>save-data<?php endif; ?>">
À partir de là, vous pouvez cibler la classe save-data sur l'élément <html> dans votre CSS pour modifier la façon dont les images sont diffusées. Vous pouvez envoyer des images de fond basse résolution à des écrans haute résolution, comme illustré dans l'exemple HTML ci-dessus, ou omettre complètement certaines ressources.
Omettez les images non essentielles
Certains contenus d'image sur le Web ne sont tout simplement pas essentiels. Bien que ces images puissent être utiles pour le contenu, elles ne sont peut-être pas souhaitables pour les utilisateurs qui essaient de tirer le meilleur parti de leurs forfaits de données limités. Dans ce qui est peut-être le cas d'utilisation le plus simple de Save-Data, nous pouvons utiliser le code de détection PHP précédent et omettre complètement le balisage d'image non essentiel :
<p>This paragraph is essential content. The image below may be humorous, but it's not critical to the content.</p>
<?php
if ($saveData === false) {
// Only send this image if `Save-Data` hasn't been detected.
?><img src="meme.jpg" alt="One does not simply consume data."><?php
}
Cette technique peut certainement avoir un effet prononcé, comme vous pouvez le voir dans la figure ci-dessous :
Bien sûr, omettre les images n'est pas la seule possibilité. Vous pouvez également agir sur Save-Data pour renoncer à l'envoi d'autres ressources non critiques, telles que certaines polices de caractères.
Omettre les polices Web non essentielles
Bien que les polices Web ne représentent généralement pas une part aussi importante de la charge utile totale d'une page que les images, elles sont tout de même très populaires. Ils ne consomment pas non plus une quantité insignifiante de données. De plus, la façon dont les navigateurs récupèrent et affichent les polices est plus complexe que vous ne le pensez, avec des concepts tels que FOIT, FOUT et les heuristiques du navigateur qui rendent l'affichage nuancé.
Il est donc logique que vous souhaitiez exclure les polices Web non essentielles pour les utilisateurs qui souhaitent une expérience utilisateur plus légère. Save-Data rend cette opération relativement simple.
Par exemple, imaginons que vous avez inclus Fira Sans de Google Fonts sur votre site. Fira Sans est une excellente police pour le corps de texte, mais elle n'est peut-être pas si importante pour les utilisateurs qui essaient d'économiser des données. En ajoutant une classe de save-data à l'élément <html> lorsque l'en-tête Save-Data est présent, nous pouvons écrire des styles qui appellent d'abord la typographie non essentielle, mais qui la désactivent lorsque l'en-tête Save-Data est présent :
/* Opt into web fonts by default. */
p,
li {
font-family: 'Fira Sans', 'Arial', sans-serif;
}
/* Opt out of web fonts if the `save-Data` class is present. */
.save-data p,
.save-data li {
font-family: 'Arial', sans-serif;
}
Cette approche vous permet de laisser l'extrait <link> de Google Fonts en place, car le navigateur charge de manière spéculative les ressources CSS (y compris les polices Web) en appliquant d'abord des styles au DOM, puis en vérifiant si des éléments HTML appellent l'une des ressources de la feuille de style. Si un utilisateur accède à la page avec Save-Data activé, Fira Sans ne sera jamais chargée, car le DOM stylisé ne l'appelle jamais. Arial sera utilisée à la place. Elle n'est pas aussi agréable que Fira Sans, mais elle peut être préférable pour les utilisateurs qui essaient d'économiser leur forfait de données.
Résumé
L'en-tête Save-Data n'est pas très nuancé : il est activé ou désactivé, et l'application doit fournir des expériences appropriées en fonction de son paramètre, quelle qu'en soit la raison.
Par exemple, certains utilisateurs peuvent ne pas autoriser le mode Économiseur de données s'ils pensent qu'ils perdront du contenu ou des fonctionnalités de l'application, même en cas de mauvaise connectivité. À l'inverse, certains utilisateurs peuvent l'activer par défaut pour que les pages restent aussi petites et simples que possible, même dans une situation de bonne connectivité. Il est préférable que votre application suppose que l'utilisateur souhaite bénéficier d'une expérience complète et illimitée, sauf indication contraire de sa part via une action explicite.
En tant que propriétaires de sites et développeurs Web, assumons la responsabilité de gérer notre contenu afin d'améliorer l'expérience des utilisateurs dont les données et les coûts sont limités.
Pour en savoir plus sur Save-Data et obtenir d'excellents exemples pratiques, consultez Aider vos utilisateurs Save Data.