beapi-frontend-framework icon indicating copy to clipboard operation
beapi-frontend-framework copied to clipboard

Feature/stop with svg sprites

Open firestar300 opened this issue 2 years ago • 12 comments

À la suite du We Love Speed 2023, une des nombreuses recommandations de la web perf était d'arrêter d'utiliser les sprites (anciennement PNG et actuellement SVG). Charger un sprite de SVG assez lourd pour n'afficher au final que quelques icônes sur une page n'est pas oufissime.

C'est pourquoi dans cette PR, je vous propose d'arrêter la génération de sprites SVG et d'utiliser les fonctions the_icon() et get_the_icon() pour afficher les SVG en plain.

Les SVG générés dans le dossier dist possèdent la classe icon, les attributs aria-hidden="true" et focusable="false".

En attente de voir vos retours.

firestar300 avatar May 12 '23 16:05 firestar300

Tu as du matériel à lire là dessus ? J'ai cherché pas mal de fois mais je n'ai jamais trouvé le benchmark etc. mais rien de concluant.

Rahe avatar May 15 '23 07:05 Rahe

source: le CTO de Fasterize au We Love Speed il a évoqué HTTP2

herewithme avatar May 15 '23 08:05 herewithme

@Rahe Le top 10 des perles webperf — Stéphane Rios — We Love Speed 2023 Le top 10 des perles webperf — Stéphane Rios — We Love Speed 2023

Voir aussi cet article : https://cloudfour.com/thinks/svg-icon-stress-test/

firestar300 avatar May 17 '23 15:05 firestar300

Ok, mais ça ne compare pas les perfs entre les 4-5 méthodes. Je check la vidéo.

Rahe avatar May 22 '23 15:05 Rahe

Bon son arugmentaire : "on a du http2 ne faites plus de sprites" me semble léger quand même. Tu peux faire un bench avec les 2 techniques sur la même base ?

  • Sprite
  • Fichier seuls

En HTTP2.

Rahe avatar May 22 '23 15:05 Rahe

Hey,

J'ai fait des ptits tests de mon côté :

  • https://devnico.beapi.space/test-svg/ : fichiers individuels
  • https://devnico.beapi.space/test-svg/index2.php : un sprite

Au final, la différence se situe sur le temps du premier print significatif. fichiers : tôt sprite : plus tard

Type FCP LCP Taille DomcontentLoaded
Sprite 0,2 0 641Kb 79ms
Fichiers 0,31 0,31 908Kb 401ms
Sprite 3G - CPUX4 1,0 0 641Kb 0,91s
Fichiers 3G - CPUX4 0,73 0,373 908Kb 1,38s

On a donc des performances moins bonnes en cache vidé, un temps de chargement plus lent et un poids plus important.

Cependant en sprite, l'interface "pop" au lieu d'avoir fichier par fichier qui peuvent être optimisés en http2 on a un payload.

Il faut aussi souligner qu'une fois les fichiers en cache, la version fichier par fichier est plus rapide : 140ms en fichiers en moyenne vs 260ms en sprite en moyenne.

Les fichiers peuvent aussi être lazyload fichiers par fichiers, là où le sprite ne peut pas être évité. Le preload/fetchpriority peut aussi entrer en jeu permettant de preload quelques icônes en haut de page, laissant la possibilité d'avoir un plsu petit payload pour les fichiers.

A la lumière de tout ça, j'aurai tendance à faire du fichier par fichier aussi. Mon exemple n'est pas "représentatif" car on a une page avec 84 icônes mais ça permet de grossir les résultats.

Qu'en pensez-vous ? :)

Rahe avatar May 25 '23 13:05 Rahe

Je pense que tu pourrais faire un article sur le blog de BE API avec tes tests :)

herewithme avatar May 25 '23 13:05 herewithme

TODO : report de la configuration SPF de @ptesei sur cette PR ?

francoistibo avatar Jun 05 '23 15:06 francoistibo

pb soulevé par @n-langle : on perd les classe pour les viser directement. solution de contournement, on utilise un wrapper.

francoistibo avatar Jun 19 '23 14:06 francoistibo

20.11 : acter si on part sur des SVG inline ou des Sprites (ou un mix des 2)

francoistibo avatar Nov 20 '23 15:11 francoistibo

Partir sur un mix des deux pratiques :

  1. Pour les icônes "d'interface" utiliser un sprite
  2. Pour les icônes contribuées en plus : utiliser les fichiers + le sprite rendu disponible dans le selecteur d'icônes

Rahe avatar Nov 24 '23 10:11 Rahe

pb soulevé par @n-langle : on perd les classe pour les viser directement. solution de contournement, on utilise un wrapper.

Fonctionnalité ajouté dans https://github.com/BeAPI/beapi-frontend-framework/pull/347/commits/4a2e0fa191019562377967b05a48398511adf4ed.

firestar300 avatar Jan 15 '24 15:01 firestar300