Le WordPress d'aujourd'hui, décodé pour les développeurs

Performance

Interactivity API côté serveur : le vrai coût de rendu mesuré

Mesure du surcoût serveur introduit par l'hydratation de blocs interactifs sur un thème utilisant l'Interactivity API depuis sa stabilisation, comparé à un thème classique.

Par Clément Hadrot • 10 août 2024 • 4 min de lecture • Aucun commentaire
Interactivity API côté serveur : le vrai coût de rendu mesuré

« docs, développeur, Interactivity API » — la documentation officielle publiée sur developer.wordpress.org décrit l’Interactivity API, stabilisée avec WordPress 6.5, comme un standard permettant de rendre des blocs interactifs sans dépendre d’un framework JavaScript lourd côté client. Ce que cette documentation aborde moins, c’est le coût du côté serveur : chaque directive data-wp-* doit être calculée au moment du rendu PHP, avant même que le client ne prenne le relais pour l’hydratation.

Ce billet mesure ce coût sur un thème construit autour de plusieurs blocs interactifs (filtre de galerie, compteur de panier, carrousel avec navigation), comparé à un thème équivalent en apparence mais reposant sur du JavaScript classique attaché après le rendu, sans directives serveur.

Comment fonctionne le rendu côté serveur de l’Interactivity API

Un bloc utilisant l’Interactivity API déclare un état initial et des directives dans son balisage via la fonction wp_interactivity_state() et des attributs data-wp-bind, data-wp-on, data-wp-context, calculés et injectés au moment du rendu du bloc côté PHP :

wp_interactivity_state( 'monTheme/galerie', [
    'filtreActif' => 'tous',
    'total'       => count( $images ),
] );
?>
<div data-wp-interactive="monTheme/galerie" data-wp-context='{"filtreActif":"tous"}'>
    <button data-wp-on--click="actions.filtrer">Filtrer</button>
</div>

Ce mécanisme diffère fondamentalement d’un simple attribut class ou id statique : la valeur de data-wp-context est sérialisée en JSON à chaque rendu de bloc, ce qui implique un appel à wp_json_encode() et une résolution de l’état courant du bloc avant même que le HTML ne soit envoyé au navigateur.

Le protocole de mesure

L'essentiel à retenir : L'Interactivity API génère des directives data-wp-* traitées côté serveur avant l'hydratation client ; Le surcoût de rendu dépend du nombre de blocs interactifs présents sur la page ; Le gain en interactivité côté client a un prix mesurable côté serveur

Deux versions du même gabarit de page ont été comparées, l’une utilisant quatre blocs interactifs via l’Interactivity API, l’autre reproduisant visuellement le même comportement avec du JavaScript vanilla attaché en defer après le chargement de la page, sans directive de rendu serveur :

MesureBlocs classiques + JSInteractivity API
Temps de rendu serveur (4 blocs)38 ms94 ms
Temps avant interactivité côté client640 ms (attente du JS)180 ms (hydratation ciblée)
Poids JavaScript transféré42 Ko11 Ko (module d’exécution partagé)

Le surcoût de rendu serveur, environ 56 millisecondes pour quatre blocs soit 14 millisecondes par bloc en moyenne sur ce thème, s’est révélé largement compensé côté client : le temps avant qu’un visiteur puisse effectivement interagir avec un composant est descendu de 640 à 180 millisecondes, l’Interactivity API évitant le téléchargement puis l’exécution d’un script JavaScript classique avant toute interaction possible.

Où va ce surcoût de rendu serveur

La majeure partie du temps supplémentaire mesuré via Query Monitor et un profil Blackfire provenait de la sérialisation JSON répétée de l’état de chaque bloc, plutôt que de la génération du balisage HTML lui-même. Sur une page avec un grand nombre de blocs interactifs identiques (une galerie de cinquante vignettes, chacune avec son propre contexte), ce coût devient linéaire et peut se faire sentir plus nettement que sur les quatre blocs testés ici.

Ce que ce chiffre signifie pour un choix d’architecture

  • Le surcoût de rendu serveur de l’Interactivity API reste modeste en valeur absolue pour un nombre raisonnable de blocs interactifs par page.
  • Le bénéfice principal se situe côté client, sur le temps avant interactivité effective, pas sur le temps de rendu serveur lui-même.
  • Une page qui répète un grand nombre de fois le même bloc interactif doit être testée spécifiquement, le coût de sérialisation d’état pouvant s’accumuler de façon linéaire.

Un gain côté client se paie rarement à zéro côté serveur : la question n’est jamais s’il y a un coût, mais s’il reste proportionné au bénéfice obtenu.

En résumé

Ce billet ne traite pas de l’écriture des blocs interactifs eux-mêmes, uniquement du coût de rendu qu’ils introduisent côté serveur une fois adoptés. Sur ce thème et ce jeu de blocs, le compromis s’est révélé favorable : quelques dizaines de millisecondes de rendu serveur supplémentaires contre une interactivité perçue nettement plus rapide côté visiteur.

Partager :

À propos de l'auteur

Clément Hadrot

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi