Introduction đ
Mon Ă©quipe et moi avons rĂ©cemment rencontrĂ© un problĂšme alors que nous travaillions sur un projet Sitecore XM Cloud qui sâest avĂ©rĂ© assez intĂ©ressant. Le problĂšme Ă©tait liĂ© au fait que les images publiĂ©es sur Experience Edge ne se chargeaient pas comme prĂ©vu dans certains rendus. Les requĂȘtes GET pour ces images dans Experience Edge renverraient un 404
code dâĂ©tat plutĂŽt que le code attendu 200
. Ce problĂšme ne semblait se produire que pour les images rĂ©cemment mises Ă jour et les nouvelles images rĂ©cemment publiĂ©es sur Experience Edge. De plus (et cela prĂȘte Ă confusion), des images plus anciennes et existantes (qui nâĂ©taient pas rĂ©cemment publiĂ©) toujours chargĂ© comme prĂ©vu.
Pour le contexte, notre solution XM Cloud propose une application principale Next.js hébergée sur Vercel en utilisant la version Next.js 12.2.5
et @sitecore-jss/sitecore-jss-nextjs
version 21.0.0
. Notre solution utilise exclusivement la langue anglaise (en
).
EnquĂȘte đ
AprĂšs avoir exclu les Ă©lĂ©ments typiques comme sâassurer que tout a Ă©tĂ© publiĂ© (et republiĂ©), vĂ©rifier les associations aux Ă©lĂ©ments de source de donnĂ©es, vĂ©rifier la rĂ©ponse GraphQL du service de mise en page et mĂȘme vider le cache Experience Edge, nous avons choisi dâouvrir un ticket avec Sitecore. Je voulais voir si dâautres membres de la communautĂ© Sitecore avaient vĂ©cu quelque chose de similaire, jâai donc posĂ© une question dans la communautĂ© Sitecore Slack et jâai finalement créé un message correspondant. question sur Ăchange de pile Sitecore.
Pendant que le ticket Sitecore mijotait, notre Ă©quipe a continuĂ© Ă dĂ©panner les URL des images. LâURL provenant du service de mise en page ressemblait Ă ceci (Ă titre dâexemple) :
https://edge.sitecorecloud.io/<tenant>/media/foo.jpg?h=495&iar=0&w=692&sc_lang=en
â
(200)
Dâaccord, cool ; cette URL a Ă©tĂ© rĂ©solue lors de la navigation directe. En regardant le balisage rendu sur les pages problĂ©matiques, il a Ă©tĂ© notĂ© que seuls les composants utilisant des images rĂ©actives (rĂ©fĂ©rence) a exposĂ© le problĂšme. Le Image
composant (du @sitecore-jss/sitecore-jss-nextjs
forfait) comprend une propriété, srcSet
, pour prendre en charge les images réactives. Le rendu <img>
la balise ressemblait à ceci :
<img ... width="692" height="495" class="img-responsive" loading="lazy" srcset="https://edge.sitecorecloud.io/<tenant>/media/foo.jpg?mw=991 991w" src="https://edge.sitecorecloud.io/<tenant>/media/foo.jpg?h=495&iar=0&w=692&sc_lang=en">
Le src
LâURL de lâattribut a Ă©tĂ© rĂ©solue comme prĂ©vu. Cependant, le srcset
Attribut dâURL associĂ© au 991
largeur nâa pas rĂ©soudre comme prĂ©vu :
https://edge.sitecorecloud.io/<tenant>/media/foo.jpg?mw=991
â(404)
Fait intéressant, aprÚs avoir ajouté manuellement le sc_lang
paramĂštre Ă lâURL, il a fait rĂ©soudre comme prĂ©vu :
https://edge.sitecorecloud.io/<tenant>/media/foo.jpg?mw=991&sc_lang=en
â
(200)
Pourquoi serait sc_lang
ĂȘtre obligĂ© de rĂ©cupĂ©rer des images alors que cela ne lâĂ©tait pas auparavant ? Eh bien, le support Sitecore avait une rĂ©ponse : une correction de bug affectant versionnĂ© des Ă©lĂ©ments multimĂ©dias ont rĂ©cemment Ă©tĂ© dĂ©ployĂ©s sur Experience Edge. En regardant le journal des modifications de XM Cloud (ici), JE pense ce Ă©tait la mise Ă jour spĂ©cifique ; cependant, je nâen suis pas sĂ»r car il y a plusieurs entrĂ©es apparemment adjacentes dans le journal des modifications.
Si
languageEmbedding
est réglé sur jamais dans leurlbuilder.config
déposer,mediaItem
les entités renvoient désormais lesc_lang
paramĂštre.
Le changement tel quâexpliquĂ© par le support Sitecore :
[In Experience Edge] Lorsquâun Ă©lĂ©ment multimĂ©dia est publiĂ©, un
MediaItem
lâentitĂ© est gĂ©nĂ©rĂ©e par la mĂ©thode suivante sur CM :Sitecore.ExperienceEdge.Connector.EntityGenerator.MediaDeliveryEntityGenerator.GenerateMediaEntity(...)
Ce
MediaItem
lâentitĂ© comporte plusieurs champs contenant des URL et des chemins dâaccĂšs aux mĂ©dias.Pour les Ă©lĂ©ments multimĂ©dias versionnĂ©s, chacun de ces champs doit contenir le
sc_lang
paramĂštre.
Sortie nette : Depuis environ 2 mois, si vous le souhaitez versionné images publiées sur Experience Edge pour se charger correctement, vous avoir pour inclure le sc_lang
paramĂštre. Experience Edge nâest pas par dĂ©faut en
et nâinclut pas de solution de secours dans le cas contraire, si sc_lang
nâest pas prĂ©sent, vous obtiendrez un 404
.
Ce changement, associé au fait que le Image
composant dans le @sitecore-jss/sitecore-jss-nextjs
emballer se déshabille le sc_lang
paramÚtre lors de la résolution des différents srcset
Les URL signifiaient que nos images versionnées utilisées comme images réactives ne se chargeaient pas correctement sur le front-end.
CâĂ©tait en quelque sorte une tempĂȘte parfaite compte tenu des Ă©lĂ©ments suivants :
- Le correctif Experience Edge pour les éléments multimédias versionnés a probablement été publié fin février.
- Notre Ă©quipe de dĂ©veloppement et les auteurs de contenu nâavaient pas mis Ă jour, ajoutĂ© ou publiĂ© des Ă©lĂ©ments multimĂ©dias depuis un certain temps, le problĂšme nâa donc pas Ă©tĂ© immĂ©diatement remarquĂ©. En dâautres termes, peu dâimages versionnĂ©es ont Ă©tĂ© publiĂ©es sur Experience Edge.
- Le
Image
ComposantssrcSet
la propriĂ©tĂ© Ă©tait utilisĂ©e, ce qui transformait en consĂ©quence lâURL provenant du service de mise en page, mais, ce faisant, supprimait le (maintenant requis)sc_lang
paramĂštre. đ
La solution â
Forts de la connaissance quâĂ lâavenir, les images versionnĂ©es publiĂ©es sur Experience Edge exiger le sc_lang
paramĂštre, jâai commencĂ© Ă implĂ©menter un correctif pour nos rendus en utilisant le srcSet
propriété du Image
composant. Jâai fini par crĂ©er une petite fonction dâassistance pour faire abstraction de lâanalyse de la chaĂźne de requĂȘte et de lâinclusion conditionnelle du sc_lang
paramÚtre dans le tableau passé dans le srcSet
propriĂ©tĂ© (comme recommandĂ© par le support Sitecore). La fonction dâassistance ressemblait Ă ceci :
export const buildSrcSetParams = (imageSizeParameters: ImageSizeParameters[] | undefined, image: ImageField): ImageSizeParameters[] | undefined => { let retVal = imageSizeParameters; if (!image?.value?.src) { return retVal; } const queryParams = new URLSearchParams(image.value.src.split('?')[1]); const scLangParam = queryParams.get('sc_lang'); if (retVal && scLangParam) { // add sc_lang parameter retVal = retVal.map((isp) => ({ ...isp, sc_lang: scLangParam, })); } return retVal; };
Auparavant, le Image
les composants ressemblaient à ceci :
<Image field={props?.fields?.Image} srcSet={ [ { mw: 991 } ] } ... />
En utilisant la nouvelle fonction dâassistance, ils ressemblaient Ă ceci :
<Image field={props?.fields?.Image} srcSet={buildSrcSetParams([ { mw: 991 } ], props?.fields?.Image) } ... />
Maintenant, au lieu du srcset
URL résolue en :
https://edge.sitecorecloud.io/<tenant>/media/foo.jpg?mw=991
â(404
)
Il a résolu de :
https://edge.sitecorecloud.io/<tenant>/media/foo.jpg?mw=991&sc_lang=en
â
(200
)
PensĂ©es finales đ
De toute Ă©vidence, devoir apporter, tester et dĂ©ployer une modification de code en production en rĂ©ponse Ă un correctif de bogue Experience Edge nâĂ©tait pas gĂ©nial. On peut soutenir que Experience Edge reviendrait Ă une langue par dĂ©faut configurable (par exemple en
) ou vers une image non versionnée, si disponible.
Depuis le 17/04/2024, le support Sitecore a confirmé que ce scénario était reproductible en utilisant la version
21.6.0
de la@sitecore-jss/sitecore-jss-nextjs
package et que lâĂ©quipe produit examinerait plus en dĂ©tail.
Le 23/04/2024, le support Sitecore a reconnu ce problÚme comme un bug et a émis un numéro de référence : JSS-1902.
Les produits SaaS de Sitecore tels que XM Cloud et Experience Edge Ă©voluent et sâamĂ©liorent constamment, ce qui est formidable ; en fait, câest un argument de vente majeur lorsquâil sâagit dâadopter XM Cloud. IdĂ©alement, notre Ă©quipe aurait eu connaissance ou aurait Ă©tĂ© informĂ©e de ce changement radical Ă lâavance. Comment aurions-nous fait cela ? Je ne suis pas sĂ»r, sauf peut-ĂȘtre en suivant dâun peu plus prĂšs le journal des modifications de XM Cloud đ .
Source link