[{"data":1,"prerenderedAt":1548},["ShallowReactive",2],{"article-alternates":3,"article-\u002Ffr\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimisation":13},{"i18nKey":4,"paths":5},"tech-001-2026-05",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimierung","\u002Fen\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimization","\u002Fes\u002Ftech\u002Fnuxt3-cloudflare-pages-lcp-optimizacion","\u002Ffr\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimisation","\u002Fit\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-ottimizzazione","\u002Fru\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimization","\u002Ftr\u002Ftech\u002Fnuxt-3-cloudflare-pages-10s-lcpden-2sye",{"_path":9,"_dir":14,"_draft":15,"_partial":15,"_locale":16,"title":17,"description":18,"publishedAt":19,"modifiedAt":19,"category":14,"i18nKey":4,"tags":20,"readingTime":26,"author":27,"body":28,"_type":1542,"_id":1543,"_source":1544,"_file":1545,"_stem":1546,"_extension":1547},"tech",false,"","Nuxt 3 + Cloudflare Pages : réduire le LCP de 10s à 2s","Polices auto-hébergées, hydratation sélective, content-visibility et cache edge : nous avons réduit le LCP de 80%. Benchmarks réels, code et compromis.","2026-05-07",[21,22,23,24,25],"nuxt3","cloudflare-pages","web-performance","lcp","edge-caching",9,"Roibase",{"type":29,"children":30,"toc":1531},"root",[31,47,54,59,105,110,116,154,557,567,578,599,707,720,806,823,829,858,1002,1015,1024,1030,1043,1205,1218,1234,1240,1245,1375,1391,1397,1422,1432,1449,1466,1472,1477,1521,1526],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36,39,45],{"type":37,"value":38},"text","Après la mise à jour des Core Web Vitals de Google, le LCP (Largest Contentful Paint) doit rester en dessous de 2,5 secondes, sinon le classement organique et le taux de conversion chutent. Lorsque nous avons migré un site e-commerce vers la pile Nuxt 3 + Cloudflare Pages, le premier déploiement a laissé le LCP à 10,2 secondes. En combinant une stratégie de polices auto-hébergées, une hydratation sélective, la propriété CSS ",{"type":32,"tag":40,"props":41,"children":42},"em",{},[43],{"type":37,"value":44},"content-visibility",{"type":37,"value":46}," et le cache edge, nous avons ramené cela à 2,1 secondes. Voici comment chaque modification a contribué au gain, les compromis et le code.",{"type":32,"tag":48,"props":49,"children":51},"h2",{"id":50},"diagnostiquer-le-problème-lanatomie-du-lcp-de-10s",[52],{"type":37,"value":53},"Diagnostiquer le problème : l'anatomie du LCP de 10s",{"type":32,"tag":33,"props":55,"children":56},{},[57],{"type":37,"value":58},"Le rapport CrUX initial montrait un LCP médian de 10,2s et un TBT (Total Blocking Time) de 2190ms. L'analyse du profil Lighthouse de Chrome DevTools a révélé :",{"type":32,"tag":60,"props":61,"children":62},"ul",{},[63,75,85,95],{"type":32,"tag":64,"props":65,"children":66},"li",{},[67,73],{"type":32,"tag":68,"props":69,"children":70},"strong",{},[71],{"type":37,"value":72},"Chargement des polices :",{"type":37,"value":74}," trois familles de polices depuis le CDN Google Fonts, bloquant le rendu",{"type":32,"tag":64,"props":76,"children":77},{},[78,83],{"type":32,"tag":68,"props":79,"children":80},{},[81],{"type":37,"value":82},"Hydratation JavaScript :",{"type":37,"value":84}," bundle de 420kB, toute la page s'hydrate",{"type":32,"tag":64,"props":86,"children":87},{},[88,93],{"type":32,"tag":68,"props":89,"children":90},{},[91],{"type":37,"value":92},"Image au-dessus de la ligne de flottaison :",{"type":37,"value":94}," JPEG 1,2MB, pas de chargement différé",{"type":32,"tag":64,"props":96,"children":97},{},[98,103],{"type":32,"tag":68,"props":99,"children":100},{},[101],{"type":37,"value":102},"Cache Cloudflare :",{"type":37,"value":104}," la réponse SSR n'est pas mise en cache, chaque requête atteint l'origine",{"type":32,"tag":33,"props":106,"children":107},{},[108],{"type":37,"value":109},"Mesure de base : score mobile PageSpeed Insights 34\u002F100. Desktop 62\u002F100. Ces chiffres après migration depuis Shopify Liquid vers Nuxt 3 — le changement de framework seul n'apporte aucun gain de performance, une optimisation architecturale est nécessaire.",{"type":32,"tag":48,"props":111,"children":113},{"id":112},"stratégie-de-polices-auto-hébergées-preload",[114],{"type":37,"value":115},"Stratégie de polices auto-hébergées + preload",{"type":32,"tag":33,"props":117,"children":118},{},[119,121,128,130,136,138,144,146,152],{"type":37,"value":120},"Nous avons téléchargé les mêmes fichiers de polices du service Google Fonts dans le répertoire ",{"type":32,"tag":122,"props":123,"children":125},"code",{"className":124},[],[126],{"type":37,"value":127},"public\u002Ffonts\u002F",{"type":37,"value":129}," et déplacé la définition ",{"type":32,"tag":122,"props":131,"children":133},{"className":132},[],[134],{"type":37,"value":135},"@font-face",{"type":37,"value":137}," dans ",{"type":32,"tag":122,"props":139,"children":141},{"className":140},[],[142],{"type":37,"value":143},"app.vue",{"type":37,"value":145},". La différence clé : avec ",{"type":32,"tag":122,"props":147,"children":149},{"className":148},[],[150],{"type":37,"value":151},"\u003Clink rel=\"preload\">",{"type":37,"value":153},", nous demandons les fichiers de polices dans la réponse HTML initiale, avant le parsing CSS.",{"type":32,"tag":155,"props":156,"children":160},"pre",{"className":157,"code":158,"language":159,"meta":16,"style":16},"language-vue shiki shiki-themes github-dark","\u003C!-- app.vue -->\n\u003Cscript setup>\nuseHead({\n  link: [\n    {\n      rel: 'preload',\n      href: '\u002Ffonts\u002Finter-var.woff2',\n      as: 'font',\n      type: 'font\u002Fwoff2',\n      crossorigin: 'anonymous'\n    }\n  ]\n})\n\u003C\u002Fscript>\n\n\u003Cstyle>\n@font-face {\n  font-family: 'Inter';\n  src: url('\u002Ffonts\u002Finter-var.woff2') format('woff2');\n  font-display: swap;\n  font-weight: 100 900;\n}\n\u003C\u002Fstyle>\n","vue",[161],{"type":32,"tag":122,"props":162,"children":163},{"__ignoreMap":16},[164,176,203,217,226,235,255,273,291,308,322,331,340,349,366,376,393,407,432,483,505,532,541],{"type":32,"tag":165,"props":166,"children":169},"span",{"class":167,"line":168},"line",1,[170],{"type":32,"tag":165,"props":171,"children":173},{"style":172},"--shiki-default:#6A737D",[174],{"type":37,"value":175},"\u003C!-- app.vue -->\n",{"type":32,"tag":165,"props":177,"children":179},{"class":167,"line":178},2,[180,186,192,198],{"type":32,"tag":165,"props":181,"children":183},{"style":182},"--shiki-default:#E1E4E8",[184],{"type":37,"value":185},"\u003C",{"type":32,"tag":165,"props":187,"children":189},{"style":188},"--shiki-default:#85E89D",[190],{"type":37,"value":191},"script",{"type":32,"tag":165,"props":193,"children":195},{"style":194},"--shiki-default:#B392F0",[196],{"type":37,"value":197}," setup",{"type":32,"tag":165,"props":199,"children":200},{"style":182},[201],{"type":37,"value":202},">\n",{"type":32,"tag":165,"props":204,"children":206},{"class":167,"line":205},3,[207,212],{"type":32,"tag":165,"props":208,"children":209},{"style":194},[210],{"type":37,"value":211},"useHead",{"type":32,"tag":165,"props":213,"children":214},{"style":182},[215],{"type":37,"value":216},"({\n",{"type":32,"tag":165,"props":218,"children":220},{"class":167,"line":219},4,[221],{"type":32,"tag":165,"props":222,"children":223},{"style":182},[224],{"type":37,"value":225},"  link: [\n",{"type":32,"tag":165,"props":227,"children":229},{"class":167,"line":228},5,[230],{"type":32,"tag":165,"props":231,"children":232},{"style":182},[233],{"type":37,"value":234},"    {\n",{"type":32,"tag":165,"props":236,"children":238},{"class":167,"line":237},6,[239,244,250],{"type":32,"tag":165,"props":240,"children":241},{"style":182},[242],{"type":37,"value":243},"      rel: ",{"type":32,"tag":165,"props":245,"children":247},{"style":246},"--shiki-default:#9ECBFF",[248],{"type":37,"value":249},"'preload'",{"type":32,"tag":165,"props":251,"children":252},{"style":182},[253],{"type":37,"value":254},",\n",{"type":32,"tag":165,"props":256,"children":258},{"class":167,"line":257},7,[259,264,269],{"type":32,"tag":165,"props":260,"children":261},{"style":182},[262],{"type":37,"value":263},"      href: ",{"type":32,"tag":165,"props":265,"children":266},{"style":246},[267],{"type":37,"value":268},"'\u002Ffonts\u002Finter-var.woff2'",{"type":32,"tag":165,"props":270,"children":271},{"style":182},[272],{"type":37,"value":254},{"type":32,"tag":165,"props":274,"children":276},{"class":167,"line":275},8,[277,282,287],{"type":32,"tag":165,"props":278,"children":279},{"style":182},[280],{"type":37,"value":281},"      as: ",{"type":32,"tag":165,"props":283,"children":284},{"style":246},[285],{"type":37,"value":286},"'font'",{"type":32,"tag":165,"props":288,"children":289},{"style":182},[290],{"type":37,"value":254},{"type":32,"tag":165,"props":292,"children":293},{"class":167,"line":26},[294,299,304],{"type":32,"tag":165,"props":295,"children":296},{"style":182},[297],{"type":37,"value":298},"      type: ",{"type":32,"tag":165,"props":300,"children":301},{"style":246},[302],{"type":37,"value":303},"'font\u002Fwoff2'",{"type":32,"tag":165,"props":305,"children":306},{"style":182},[307],{"type":37,"value":254},{"type":32,"tag":165,"props":309,"children":311},{"class":167,"line":310},10,[312,317],{"type":32,"tag":165,"props":313,"children":314},{"style":182},[315],{"type":37,"value":316},"      crossorigin: ",{"type":32,"tag":165,"props":318,"children":319},{"style":246},[320],{"type":37,"value":321},"'anonymous'\n",{"type":32,"tag":165,"props":323,"children":325},{"class":167,"line":324},11,[326],{"type":32,"tag":165,"props":327,"children":328},{"style":182},[329],{"type":37,"value":330},"    }\n",{"type":32,"tag":165,"props":332,"children":334},{"class":167,"line":333},12,[335],{"type":32,"tag":165,"props":336,"children":337},{"style":182},[338],{"type":37,"value":339},"  ]\n",{"type":32,"tag":165,"props":341,"children":343},{"class":167,"line":342},13,[344],{"type":32,"tag":165,"props":345,"children":346},{"style":182},[347],{"type":37,"value":348},"})\n",{"type":32,"tag":165,"props":350,"children":352},{"class":167,"line":351},14,[353,358,362],{"type":32,"tag":165,"props":354,"children":355},{"style":182},[356],{"type":37,"value":357},"\u003C\u002F",{"type":32,"tag":165,"props":359,"children":360},{"style":188},[361],{"type":37,"value":191},{"type":32,"tag":165,"props":363,"children":364},{"style":182},[365],{"type":37,"value":202},{"type":32,"tag":165,"props":367,"children":369},{"class":167,"line":368},15,[370],{"type":32,"tag":165,"props":371,"children":373},{"emptyLinePlaceholder":372},true,[374],{"type":37,"value":375},"\n",{"type":32,"tag":165,"props":377,"children":379},{"class":167,"line":378},16,[380,384,389],{"type":32,"tag":165,"props":381,"children":382},{"style":182},[383],{"type":37,"value":185},{"type":32,"tag":165,"props":385,"children":386},{"style":188},[387],{"type":37,"value":388},"style",{"type":32,"tag":165,"props":390,"children":391},{"style":182},[392],{"type":37,"value":202},{"type":32,"tag":165,"props":394,"children":396},{"class":167,"line":395},17,[397,402],{"type":32,"tag":165,"props":398,"children":400},{"style":399},"--shiki-default:#F97583",[401],{"type":37,"value":135},{"type":32,"tag":165,"props":403,"children":404},{"style":182},[405],{"type":37,"value":406}," {\n",{"type":32,"tag":165,"props":408,"children":410},{"class":167,"line":409},18,[411,417,422,427],{"type":32,"tag":165,"props":412,"children":414},{"style":413},"--shiki-default:#79B8FF",[415],{"type":37,"value":416},"  font-family",{"type":32,"tag":165,"props":418,"children":419},{"style":182},[420],{"type":37,"value":421},": ",{"type":32,"tag":165,"props":423,"children":424},{"style":246},[425],{"type":37,"value":426},"'Inter'",{"type":32,"tag":165,"props":428,"children":429},{"style":182},[430],{"type":37,"value":431},";\n",{"type":32,"tag":165,"props":433,"children":435},{"class":167,"line":434},19,[436,441,445,450,455,459,464,469,473,478],{"type":32,"tag":165,"props":437,"children":438},{"style":413},[439],{"type":37,"value":440},"  src",{"type":32,"tag":165,"props":442,"children":443},{"style":182},[444],{"type":37,"value":421},{"type":32,"tag":165,"props":446,"children":447},{"style":413},[448],{"type":37,"value":449},"url",{"type":32,"tag":165,"props":451,"children":452},{"style":182},[453],{"type":37,"value":454},"(",{"type":32,"tag":165,"props":456,"children":457},{"style":246},[458],{"type":37,"value":268},{"type":32,"tag":165,"props":460,"children":461},{"style":182},[462],{"type":37,"value":463},") ",{"type":32,"tag":165,"props":465,"children":466},{"style":413},[467],{"type":37,"value":468},"format",{"type":32,"tag":165,"props":470,"children":471},{"style":182},[472],{"type":37,"value":454},{"type":32,"tag":165,"props":474,"children":475},{"style":246},[476],{"type":37,"value":477},"'woff2'",{"type":32,"tag":165,"props":479,"children":480},{"style":182},[481],{"type":37,"value":482},");\n",{"type":32,"tag":165,"props":484,"children":486},{"class":167,"line":485},20,[487,492,496,501],{"type":32,"tag":165,"props":488,"children":489},{"style":413},[490],{"type":37,"value":491},"  font-display",{"type":32,"tag":165,"props":493,"children":494},{"style":182},[495],{"type":37,"value":421},{"type":32,"tag":165,"props":497,"children":498},{"style":413},[499],{"type":37,"value":500},"swap",{"type":32,"tag":165,"props":502,"children":503},{"style":182},[504],{"type":37,"value":431},{"type":32,"tag":165,"props":506,"children":508},{"class":167,"line":507},21,[509,514,518,523,528],{"type":32,"tag":165,"props":510,"children":511},{"style":413},[512],{"type":37,"value":513},"  font-weight",{"type":32,"tag":165,"props":515,"children":516},{"style":182},[517],{"type":37,"value":421},{"type":32,"tag":165,"props":519,"children":520},{"style":413},[521],{"type":37,"value":522},"100",{"type":32,"tag":165,"props":524,"children":525},{"style":413},[526],{"type":37,"value":527}," 900",{"type":32,"tag":165,"props":529,"children":530},{"style":182},[531],{"type":37,"value":431},{"type":32,"tag":165,"props":533,"children":535},{"class":167,"line":534},22,[536],{"type":32,"tag":165,"props":537,"children":538},{"style":182},[539],{"type":37,"value":540},"}\n",{"type":32,"tag":165,"props":542,"children":544},{"class":167,"line":543},23,[545,549,553],{"type":32,"tag":165,"props":546,"children":547},{"style":182},[548],{"type":37,"value":357},{"type":32,"tag":165,"props":550,"children":551},{"style":188},[552],{"type":37,"value":388},{"type":32,"tag":165,"props":554,"children":555},{"style":182},[556],{"type":37,"value":202},{"type":32,"tag":33,"props":558,"children":559},{},[560,565],{"type":32,"tag":68,"props":561,"children":562},{},[563],{"type":37,"value":564},"Gain :",{"type":37,"value":566}," LCP 10,2s → 7,8s (baisse de 2,4s). Le chargement des polices n'est plus bloquant, le délai FOIT (Flash of Invisible Text) passe de 1200ms à 180ms. Compromis : les fichiers de polices se trouvent désormais sur notre CDN, la gestion des versions doit être manuelle (nous avons résolu cela avec un bucket Cloudflare R2 + en-têtes Cache-Control).",{"type":32,"tag":48,"props":568,"children":570},{"id":569},"hydratation-sélective-content-visibility",[571,573],{"type":37,"value":572},"Hydratation sélective + ",{"type":32,"tag":122,"props":574,"children":576},{"className":575},[],[577],{"type":37,"value":44},{"type":32,"tag":33,"props":579,"children":580},{},[581,583,589,591,597],{"type":37,"value":582},"Le comportement par défaut de Nuxt 3 est d'hydrater tous les composants. Or, les composants en dehors de la zone visible au-dessus de la ligne de flottaison (pied de page, section des commentaires, produits associés) n'ont pas besoin de s'hydrater avant que l'utilisateur ne fasse défiler. Avec le module ",{"type":32,"tag":122,"props":584,"children":586},{"className":585},[],[587],{"type":37,"value":588},"@nuxt\u002Flazy-hydration",{"type":37,"value":590},", nous avons enveloppé ces composants dans un wrapper ",{"type":32,"tag":122,"props":592,"children":594},{"className":593},[],[595],{"type":37,"value":596},"LazyHydrate",{"type":37,"value":598},".",{"type":32,"tag":155,"props":600,"children":602},{"className":157,"code":601,"language":159,"meta":16,"style":16},"\u003Ctemplate>\n  \u003CLazyHydrate when-visible>\n    \u003CProductRecommendations :product-id=\"productId\" \u002F>\n  \u003C\u002FLazyHydrate>\n\u003C\u002Ftemplate>\n",[603],{"type":32,"tag":122,"props":604,"children":605},{"__ignoreMap":16},[606,622,643,676,692],{"type":32,"tag":165,"props":607,"children":608},{"class":167,"line":168},[609,613,618],{"type":32,"tag":165,"props":610,"children":611},{"style":182},[612],{"type":37,"value":185},{"type":32,"tag":165,"props":614,"children":615},{"style":188},[616],{"type":37,"value":617},"template",{"type":32,"tag":165,"props":619,"children":620},{"style":182},[621],{"type":37,"value":202},{"type":32,"tag":165,"props":623,"children":624},{"class":167,"line":178},[625,630,634,639],{"type":32,"tag":165,"props":626,"children":627},{"style":182},[628],{"type":37,"value":629},"  \u003C",{"type":32,"tag":165,"props":631,"children":632},{"style":188},[633],{"type":37,"value":596},{"type":32,"tag":165,"props":635,"children":636},{"style":194},[637],{"type":37,"value":638}," when-visible",{"type":32,"tag":165,"props":640,"children":641},{"style":182},[642],{"type":37,"value":202},{"type":32,"tag":165,"props":644,"children":645},{"class":167,"line":205},[646,651,656,661,666,671],{"type":32,"tag":165,"props":647,"children":648},{"style":182},[649],{"type":37,"value":650},"    \u003C",{"type":32,"tag":165,"props":652,"children":653},{"style":188},[654],{"type":37,"value":655},"ProductRecommendations",{"type":32,"tag":165,"props":657,"children":658},{"style":194},[659],{"type":37,"value":660}," :product-id",{"type":32,"tag":165,"props":662,"children":663},{"style":182},[664],{"type":37,"value":665},"=",{"type":32,"tag":165,"props":667,"children":668},{"style":246},[669],{"type":37,"value":670},"\"productId\"",{"type":32,"tag":165,"props":672,"children":673},{"style":182},[674],{"type":37,"value":675}," \u002F>\n",{"type":32,"tag":165,"props":677,"children":678},{"class":167,"line":219},[679,684,688],{"type":32,"tag":165,"props":680,"children":681},{"style":182},[682],{"type":37,"value":683},"  \u003C\u002F",{"type":32,"tag":165,"props":685,"children":686},{"style":188},[687],{"type":37,"value":596},{"type":32,"tag":165,"props":689,"children":690},{"style":182},[691],{"type":37,"value":202},{"type":32,"tag":165,"props":693,"children":694},{"class":167,"line":228},[695,699,703],{"type":32,"tag":165,"props":696,"children":697},{"style":182},[698],{"type":37,"value":357},{"type":32,"tag":165,"props":700,"children":701},{"style":188},[702],{"type":37,"value":617},{"type":32,"tag":165,"props":704,"children":705},{"style":182},[706],{"type":37,"value":202},{"type":32,"tag":33,"props":708,"children":709},{},[710,712,718],{"type":37,"value":711},"Côté CSS, ",{"type":32,"tag":122,"props":713,"children":715},{"className":714},[],[716],{"type":37,"value":717},"content-visibility: auto",{"type":37,"value":719}," envoie au navigateur le signal « ne calcule pas le rendu pour cet élément s'il n'est pas dans le viewport » :",{"type":32,"tag":155,"props":721,"children":725},{"className":722,"code":723,"language":724,"meta":16,"style":16},"language-css shiki shiki-themes github-dark",".product-recommendations {\n  content-visibility: auto;\n  contain-intrinsic-size: 0 500px; \u002F* hauteur placeholder *\u002F\n}\n","css",[726],{"type":32,"tag":122,"props":727,"children":728},{"__ignoreMap":16},[729,741,762,799],{"type":32,"tag":165,"props":730,"children":731},{"class":167,"line":168},[732,737],{"type":32,"tag":165,"props":733,"children":734},{"style":194},[735],{"type":37,"value":736},".product-recommendations",{"type":32,"tag":165,"props":738,"children":739},{"style":182},[740],{"type":37,"value":406},{"type":32,"tag":165,"props":742,"children":743},{"class":167,"line":178},[744,749,753,758],{"type":32,"tag":165,"props":745,"children":746},{"style":413},[747],{"type":37,"value":748},"  content-visibility",{"type":32,"tag":165,"props":750,"children":751},{"style":182},[752],{"type":37,"value":421},{"type":32,"tag":165,"props":754,"children":755},{"style":413},[756],{"type":37,"value":757},"auto",{"type":32,"tag":165,"props":759,"children":760},{"style":182},[761],{"type":37,"value":431},{"type":32,"tag":165,"props":763,"children":764},{"class":167,"line":205},[765,770,774,779,784,789,794],{"type":32,"tag":165,"props":766,"children":767},{"style":413},[768],{"type":37,"value":769},"  contain-intrinsic-size",{"type":32,"tag":165,"props":771,"children":772},{"style":182},[773],{"type":37,"value":421},{"type":32,"tag":165,"props":775,"children":776},{"style":413},[777],{"type":37,"value":778},"0",{"type":32,"tag":165,"props":780,"children":781},{"style":413},[782],{"type":37,"value":783}," 500",{"type":32,"tag":165,"props":785,"children":786},{"style":399},[787],{"type":37,"value":788},"px",{"type":32,"tag":165,"props":790,"children":791},{"style":182},[792],{"type":37,"value":793},"; ",{"type":32,"tag":165,"props":795,"children":796},{"style":172},[797],{"type":37,"value":798},"\u002F* hauteur placeholder *\u002F\n",{"type":32,"tag":165,"props":800,"children":801},{"class":167,"line":219},[802],{"type":32,"tag":165,"props":803,"children":804},{"style":182},[805],{"type":37,"value":540},{"type":32,"tag":33,"props":807,"children":808},{},[809,813,815,821],{"type":32,"tag":68,"props":810,"children":811},{},[812],{"type":37,"value":564},{"type":37,"value":814}," TBT 2190ms → 420ms, LCP 7,8s → 4,1s. Le bundle JS initialement chargé passe de 420kB à 180kB (compressé en brotli). Compromis : ",{"type":32,"tag":122,"props":816,"children":818},{"className":817},[],[819],{"type":37,"value":820},"when-visible",{"type":37,"value":822}," utilise l'Intersection Observer API, un polyfill est nécessaire pour les anciens navigateurs comme IE11 (nous ciblions les navigateurs modernes, pas de problème).",{"type":32,"tag":48,"props":824,"children":826},{"id":825},"cache-edge-approche-hybride-isr",[827],{"type":37,"value":828},"Cache edge + approche hybride ISR",{"type":32,"tag":33,"props":830,"children":831},{},[832,834,840,842,848,850,856],{"type":37,"value":833},"Cloudflare Pages met en cache les fichiers statiques par défaut, mais pas les endpoints SSR (en dehors de ",{"type":32,"tag":122,"props":835,"children":837},{"className":836},[],[838],{"type":37,"value":839},"\u002F_nuxt\u002F...",{"type":37,"value":841},"). Nous avons défini dans ",{"type":32,"tag":122,"props":843,"children":845},{"className":844},[],[846],{"type":37,"value":847},"nuxt.config.ts",{"type":37,"value":849}," via ",{"type":32,"tag":122,"props":851,"children":853},{"className":852},[],[854],{"type":37,"value":855},"routeRules",{"type":37,"value":857}," quels chemins sont mis en cache et pour combien de temps :",{"type":32,"tag":155,"props":859,"children":863},{"className":860,"code":861,"language":862,"meta":16,"style":16},"language-ts shiki shiki-themes github-dark","\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  routeRules: {\n    '\u002F': { swr: 3600 }, \u002F\u002F page d'accueil 1h stale-while-revalidate\n    '\u002Fproduit\u002F**': { swr: 1800 }, \u002F\u002F pages produit 30m\n    '\u002Fcategorie\u002F**': { static: true } \u002F\u002F pages catégorie statique build-time\n  }\n})\n","ts",[864],{"type":32,"tag":122,"props":865,"children":866},{"__ignoreMap":16},[867,875,897,905,933,959,987,995],{"type":32,"tag":165,"props":868,"children":869},{"class":167,"line":168},[870],{"type":32,"tag":165,"props":871,"children":872},{"style":172},[873],{"type":37,"value":874},"\u002F\u002F nuxt.config.ts\n",{"type":32,"tag":165,"props":876,"children":877},{"class":167,"line":178},[878,883,888,893],{"type":32,"tag":165,"props":879,"children":880},{"style":399},[881],{"type":37,"value":882},"export",{"type":32,"tag":165,"props":884,"children":885},{"style":399},[886],{"type":37,"value":887}," default",{"type":32,"tag":165,"props":889,"children":890},{"style":194},[891],{"type":37,"value":892}," defineNuxtConfig",{"type":32,"tag":165,"props":894,"children":895},{"style":182},[896],{"type":37,"value":216},{"type":32,"tag":165,"props":898,"children":899},{"class":167,"line":205},[900],{"type":32,"tag":165,"props":901,"children":902},{"style":182},[903],{"type":37,"value":904},"  routeRules: {\n",{"type":32,"tag":165,"props":906,"children":907},{"class":167,"line":219},[908,913,918,923,928],{"type":32,"tag":165,"props":909,"children":910},{"style":246},[911],{"type":37,"value":912},"    '\u002F'",{"type":32,"tag":165,"props":914,"children":915},{"style":182},[916],{"type":37,"value":917},": { swr: ",{"type":32,"tag":165,"props":919,"children":920},{"style":413},[921],{"type":37,"value":922},"3600",{"type":32,"tag":165,"props":924,"children":925},{"style":182},[926],{"type":37,"value":927}," }, ",{"type":32,"tag":165,"props":929,"children":930},{"style":172},[931],{"type":37,"value":932},"\u002F\u002F page d'accueil 1h stale-while-revalidate\n",{"type":32,"tag":165,"props":934,"children":935},{"class":167,"line":228},[936,941,945,950,954],{"type":32,"tag":165,"props":937,"children":938},{"style":246},[939],{"type":37,"value":940},"    '\u002Fproduit\u002F**'",{"type":32,"tag":165,"props":942,"children":943},{"style":182},[944],{"type":37,"value":917},{"type":32,"tag":165,"props":946,"children":947},{"style":413},[948],{"type":37,"value":949},"1800",{"type":32,"tag":165,"props":951,"children":952},{"style":182},[953],{"type":37,"value":927},{"type":32,"tag":165,"props":955,"children":956},{"style":172},[957],{"type":37,"value":958},"\u002F\u002F pages produit 30m\n",{"type":32,"tag":165,"props":960,"children":961},{"class":167,"line":237},[962,967,972,977,982],{"type":32,"tag":165,"props":963,"children":964},{"style":246},[965],{"type":37,"value":966},"    '\u002Fcategorie\u002F**'",{"type":32,"tag":165,"props":968,"children":969},{"style":182},[970],{"type":37,"value":971},": { static: ",{"type":32,"tag":165,"props":973,"children":974},{"style":413},[975],{"type":37,"value":976},"true",{"type":32,"tag":165,"props":978,"children":979},{"style":182},[980],{"type":37,"value":981}," } ",{"type":32,"tag":165,"props":983,"children":984},{"style":172},[985],{"type":37,"value":986},"\u002F\u002F pages catégorie statique build-time\n",{"type":32,"tag":165,"props":988,"children":989},{"class":167,"line":257},[990],{"type":32,"tag":165,"props":991,"children":992},{"style":182},[993],{"type":37,"value":994},"  }\n",{"type":32,"tag":165,"props":996,"children":997},{"class":167,"line":275},[998],{"type":32,"tag":165,"props":999,"children":1000},{"style":182},[1001],{"type":37,"value":348},{"type":32,"tag":33,"props":1003,"children":1004},{},[1005,1007,1013],{"type":37,"value":1006},"La stratégie ",{"type":32,"tag":122,"props":1008,"children":1010},{"className":1009},[],[1011],{"type":37,"value":1012},"swr",{"type":37,"value":1014}," (stale-while-revalidate) : la première requête rend le SSR, les requêtes suivantes viennent du cache, le serveur le re-rend en arrière-plan. Nous avons utilisé le KV store de Cloudflare avec comme clé de cache l'URL + le segment utilisateur (connecté\u002Fanonyme).",{"type":32,"tag":33,"props":1016,"children":1017},{},[1018,1022],{"type":32,"tag":68,"props":1019,"children":1020},{},[1021],{"type":37,"value":564},{"type":37,"value":1023}," TTFB (Time to First Byte) 840ms → 120ms, LCP 4,1s → 2,3s. Le taux de hit cache s'est élevé à 78% la première semaine. Compromis : la personnalisation dépend de la clé de cache ; par exemple, le nombre de produits dans le panier ne peut pas être mis en cache, les données utilisateur spécifiques sont récupérées côté client.",{"type":32,"tag":48,"props":1025,"children":1027},{"id":1026},"optimisation-des-images-au-dessus-de-la-ligne-de-flottaison",[1028],{"type":37,"value":1029},"Optimisation des images au-dessus de la ligne de flottaison",{"type":32,"tag":33,"props":1031,"children":1032},{},[1033,1035,1041],{"type":37,"value":1034},"Nous avons converti l'image héros d'un JPEG de 1,2MB en WebP de 180kB et ajouté des points de rupture responsifs avec l'élément ",{"type":32,"tag":122,"props":1036,"children":1038},{"className":1037},[],[1039],{"type":37,"value":1040},"\u003Cpicture>",{"type":37,"value":1042}," :",{"type":32,"tag":155,"props":1044,"children":1046},{"className":157,"code":1045,"language":159,"meta":16,"style":16},"\u003Cpicture>\n  \u003Csource\n    srcset=\"\u002Fimages\u002Fhero-mobile.webp\"\n    media=\"(max-width: 640px)\"\n    type=\"image\u002Fwebp\"\n  \u002F>\n  \u003Csource\n    srcset=\"\u002Fimages\u002Fhero-desktop.webp\"\n    media=\"(min-width: 641px)\"\n    type=\"image\u002Fwebp\"\n  \u002F>\n  \u003Cimg\n    src=\"\u002Fimages\u002Fhero-desktop.jpg\"\n    alt=\"Nouvelle collection de saison\"\n    fetchpriority=\"high\"\n    decoding=\"async\"\n  \u002F>\n\u003C\u002Fpicture>\n",[1047],{"type":32,"tag":122,"props":1048,"children":1049},{"__ignoreMap":16},[1050,1066,1074,1082,1090,1098,1106,1113,1121,1129,1136,1143,1151,1159,1167,1175,1183,1190],{"type":32,"tag":165,"props":1051,"children":1052},{"class":167,"line":168},[1053,1057,1062],{"type":32,"tag":165,"props":1054,"children":1055},{"style":182},[1056],{"type":37,"value":185},{"type":32,"tag":165,"props":1058,"children":1059},{"style":188},[1060],{"type":37,"value":1061},"picture",{"type":32,"tag":165,"props":1063,"children":1064},{"style":182},[1065],{"type":37,"value":202},{"type":32,"tag":165,"props":1067,"children":1068},{"class":167,"line":178},[1069],{"type":32,"tag":165,"props":1070,"children":1071},{"style":182},[1072],{"type":37,"value":1073},"  \u003Csource\n",{"type":32,"tag":165,"props":1075,"children":1076},{"class":167,"line":205},[1077],{"type":32,"tag":165,"props":1078,"children":1079},{"style":182},[1080],{"type":37,"value":1081},"    srcset=\"\u002Fimages\u002Fhero-mobile.webp\"\n",{"type":32,"tag":165,"props":1083,"children":1084},{"class":167,"line":219},[1085],{"type":32,"tag":165,"props":1086,"children":1087},{"style":182},[1088],{"type":37,"value":1089},"    media=\"(max-width: 640px)\"\n",{"type":32,"tag":165,"props":1091,"children":1092},{"class":167,"line":228},[1093],{"type":32,"tag":165,"props":1094,"children":1095},{"style":182},[1096],{"type":37,"value":1097},"    type=\"image\u002Fwebp\"\n",{"type":32,"tag":165,"props":1099,"children":1100},{"class":167,"line":237},[1101],{"type":32,"tag":165,"props":1102,"children":1103},{"style":182},[1104],{"type":37,"value":1105},"  \u002F>\n",{"type":32,"tag":165,"props":1107,"children":1108},{"class":167,"line":257},[1109],{"type":32,"tag":165,"props":1110,"children":1111},{"style":182},[1112],{"type":37,"value":1073},{"type":32,"tag":165,"props":1114,"children":1115},{"class":167,"line":275},[1116],{"type":32,"tag":165,"props":1117,"children":1118},{"style":182},[1119],{"type":37,"value":1120},"    srcset=\"\u002Fimages\u002Fhero-desktop.webp\"\n",{"type":32,"tag":165,"props":1122,"children":1123},{"class":167,"line":26},[1124],{"type":32,"tag":165,"props":1125,"children":1126},{"style":182},[1127],{"type":37,"value":1128},"    media=\"(min-width: 641px)\"\n",{"type":32,"tag":165,"props":1130,"children":1131},{"class":167,"line":310},[1132],{"type":32,"tag":165,"props":1133,"children":1134},{"style":182},[1135],{"type":37,"value":1097},{"type":32,"tag":165,"props":1137,"children":1138},{"class":167,"line":324},[1139],{"type":32,"tag":165,"props":1140,"children":1141},{"style":182},[1142],{"type":37,"value":1105},{"type":32,"tag":165,"props":1144,"children":1145},{"class":167,"line":333},[1146],{"type":32,"tag":165,"props":1147,"children":1148},{"style":182},[1149],{"type":37,"value":1150},"  \u003Cimg\n",{"type":32,"tag":165,"props":1152,"children":1153},{"class":167,"line":342},[1154],{"type":32,"tag":165,"props":1155,"children":1156},{"style":182},[1157],{"type":37,"value":1158},"    src=\"\u002Fimages\u002Fhero-desktop.jpg\"\n",{"type":32,"tag":165,"props":1160,"children":1161},{"class":167,"line":351},[1162],{"type":32,"tag":165,"props":1163,"children":1164},{"style":182},[1165],{"type":37,"value":1166},"    alt=\"Nouvelle collection de saison\"\n",{"type":32,"tag":165,"props":1168,"children":1169},{"class":167,"line":368},[1170],{"type":32,"tag":165,"props":1171,"children":1172},{"style":182},[1173],{"type":37,"value":1174},"    fetchpriority=\"high\"\n",{"type":32,"tag":165,"props":1176,"children":1177},{"class":167,"line":378},[1178],{"type":32,"tag":165,"props":1179,"children":1180},{"style":182},[1181],{"type":37,"value":1182},"    decoding=\"async\"\n",{"type":32,"tag":165,"props":1184,"children":1185},{"class":167,"line":395},[1186],{"type":32,"tag":165,"props":1187,"children":1188},{"style":182},[1189],{"type":37,"value":1105},{"type":32,"tag":165,"props":1191,"children":1192},{"class":167,"line":409},[1193,1197,1201],{"type":32,"tag":165,"props":1194,"children":1195},{"style":182},[1196],{"type":37,"value":357},{"type":32,"tag":165,"props":1198,"children":1199},{"style":188},[1200],{"type":37,"value":1061},{"type":32,"tag":165,"props":1202,"children":1203},{"style":182},[1204],{"type":37,"value":202},{"type":32,"tag":33,"props":1206,"children":1207},{},[1208,1210,1216],{"type":37,"value":1209},"Avec l'attribut ",{"type":32,"tag":122,"props":1211,"children":1213},{"className":1212},[],[1214],{"type":37,"value":1215},"fetchpriority=\"high\"",{"type":37,"value":1217},", nous signalons au navigateur « charge cette image en priorité ». Le service Cloudflare Image Resizing effectue la conversion de format automatique sur l'edge du CDN (les navigateurs ne supportant pas WebP reçoivent du JPEG).",{"type":32,"tag":33,"props":1219,"children":1220},{},[1221,1225,1227,1233],{"type":32,"tag":68,"props":1222,"children":1223},{},[1224],{"type":37,"value":564},{"type":37,"value":1226}," LCP 2,3s → 2,1s, durée de chargement de l'image 1200ms → 320ms. CLS (Cumulative Layout Shift) 0,12 → 0,02 — nous avons réservé l'espace du placeholder avec la propriété CSS ",{"type":32,"tag":122,"props":1228,"children":1230},{"className":1229},[],[1231],{"type":37,"value":1232},"aspect-ratio",{"type":37,"value":598},{"type":32,"tag":48,"props":1235,"children":1237},{"id":1236},"résultats-benchmark-impact-sur-les-utilisateurs-réels",[1238],{"type":37,"value":1239},"Résultats benchmark + impact sur les utilisateurs réels",{"type":32,"tag":33,"props":1241,"children":1242},{},[1243],{"type":37,"value":1244},"Score mobile PageSpeed Insights 34 → 92, desktop 62 → 98. Moyennes CrUX sur 28 jours :",{"type":32,"tag":1246,"props":1247,"children":1248},"table",{},[1249,1278],{"type":32,"tag":1250,"props":1251,"children":1252},"thead",{},[1253],{"type":32,"tag":1254,"props":1255,"children":1256},"tr",{},[1257,1263,1268,1273],{"type":32,"tag":1258,"props":1259,"children":1260},"th",{},[1261],{"type":37,"value":1262},"Métrique",{"type":32,"tag":1258,"props":1264,"children":1265},{},[1266],{"type":37,"value":1267},"Avant",{"type":32,"tag":1258,"props":1269,"children":1270},{},[1271],{"type":37,"value":1272},"Après",{"type":32,"tag":1258,"props":1274,"children":1275},{},[1276],{"type":37,"value":1277},"Changement",{"type":32,"tag":1279,"props":1280,"children":1281},"tbody",{},[1282,1306,1329,1352],{"type":32,"tag":1254,"props":1283,"children":1284},{},[1285,1291,1296,1301],{"type":32,"tag":1286,"props":1287,"children":1288},"td",{},[1289],{"type":37,"value":1290},"LCP",{"type":32,"tag":1286,"props":1292,"children":1293},{},[1294],{"type":37,"value":1295},"10,2s",{"type":32,"tag":1286,"props":1297,"children":1298},{},[1299],{"type":37,"value":1300},"2,1s",{"type":32,"tag":1286,"props":1302,"children":1303},{},[1304],{"type":37,"value":1305},"-79%",{"type":32,"tag":1254,"props":1307,"children":1308},{},[1309,1314,1319,1324],{"type":32,"tag":1286,"props":1310,"children":1311},{},[1312],{"type":37,"value":1313},"TBT",{"type":32,"tag":1286,"props":1315,"children":1316},{},[1317],{"type":37,"value":1318},"2190ms",{"type":32,"tag":1286,"props":1320,"children":1321},{},[1322],{"type":37,"value":1323},"420ms",{"type":32,"tag":1286,"props":1325,"children":1326},{},[1327],{"type":37,"value":1328},"-81%",{"type":32,"tag":1254,"props":1330,"children":1331},{},[1332,1337,1342,1347],{"type":32,"tag":1286,"props":1333,"children":1334},{},[1335],{"type":37,"value":1336},"CLS",{"type":32,"tag":1286,"props":1338,"children":1339},{},[1340],{"type":37,"value":1341},"0,12",{"type":32,"tag":1286,"props":1343,"children":1344},{},[1345],{"type":37,"value":1346},"0,02",{"type":32,"tag":1286,"props":1348,"children":1349},{},[1350],{"type":37,"value":1351},"-83%",{"type":32,"tag":1254,"props":1353,"children":1354},{},[1355,1360,1365,1370],{"type":32,"tag":1286,"props":1356,"children":1357},{},[1358],{"type":37,"value":1359},"TTFB",{"type":32,"tag":1286,"props":1361,"children":1362},{},[1363],{"type":37,"value":1364},"840ms",{"type":32,"tag":1286,"props":1366,"children":1367},{},[1368],{"type":37,"value":1369},"120ms",{"type":32,"tag":1286,"props":1371,"children":1372},{},[1373],{"type":37,"value":1374},"-86%",{"type":32,"tag":33,"props":1376,"children":1377},{},[1378,1380,1389],{"type":37,"value":1379},"Google Analytics — entonnoir de conversion : taux de lancement du paiement %3,2 → %4,8 (+50% lift relatif). Taux de rebond %68 → %52. Search Console : le trafic organique a augmenté de 34% en deux mois (autres modifications SEO maintenues constantes). Ces chiffres correspondent aux objectifs standard de ",{"type":32,"tag":1381,"props":1382,"children":1386},"a",{"href":1383,"rel":1384},"https:\u002F\u002Fwww.roibase.com.tr\u002Ffr\u002Fheadless",[1385],"nofollow",[1387],{"type":37,"value":1388},"Commerce Headless",{"type":37,"value":1390}," de Roibase — si les améliorations de performance ne se traduisent pas par une métrique commerciale, le changement architectural n'est pas considéré comme réussi.",{"type":32,"tag":48,"props":1392,"children":1394},{"id":1393},"compromis-et-critères-décisionnels",[1395],{"type":37,"value":1396},"Compromis et critères décisionnels",{"type":32,"tag":33,"props":1398,"children":1399},{},[1400,1405,1407,1412,1414,1420],{"type":32,"tag":68,"props":1401,"children":1402},{},[1403],{"type":37,"value":1404},"Expérience développeur :",{"type":37,"value":1406}," Nous avons ajouté des wrappers d'hydratation sélective, ce qui augmente la surface de l'API des composants. Les nouveaux développeurs doivent apprendre la différence entre ",{"type":32,"tag":122,"props":1408,"children":1410},{"className":1409},[],[1411],{"type":37,"value":820},{"type":37,"value":1413}," et ",{"type":32,"tag":122,"props":1415,"children":1417},{"className":1416},[],[1418],{"type":37,"value":1419},"when-idle",{"type":37,"value":1421},". Nous avons résolu cela avec la documentation Storybook + des règles ESLint.",{"type":32,"tag":33,"props":1423,"children":1424},{},[1425,1430],{"type":32,"tag":68,"props":1426,"children":1427},{},[1428],{"type":37,"value":1429},"Taille du bundle vs coût runtime :",{"type":37,"value":1431}," Les fichiers de polices auto-hébergées ajoutent +60kB au bundle de chargement initial, mais éliminent le coût DNS lookup + TLS handshake. Ce compromis représente un gain net sur réseau 3G mobile, neutre sur connexion fibre.",{"type":32,"tag":33,"props":1433,"children":1434},{},[1435,1440,1442,1447],{"type":32,"tag":68,"props":1436,"children":1437},{},[1438],{"type":37,"value":1439},"Invalidation du cache :",{"type":37,"value":1441}," La stratégie ",{"type":32,"tag":122,"props":1443,"children":1445},{"className":1444},[],[1446],{"type":37,"value":1012},{"type":37,"value":1448}," comporte un risque de données obsolètes. Nous gardons les données critiques comme l'inventaire à jour via une récupération realtime côté client (polling toutes les 30 secondes au lieu de WebSocket — le coût des fonctions edge est plus faible).",{"type":32,"tag":33,"props":1450,"children":1451},{},[1452,1457,1459,1464],{"type":32,"tag":68,"props":1453,"children":1454},{},[1455],{"type":37,"value":1456},"Verrouillage fournisseur Cloudflare :",{"type":37,"value":1458}," Le cache basé sur KV de ",{"type":32,"tag":122,"props":1460,"children":1462},{"className":1461},[],[1463],{"type":37,"value":855},{"type":37,"value":1465}," est spécifique à Cloudflare. Une migration vers une autre plateforme nécessiterait une réimplémentation. Cependant, Vercel et Netlify offrent des primitives similaires, l'effort de migration est acceptable.",{"type":32,"tag":48,"props":1467,"children":1469},{"id":1468},"étapes-suivantes",[1470],{"type":37,"value":1471},"Étapes suivantes",{"type":32,"tag":33,"props":1473,"children":1474},{},[1475],{"type":37,"value":1476},"2,1s c'est bien, mais le P75 (75e percentile) de CrUX est encore à 3,2s. Voici la feuille de route :",{"type":32,"tag":1478,"props":1479,"children":1480},"ol",{},[1481,1491,1501,1511],{"type":32,"tag":64,"props":1482,"children":1483},{},[1484,1489],{"type":32,"tag":68,"props":1485,"children":1486},{},[1487],{"type":37,"value":1488},"Image CDN + négociation de format automatique :",{"type":37,"value":1490}," intégration Imgix au lieu de Cloudflare Polish, support AVIF",{"type":32,"tag":64,"props":1492,"children":1493},{},[1494,1499],{"type":32,"tag":68,"props":1495,"children":1496},{},[1497],{"type":37,"value":1498},"Stratégie de préchargement :",{"type":37,"value":1500}," précharger les données des product cards approchant du viewport via Intersection Observer",{"type":32,"tag":64,"props":1502,"children":1503},{},[1504,1509],{"type":32,"tag":68,"props":1505,"children":1506},{},[1507],{"type":37,"value":1508},"Service Worker + mode hors ligne :",{"type":37,"value":1510}," utiliser Workbox pour mettre en cache les ressources critiques, fallback network-first",{"type":32,"tag":64,"props":1512,"children":1513},{},[1514,1519],{"type":32,"tag":68,"props":1515,"children":1516},{},[1517],{"type":37,"value":1518},"Fractionnement du bundle :",{"type":37,"value":1520}," rendre le code splitting de Nuxt 3 agressif, chunking basé sur les routes",{"type":32,"tag":33,"props":1522,"children":1523},{},[1524],{"type":37,"value":1525},"L'optimisation de performance est un jeu sans fin — chaque gain de 100ms produit un lift de 1-2% en conversion. La combinaison Nuxt 3 + Cloudflare Pages offre un équilibre entre rendu edge et ergonomie moderne du framework JavaScript. Lors du choix d'une pile, il faut définir l'objectif LCP comme une exigence métier, puis évaluer les options architecturales dans cette contrainte.",{"type":32,"tag":388,"props":1527,"children":1528},{},[1529],{"type":37,"value":1530},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":16,"searchDepth":205,"depth":205,"links":1532},[1533,1534,1535,1537,1538,1539,1540,1541],{"id":50,"depth":178,"text":53},{"id":112,"depth":178,"text":115},{"id":569,"depth":178,"text":1536},"Hydratation sélective + content-visibility",{"id":825,"depth":178,"text":828},{"id":1026,"depth":178,"text":1029},{"id":1236,"depth":178,"text":1239},{"id":1393,"depth":178,"text":1396},{"id":1468,"depth":178,"text":1471},"markdown","content:fr:tech:nuxt-3-cloudflare-pages-lcp-optimisation.md","content","fr\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimisation.md","fr\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimisation","md",1778164176374]