Repository navigation
perf(theme): add a core web vitals baseline - #520
francoistibo wants to merge 5 commits into
Conversation
Revue perf backendTrès bon socle CWV dans l'ensemble (LCP / CLS / INP bien ciblés, README honnête sur ce qui reste par projet). Mon seul vrai point de vigilance est backend, et il est concentré dans I/O fichier répété, non cachéAujourd'hui, chaque appel de
Soit ~3-4 syscalls fichier + un read + de la regex par image. En boucle (ex. archive de 80 cartes avec placeholder), c'est un pattern N+1 sur le filesystem. Important : sur une infra où le web root / le thème est monté en réseau (NFS, EFS, montage partagé multi-front), chaque Pistes (par ordre de préférence)
Secondaire : Benchmark avant/après souhaitéAvant merge, j'aimerais un A/B
Critères : sur cache chaud, le coût doit être ~indépendant de N et Point annexe à mesurer
|
|
Good job, merci @francoistibo :) |
|
@asadowski10 voilà une PR qui reprend ce que j'ai pu faire de générique en terme de perf sur Liora. y'a quasi la meme sur BBT. on va repasser sur tout ce qui touche a nos pratiques TD en réunion d'équipe, et je veux bien une petite review plugin dev ensuite |
|
@herewithme dans ce commit, Les dimensions des images statiques sont maintenant calculées au build et stockées dans dist/assets.json (imageDimensions) ; au runtime on lit le manifeste déjà en cache, donc plus de lecture fichier en boucle sur un thème buildé. Fallback fichier une fois par chemin/requête si l’asset n’est pas dans le manifeste. URI mémoïsée, sans double résolution child/parent quand il n’y a pas de thème enfant. |
Top, un bench avant/après ? :) |
1498fe6 to
b82bd4f
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit b82bd4f. Configure here.
Give projects opt-in LCP images, sized static images, a low-priority logo, idle JS init, and scroll-free animations so new themes start closer to good CWV scores. Co-authored-by: Cursor <cursoragent@cursor.com>
e6b84fc to
99859f7
Compare

Dotez les projets d'images LCP « opt-in », d'images statiques redimensionnées, d'un logo à faible priorité, d'une initialisation JavaScript en mode veille et d'animations sans défilement, afin que les nouveaux thèmes démarrent avec des scores CWV plus proches de la moyenne.
Résumé
get_the_image()(is_lcp) :fetchpriority="high",decoding="sync", pas deloading="lazy".fetchpriority="high"n'est jamais combiné avecloading="lazy".get_theme_static_image_markup()/the_theme_static_image():widthetheightlus dans le fichier du thème (SVG ou raster) pour limiter le CLS. Unaltvide est rendualt=""(image décorative) ;falseounullretire l'attribut.alt=""quand l'appelant le demande sur une image de la médiathèque, pour que les technologies d'assistance ignorent l'image.fetchpriority="low", pour qu'il ne concurrence pas la vraie image LCP.bea_theme_framework_preload_fonts. La liste est vide par défaut : seuls les fichiers réellement affichés au premier rendu doivent y figurer.Animationpar unIntersectionObserverpartagé. Les options (start,end,playOnce,hideOnReachEnd) et les callbacks (onInit,onShow,onHide,onDestroy) restent les mêmes.deferInitialization()pour lancer le JavaScript non critique au repos du navigateur (INP).robots.txt, cache, fonts, embeds tiers) dans le README.Plan de test
the_image()avec'is_lcp' => trueproduitfetchpriority="high",decoding="sync"et aucunloading="lazy".the_image()avec'alt' => ''produitalt="".the_theme_static_image()sur un SVG qui awidthetheightreprend ces attributs etalt="".fetchpriority="low".bea_theme_framework_preload_fonts, aucun<link rel="preload" as="font">n'est imprimé..js-animation-opacityreçoitis-visibleen entrant dans le viewport, et reste masqué avant.prefers-reduced-motionet l'impression désactivent toujours les animations.Note
Medium Risk
Touche le rendu d’images (LCP, attributs) et le comportement des animations au scroll ; des régressions visuelles ou de timing sont possibles sur les thèmes qui s’appuient sur l’ancien
ScrollObserver.Overview
Introduit une base Core Web Vitals pour les thèmes BFF : helpers d’images, build, perf front et doc.
Images :
get_the_image()accepte'is_lcp' => true(opt-in) pour retirer le lazy-load et poserfetchpriority="high";decodingn’est plus imposé par le thème, seulement via$attributes. Les helpers refusentfetchpriority="high"avecloading="lazy". Nouveauxget_theme_static_image_markup()/the_theme_static_image()pour les assetsdist/:width/height(anti-CLS),alt=""par défaut pour le décoratif, markup viaWP_HTML_Tag_Processor. Les dimensions viennent deimageDimensionsdansdist/assets.json, alimenté au build parWebpackStaticImageDimensionsPlugin(sharp / parsing SVG), avec repli lecture disque si le manifeste manque. Le serviceAssetsexposeget_static_image_dimensions()et tolère mieux un manifeste partiel.Perf : filtre vide par défaut
bea_theme_framework_preload_fonts→<link rel="preload">woff2 enwp_head. JS :Animationpasse d’une boucle scroll (ScrollObserver) à desIntersectionObserverpartagés parrootMargin(mêmes options/callbacks, repli si IO indisponible). NouveaudeferInitialization()(requestIdleCallback+ timeout).Build / styles : plugin webpack enregistré dans
config/plugins.js. Petites mises à jour Dart Sass (map.get,sass()). README et CHANGELOG détaillent LCP, ARI/is_lcp, polices et responsabilités projet.Reviewed by Cursor Bugbot for commit bd99d38. Bugbot is set up for automated code reviews on this repo. Configure here.