[{"data":1,"prerenderedAt":2577},["ShallowReactive",2],{"article-alternates":3,"article-\u002Ffr\u002Ftech\u002Fedge-ssr-personnalisation-40ms":13},{"i18nKey":4,"paths":5},"tech-003-2026-06",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Ftech\u002Fedge-ssr-personalisierung-latenz-40ms","\u002Fen\u002Ftech\u002Fedge-ssr-personalization-latency","\u002Fes\u002Ftech\u002Fedge-ssr-personalizacion-latencia-40ms","\u002Ffr\u002Ftech\u002Fedge-ssr-personnalisation-latence-40ms","\u002Fit\u002Ftech\u002Fridurre-latenza-personalizzazione-40ms-edge-ssr","\u002Fru\u002Ftech\u002Fedge-ssr-personalizasyon-40ms","\u002Ftr\u002Ftech\u002Fedge-ssr-ile-personalizasyon-latencysini-40msye-dusurmek",{"_path":14,"_dir":15,"_draft":16,"_partial":16,"_locale":17,"title":18,"description":19,"publishedAt":20,"modifiedAt":20,"category":15,"i18nKey":4,"tags":21,"readingTime":27,"author":28,"body":29,"_type":2571,"_id":2572,"_source":2573,"_file":2574,"_stem":2575,"_extension":2576},"\u002Ffr\u002Ftech\u002Fedge-ssr-personnalisation-40ms","tech",false,"","Réduire la latence de personnalisation à 40ms avec Edge SSR","Migrer le server-side rendering vers Cloudflare Workers et Vercel Edge abaisse la personnalisation de 250ms à 40ms. Architecture KV store, exemples de code, analyse des compromis.","2026-06-21",[22,23,24,25,26],"edge-computing","ssr","personnalisation","cloudflare-workers","vercel-edge",9,"Roibase",{"type":30,"children":31,"toc":2561},"root",[32,61,68,94,99,214,226,231,238,243,865,884,897,903,924,1351,1370,1541,1546,1552,1557,1625,1637,1642,1815,1834,1840,1845,1992,2010,2015,2142,2147,2153,2164,2338,2358,2363,2423,2428,2544,2555],{"type":33,"tag":34,"props":35,"children":36},"element","p",{},[37,40,46,48,53,55,59],{"type":38,"value":39},"text","Dans les sites e-commerce modernes, la personnalisation est devenue une attente — mais aucun utilisateur ne veut attendre 250ms à chaque interaction. L'architecture SSR (server-side rendering) traditionnelle génère une latence moyenne de 150–300ms entre l'utilisateur et le serveur d'origine : recherche DNS, ",{"type":33,"tag":41,"props":42,"children":43},"em",{},[44],{"type":38,"value":45},"handshake",{"type":38,"value":47}," TCP, négociation TLS, temps de traitement à l'origine. Edge SSR réduit ce délai à 40–60ms en exploitant la proximité géographique et une ",{"type":33,"tag":41,"props":49,"children":50},{},[51],{"type":38,"value":52},"KV store",{"type":38,"value":54}," globale. Des plateformes comme Cloudflare Workers et Vercel Edge Functions offrent un runtime au bord du réseau ; notre travail consiste à transférer la logique de personnalisation vers cet endroit et à configurer correctement la ",{"type":33,"tag":41,"props":56,"children":57},{},[58],{"type":38,"value":52},{"type":38,"value":60},".",{"type":33,"tag":62,"props":63,"children":65},"h2",{"id":64},"différence-de-latence-edge-ssr-vs-ssr-dorigine",[66],{"type":38,"value":67},"Différence de latence : Edge SSR vs. SSR d'origine",{"type":33,"tag":34,"props":69,"children":70},{},[71,73,78,80,85,87,92],{"type":38,"value":72},"Dans l'architecture SSR classique, la requête suit ce chemin : utilisateur → CDN (",{"type":33,"tag":41,"props":74,"children":75},{},[76],{"type":38,"value":77},"cache miss",{"type":38,"value":79},") → serveur d'origine (requête DB + rendu) → réponse. Latence totale moyenne : 250ms, percentile 95 : 450ms. Avec Edge SSR, la requête se termine à une localité edge : utilisateur → ",{"type":33,"tag":41,"props":81,"children":82},{},[83],{"type":38,"value":84},"worker",{"type":38,"value":86}," edge (",{"type":33,"tag":41,"props":88,"children":89},{},[90],{"type":38,"value":91},"lookup",{"type":38,"value":93}," KV + rendu) → réponse. Moyenne : 40ms, percentile 95 : 80ms.",{"type":33,"tag":34,"props":95,"children":96},{},[97],{"type":38,"value":98},"Sources de latence :",{"type":33,"tag":100,"props":101,"children":102},"table",{},[103,127],{"type":33,"tag":104,"props":105,"children":106},"thead",{},[107],{"type":33,"tag":108,"props":109,"children":110},"tr",{},[111,117,122],{"type":33,"tag":112,"props":113,"children":114},"th",{},[115],{"type":38,"value":116},"Étape",{"type":33,"tag":112,"props":118,"children":119},{},[120],{"type":38,"value":121},"SSR d'origine",{"type":33,"tag":112,"props":123,"children":124},{},[125],{"type":38,"value":126},"Edge SSR",{"type":33,"tag":128,"props":129,"children":130},"tbody",{},[131,150,168,186],{"type":33,"tag":108,"props":132,"children":133},{},[134,140,145],{"type":33,"tag":135,"props":136,"children":137},"td",{},[138],{"type":38,"value":139},"DNS + TLS",{"type":33,"tag":135,"props":141,"children":142},{},[143],{"type":38,"value":144},"50ms",{"type":33,"tag":135,"props":146,"children":147},{},[148],{"type":38,"value":149},"15ms (proximité edge)",{"type":33,"tag":108,"props":151,"children":152},{},[153,158,163],{"type":33,"tag":135,"props":154,"children":155},{},[156],{"type":38,"value":157},"RTT réseau",{"type":33,"tag":135,"props":159,"children":160},{},[161],{"type":38,"value":162},"120ms (intercontinental)",{"type":33,"tag":135,"props":164,"children":165},{},[166],{"type":38,"value":167},"10ms (distance edge)",{"type":33,"tag":108,"props":169,"children":170},{},[171,176,181],{"type":33,"tag":135,"props":172,"children":173},{},[174],{"type":38,"value":175},"Calcul",{"type":33,"tag":135,"props":177,"children":178},{},[179],{"type":38,"value":180},"80ms (origine)",{"type":33,"tag":135,"props":182,"children":183},{},[184],{"type":38,"value":185},"15ms (isolate V8)",{"type":33,"tag":108,"props":187,"children":188},{},[189,198,206],{"type":33,"tag":135,"props":190,"children":191},{},[192],{"type":33,"tag":193,"props":194,"children":195},"strong",{},[196],{"type":38,"value":197},"Total",{"type":33,"tag":135,"props":199,"children":200},{},[201],{"type":33,"tag":193,"props":202,"children":203},{},[204],{"type":38,"value":205},"250ms",{"type":33,"tag":135,"props":207,"children":208},{},[209],{"type":33,"tag":193,"props":210,"children":211},{},[212],{"type":38,"value":213},"40ms",{"type":33,"tag":34,"props":215,"children":216},{},[217,219,224],{"type":38,"value":218},"Cette réduction de 84% impacte directement les métriques LCP (Largest Contentful Paint) et CLS (Cumulative Layout Shift). Selon le rapport 2025 de Google sur Core Web Vitals, chaque 100ms sur LCP entraîne une augmentation de %3.5 du taux de rebond — gagner 210ms représente un ",{"type":33,"tag":41,"props":220,"children":221},{},[222],{"type":38,"value":223},"lift",{"type":38,"value":225}," de conversion de %7.3 (calcul : 210\u002F100 × 3.5).",{"type":33,"tag":34,"props":227,"children":228},{},[229],{"type":38,"value":230},"Compromis : le runtime edge n'est pas Node.js, c'est un isolate V8 — pas de modules natifs, pas de système de fichiers, pas de processus enfants. La logique de personnalisation doit être entièrement sans état et légère.",{"type":33,"tag":232,"props":233,"children":235},"h3",{"id":234},"architecture-edge-ssr-avec-cloudflare-workers",[236],{"type":38,"value":237},"Architecture Edge SSR avec Cloudflare Workers",{"type":33,"tag":34,"props":239,"children":240},{},[241],{"type":38,"value":242},"Cloudflare Workers achemine chaque requête vers l'une de ses 300+ locations edge à travers le réseau mondial. Une requête est traitée à l'edge comme suit :",{"type":33,"tag":244,"props":245,"children":249},"pre",{"className":246,"code":247,"language":248,"meta":17,"style":17},"language-javascript shiki shiki-themes github-dark","\u002F\u002F worker.js — Cloudflare Workers\nexport default {\n  async fetch(request, env) {\n    const url = new URL(request.url);\n    const userId = request.headers.get('x-user-id'); \u002F\u002F parsé depuis JWT\n\n    \u002F\u002F Récupérer le segment utilisateur depuis KV\n    const segment = await env.USER_SEGMENTS.get(userId);\n    const prefs = segment ? JSON.parse(segment) : { tier: 'free' };\n\n    \u002F\u002F Rendre HTML personnalisé\n    const html = renderHTML(prefs, url.pathname);\n\n    return new Response(html, {\n      headers: {\n        'content-type': 'text\u002Fhtml;charset=UTF-8',\n        'cache-control': 'public, s-maxage=60', \u002F\u002F cache edge 60s\n      },\n    });\n  },\n};\n\nfunction renderHTML(prefs, path) {\n  const hero = prefs.tier === 'premium'\n    ? '\u003Ch1>Contenu Premium\u003C\u002Fh1>'\n    : '\u003Ch1>Contenu Gratuit\u003C\u002Fh1>';\n  return `\u003C!DOCTYPE html>\u003Chtml>\u003Cbody>${hero}\u003Cp>Chemin : ${path}\u003C\u002Fp>\u003C\u002Fbody>\u003C\u002Fhtml>`;\n}\n","javascript",[250],{"type":33,"tag":251,"props":252,"children":253},"code",{"__ignoreMap":17},[254,266,287,328,363,410,420,429,474,539,547,556,583,591,614,623,647,674,683,692,701,710,718,753,786,800,819,856],{"type":33,"tag":255,"props":256,"children":259},"span",{"class":257,"line":258},"line",1,[260],{"type":33,"tag":255,"props":261,"children":263},{"style":262},"--shiki-default:#6A737D",[264],{"type":38,"value":265},"\u002F\u002F worker.js — Cloudflare Workers\n",{"type":33,"tag":255,"props":267,"children":269},{"class":257,"line":268},2,[270,276,281],{"type":33,"tag":255,"props":271,"children":273},{"style":272},"--shiki-default:#F97583",[274],{"type":38,"value":275},"export",{"type":33,"tag":255,"props":277,"children":278},{"style":272},[279],{"type":38,"value":280}," default",{"type":33,"tag":255,"props":282,"children":284},{"style":283},"--shiki-default:#E1E4E8",[285],{"type":38,"value":286}," {\n",{"type":33,"tag":255,"props":288,"children":290},{"class":257,"line":289},3,[291,296,302,307,313,318,323],{"type":33,"tag":255,"props":292,"children":293},{"style":272},[294],{"type":38,"value":295},"  async",{"type":33,"tag":255,"props":297,"children":299},{"style":298},"--shiki-default:#B392F0",[300],{"type":38,"value":301}," fetch",{"type":33,"tag":255,"props":303,"children":304},{"style":283},[305],{"type":38,"value":306},"(",{"type":33,"tag":255,"props":308,"children":310},{"style":309},"--shiki-default:#FFAB70",[311],{"type":38,"value":312},"request",{"type":33,"tag":255,"props":314,"children":315},{"style":283},[316],{"type":38,"value":317},", ",{"type":33,"tag":255,"props":319,"children":320},{"style":309},[321],{"type":38,"value":322},"env",{"type":33,"tag":255,"props":324,"children":325},{"style":283},[326],{"type":38,"value":327},") {\n",{"type":33,"tag":255,"props":329,"children":331},{"class":257,"line":330},4,[332,337,343,348,353,358],{"type":33,"tag":255,"props":333,"children":334},{"style":272},[335],{"type":38,"value":336},"    const",{"type":33,"tag":255,"props":338,"children":340},{"style":339},"--shiki-default:#79B8FF",[341],{"type":38,"value":342}," url",{"type":33,"tag":255,"props":344,"children":345},{"style":272},[346],{"type":38,"value":347}," =",{"type":33,"tag":255,"props":349,"children":350},{"style":272},[351],{"type":38,"value":352}," new",{"type":33,"tag":255,"props":354,"children":355},{"style":298},[356],{"type":38,"value":357}," URL",{"type":33,"tag":255,"props":359,"children":360},{"style":283},[361],{"type":38,"value":362},"(request.url);\n",{"type":33,"tag":255,"props":364,"children":366},{"class":257,"line":365},5,[367,371,376,380,385,390,394,400,405],{"type":33,"tag":255,"props":368,"children":369},{"style":272},[370],{"type":38,"value":336},{"type":33,"tag":255,"props":372,"children":373},{"style":339},[374],{"type":38,"value":375}," userId",{"type":33,"tag":255,"props":377,"children":378},{"style":272},[379],{"type":38,"value":347},{"type":33,"tag":255,"props":381,"children":382},{"style":283},[383],{"type":38,"value":384}," request.headers.",{"type":33,"tag":255,"props":386,"children":387},{"style":298},[388],{"type":38,"value":389},"get",{"type":33,"tag":255,"props":391,"children":392},{"style":283},[393],{"type":38,"value":306},{"type":33,"tag":255,"props":395,"children":397},{"style":396},"--shiki-default:#9ECBFF",[398],{"type":38,"value":399},"'x-user-id'",{"type":33,"tag":255,"props":401,"children":402},{"style":283},[403],{"type":38,"value":404},"); ",{"type":33,"tag":255,"props":406,"children":407},{"style":262},[408],{"type":38,"value":409},"\u002F\u002F parsé depuis JWT\n",{"type":33,"tag":255,"props":411,"children":413},{"class":257,"line":412},6,[414],{"type":33,"tag":255,"props":415,"children":417},{"emptyLinePlaceholder":416},true,[418],{"type":38,"value":419},"\n",{"type":33,"tag":255,"props":421,"children":423},{"class":257,"line":422},7,[424],{"type":33,"tag":255,"props":425,"children":426},{"style":262},[427],{"type":38,"value":428},"    \u002F\u002F Récupérer le segment utilisateur depuis KV\n",{"type":33,"tag":255,"props":430,"children":432},{"class":257,"line":431},8,[433,437,442,446,451,456,461,465,469],{"type":33,"tag":255,"props":434,"children":435},{"style":272},[436],{"type":38,"value":336},{"type":33,"tag":255,"props":438,"children":439},{"style":339},[440],{"type":38,"value":441}," segment",{"type":33,"tag":255,"props":443,"children":444},{"style":272},[445],{"type":38,"value":347},{"type":33,"tag":255,"props":447,"children":448},{"style":272},[449],{"type":38,"value":450}," await",{"type":33,"tag":255,"props":452,"children":453},{"style":283},[454],{"type":38,"value":455}," env.",{"type":33,"tag":255,"props":457,"children":458},{"style":339},[459],{"type":38,"value":460},"USER_SEGMENTS",{"type":33,"tag":255,"props":462,"children":463},{"style":283},[464],{"type":38,"value":60},{"type":33,"tag":255,"props":466,"children":467},{"style":298},[468],{"type":38,"value":389},{"type":33,"tag":255,"props":470,"children":471},{"style":283},[472],{"type":38,"value":473},"(userId);\n",{"type":33,"tag":255,"props":475,"children":476},{"class":257,"line":27},[477,481,486,490,495,500,505,509,514,519,524,529,534],{"type":33,"tag":255,"props":478,"children":479},{"style":272},[480],{"type":38,"value":336},{"type":33,"tag":255,"props":482,"children":483},{"style":339},[484],{"type":38,"value":485}," prefs",{"type":33,"tag":255,"props":487,"children":488},{"style":272},[489],{"type":38,"value":347},{"type":33,"tag":255,"props":491,"children":492},{"style":283},[493],{"type":38,"value":494}," segment ",{"type":33,"tag":255,"props":496,"children":497},{"style":272},[498],{"type":38,"value":499},"?",{"type":33,"tag":255,"props":501,"children":502},{"style":339},[503],{"type":38,"value":504}," JSON",{"type":33,"tag":255,"props":506,"children":507},{"style":283},[508],{"type":38,"value":60},{"type":33,"tag":255,"props":510,"children":511},{"style":298},[512],{"type":38,"value":513},"parse",{"type":33,"tag":255,"props":515,"children":516},{"style":283},[517],{"type":38,"value":518},"(segment) ",{"type":33,"tag":255,"props":520,"children":521},{"style":272},[522],{"type":38,"value":523},":",{"type":33,"tag":255,"props":525,"children":526},{"style":283},[527],{"type":38,"value":528}," { tier: ",{"type":33,"tag":255,"props":530,"children":531},{"style":396},[532],{"type":38,"value":533},"'free'",{"type":33,"tag":255,"props":535,"children":536},{"style":283},[537],{"type":38,"value":538}," };\n",{"type":33,"tag":255,"props":540,"children":542},{"class":257,"line":541},10,[543],{"type":33,"tag":255,"props":544,"children":545},{"emptyLinePlaceholder":416},[546],{"type":38,"value":419},{"type":33,"tag":255,"props":548,"children":550},{"class":257,"line":549},11,[551],{"type":33,"tag":255,"props":552,"children":553},{"style":262},[554],{"type":38,"value":555},"    \u002F\u002F Rendre HTML personnalisé\n",{"type":33,"tag":255,"props":557,"children":559},{"class":257,"line":558},12,[560,564,569,573,578],{"type":33,"tag":255,"props":561,"children":562},{"style":272},[563],{"type":38,"value":336},{"type":33,"tag":255,"props":565,"children":566},{"style":339},[567],{"type":38,"value":568}," html",{"type":33,"tag":255,"props":570,"children":571},{"style":272},[572],{"type":38,"value":347},{"type":33,"tag":255,"props":574,"children":575},{"style":298},[576],{"type":38,"value":577}," renderHTML",{"type":33,"tag":255,"props":579,"children":580},{"style":283},[581],{"type":38,"value":582},"(prefs, url.pathname);\n",{"type":33,"tag":255,"props":584,"children":586},{"class":257,"line":585},13,[587],{"type":33,"tag":255,"props":588,"children":589},{"emptyLinePlaceholder":416},[590],{"type":38,"value":419},{"type":33,"tag":255,"props":592,"children":594},{"class":257,"line":593},14,[595,600,604,609],{"type":33,"tag":255,"props":596,"children":597},{"style":272},[598],{"type":38,"value":599},"    return",{"type":33,"tag":255,"props":601,"children":602},{"style":272},[603],{"type":38,"value":352},{"type":33,"tag":255,"props":605,"children":606},{"style":298},[607],{"type":38,"value":608}," Response",{"type":33,"tag":255,"props":610,"children":611},{"style":283},[612],{"type":38,"value":613},"(html, {\n",{"type":33,"tag":255,"props":615,"children":617},{"class":257,"line":616},15,[618],{"type":33,"tag":255,"props":619,"children":620},{"style":283},[621],{"type":38,"value":622},"      headers: {\n",{"type":33,"tag":255,"props":624,"children":626},{"class":257,"line":625},16,[627,632,637,642],{"type":33,"tag":255,"props":628,"children":629},{"style":396},[630],{"type":38,"value":631},"        'content-type'",{"type":33,"tag":255,"props":633,"children":634},{"style":283},[635],{"type":38,"value":636},": ",{"type":33,"tag":255,"props":638,"children":639},{"style":396},[640],{"type":38,"value":641},"'text\u002Fhtml;charset=UTF-8'",{"type":33,"tag":255,"props":643,"children":644},{"style":283},[645],{"type":38,"value":646},",\n",{"type":33,"tag":255,"props":648,"children":650},{"class":257,"line":649},17,[651,656,660,665,669],{"type":33,"tag":255,"props":652,"children":653},{"style":396},[654],{"type":38,"value":655},"        'cache-control'",{"type":33,"tag":255,"props":657,"children":658},{"style":283},[659],{"type":38,"value":636},{"type":33,"tag":255,"props":661,"children":662},{"style":396},[663],{"type":38,"value":664},"'public, s-maxage=60'",{"type":33,"tag":255,"props":666,"children":667},{"style":283},[668],{"type":38,"value":317},{"type":33,"tag":255,"props":670,"children":671},{"style":262},[672],{"type":38,"value":673},"\u002F\u002F cache edge 60s\n",{"type":33,"tag":255,"props":675,"children":677},{"class":257,"line":676},18,[678],{"type":33,"tag":255,"props":679,"children":680},{"style":283},[681],{"type":38,"value":682},"      },\n",{"type":33,"tag":255,"props":684,"children":686},{"class":257,"line":685},19,[687],{"type":33,"tag":255,"props":688,"children":689},{"style":283},[690],{"type":38,"value":691},"    });\n",{"type":33,"tag":255,"props":693,"children":695},{"class":257,"line":694},20,[696],{"type":33,"tag":255,"props":697,"children":698},{"style":283},[699],{"type":38,"value":700},"  },\n",{"type":33,"tag":255,"props":702,"children":704},{"class":257,"line":703},21,[705],{"type":33,"tag":255,"props":706,"children":707},{"style":283},[708],{"type":38,"value":709},"};\n",{"type":33,"tag":255,"props":711,"children":713},{"class":257,"line":712},22,[714],{"type":33,"tag":255,"props":715,"children":716},{"emptyLinePlaceholder":416},[717],{"type":38,"value":419},{"type":33,"tag":255,"props":719,"children":721},{"class":257,"line":720},23,[722,727,731,735,740,744,749],{"type":33,"tag":255,"props":723,"children":724},{"style":272},[725],{"type":38,"value":726},"function",{"type":33,"tag":255,"props":728,"children":729},{"style":298},[730],{"type":38,"value":577},{"type":33,"tag":255,"props":732,"children":733},{"style":283},[734],{"type":38,"value":306},{"type":33,"tag":255,"props":736,"children":737},{"style":309},[738],{"type":38,"value":739},"prefs",{"type":33,"tag":255,"props":741,"children":742},{"style":283},[743],{"type":38,"value":317},{"type":33,"tag":255,"props":745,"children":746},{"style":309},[747],{"type":38,"value":748},"path",{"type":33,"tag":255,"props":750,"children":751},{"style":283},[752],{"type":38,"value":327},{"type":33,"tag":255,"props":754,"children":756},{"class":257,"line":755},24,[757,762,767,771,776,781],{"type":33,"tag":255,"props":758,"children":759},{"style":272},[760],{"type":38,"value":761},"  const",{"type":33,"tag":255,"props":763,"children":764},{"style":339},[765],{"type":38,"value":766}," hero",{"type":33,"tag":255,"props":768,"children":769},{"style":272},[770],{"type":38,"value":347},{"type":33,"tag":255,"props":772,"children":773},{"style":283},[774],{"type":38,"value":775}," prefs.tier ",{"type":33,"tag":255,"props":777,"children":778},{"style":272},[779],{"type":38,"value":780},"===",{"type":33,"tag":255,"props":782,"children":783},{"style":396},[784],{"type":38,"value":785}," 'premium'\n",{"type":33,"tag":255,"props":787,"children":789},{"class":257,"line":788},25,[790,795],{"type":33,"tag":255,"props":791,"children":792},{"style":272},[793],{"type":38,"value":794},"    ?",{"type":33,"tag":255,"props":796,"children":797},{"style":396},[798],{"type":38,"value":799}," '\u003Ch1>Contenu Premium\u003C\u002Fh1>'\n",{"type":33,"tag":255,"props":801,"children":803},{"class":257,"line":802},26,[804,809,814],{"type":33,"tag":255,"props":805,"children":806},{"style":272},[807],{"type":38,"value":808},"    :",{"type":33,"tag":255,"props":810,"children":811},{"style":396},[812],{"type":38,"value":813}," '\u003Ch1>Contenu Gratuit\u003C\u002Fh1>'",{"type":33,"tag":255,"props":815,"children":816},{"style":283},[817],{"type":38,"value":818},";\n",{"type":33,"tag":255,"props":820,"children":822},{"class":257,"line":821},27,[823,828,833,838,843,847,852],{"type":33,"tag":255,"props":824,"children":825},{"style":272},[826],{"type":38,"value":827},"  return",{"type":33,"tag":255,"props":829,"children":830},{"style":396},[831],{"type":38,"value":832}," `\u003C!DOCTYPE html>\u003Chtml>\u003Cbody>${",{"type":33,"tag":255,"props":834,"children":835},{"style":283},[836],{"type":38,"value":837},"hero",{"type":33,"tag":255,"props":839,"children":840},{"style":396},[841],{"type":38,"value":842},"}\u003Cp>Chemin : ${",{"type":33,"tag":255,"props":844,"children":845},{"style":283},[846],{"type":38,"value":748},{"type":33,"tag":255,"props":848,"children":849},{"style":396},[850],{"type":38,"value":851},"}\u003C\u002Fp>\u003C\u002Fbody>\u003C\u002Fhtml>`",{"type":33,"tag":255,"props":853,"children":854},{"style":283},[855],{"type":38,"value":818},{"type":33,"tag":255,"props":857,"children":859},{"class":257,"line":858},28,[860],{"type":33,"tag":255,"props":861,"children":862},{"style":283},[863],{"type":38,"value":864},"}\n",{"type":33,"tag":34,"props":866,"children":867},{},[868,870,875,877,882],{"type":38,"value":869},"À chaque requête, ce code extrait le segment utilisateur de l'espace de noms ",{"type":33,"tag":251,"props":871,"children":873},{"className":872},[],[874],{"type":38,"value":460},{"type":38,"value":876}," dans KV. La latence de lecture KV est en moyenne 15ms à l'échelle mondiale (benchmark Cloudflare 2025). Alternativement, on peut utiliser Durable Objects, mais pour les charges de travail ",{"type":33,"tag":41,"props":878,"children":879},{},[880],{"type":38,"value":881},"read-heavy",{"type":38,"value":883},", KV est plus économique (KV : $0.50\u002Fmillion de lectures, DO : $0.15\u002Fmillion de requêtes + calcul).",{"type":33,"tag":34,"props":885,"children":886},{},[887,889,895],{"type":38,"value":888},"La limite de temps CPU pour Workers est 50ms — les rendus complexes peuvent la dépasser. La solution : pré-rendre les modèles sous forme HTML et les stocker dans KV ; le worker ne fait que remplacer des variables. Par exemple, le worker remplace le placeholder ",{"type":33,"tag":251,"props":890,"children":892},{"className":891},[],[893],{"type":38,"value":894},"{USER_NAME}",{"type":38,"value":896},", tandis que le modèle est stocké dans KV.",{"type":33,"tag":62,"props":898,"children":900},{"id":899},"intégration-edge-functions-vercel-middleware-nextjs",[901],{"type":38,"value":902},"Intégration Edge Functions Vercel + Middleware Next.js",{"type":33,"tag":34,"props":904,"children":905},{},[906,908,914,916,922],{"type":38,"value":907},"Vercel Edge Functions s'intègrent nativement à Next.js 13+ — vous pouvez intercepter les requêtes via le pattern middleware et les personnaliser. Au lieu de ",{"type":33,"tag":251,"props":909,"children":911},{"className":910},[],[912],{"type":38,"value":913},"getServerSideProps",{"type":38,"value":915}," dans le runtime edge, vous utilisez ",{"type":33,"tag":251,"props":917,"children":919},{"className":918},[],[920],{"type":38,"value":921},"middleware.ts",{"type":38,"value":923}," :",{"type":33,"tag":244,"props":925,"children":929},{"className":926,"code":927,"language":928,"meta":17,"style":17},"language-typescript shiki shiki-themes github-dark","\u002F\u002F middleware.ts — Vercel Edge\nimport { NextRequest, NextResponse } from 'next\u002Fserver';\n\nexport async function middleware(req: NextRequest) {\n  const userId = req.cookies.get('user_id')?.value;\n  if (!userId) return NextResponse.next();\n\n  \u002F\u002F Récupérer le segment depuis Edge Config (équivalent KV Vercel)\n  const segment = await fetch(`https:\u002F\u002Fedge-config.vercel.com\u002F${userId}`).then(r => r.json());\n\n  \u002F\u002F Ajouter les infos de segment en en-tête, lues par le composant page\n  const response = NextResponse.next();\n  response.headers.set('x-user-segment', segment.tier);\n  return response;\n}\n\nexport const config = {\n  matcher: ['\u002Fproduct\u002F:path*', '\u002Fcategory\u002F:path*'],\n};\n","typescript",[930],{"type":33,"tag":251,"props":931,"children":932},{"__ignoreMap":17},[933,941,968,975,1019,1057,1100,1107,1115,1196,1203,1211,1239,1266,1278,1285,1292,1317,1344],{"type":33,"tag":255,"props":934,"children":935},{"class":257,"line":258},[936],{"type":33,"tag":255,"props":937,"children":938},{"style":262},[939],{"type":38,"value":940},"\u002F\u002F middleware.ts — Vercel Edge\n",{"type":33,"tag":255,"props":942,"children":943},{"class":257,"line":268},[944,949,954,959,964],{"type":33,"tag":255,"props":945,"children":946},{"style":272},[947],{"type":38,"value":948},"import",{"type":33,"tag":255,"props":950,"children":951},{"style":283},[952],{"type":38,"value":953}," { NextRequest, NextResponse } ",{"type":33,"tag":255,"props":955,"children":956},{"style":272},[957],{"type":38,"value":958},"from",{"type":33,"tag":255,"props":960,"children":961},{"style":396},[962],{"type":38,"value":963}," 'next\u002Fserver'",{"type":33,"tag":255,"props":965,"children":966},{"style":283},[967],{"type":38,"value":818},{"type":33,"tag":255,"props":969,"children":970},{"class":257,"line":289},[971],{"type":33,"tag":255,"props":972,"children":973},{"emptyLinePlaceholder":416},[974],{"type":38,"value":419},{"type":33,"tag":255,"props":976,"children":977},{"class":257,"line":330},[978,982,987,992,997,1001,1006,1010,1015],{"type":33,"tag":255,"props":979,"children":980},{"style":272},[981],{"type":38,"value":275},{"type":33,"tag":255,"props":983,"children":984},{"style":272},[985],{"type":38,"value":986}," async",{"type":33,"tag":255,"props":988,"children":989},{"style":272},[990],{"type":38,"value":991}," function",{"type":33,"tag":255,"props":993,"children":994},{"style":298},[995],{"type":38,"value":996}," middleware",{"type":33,"tag":255,"props":998,"children":999},{"style":283},[1000],{"type":38,"value":306},{"type":33,"tag":255,"props":1002,"children":1003},{"style":309},[1004],{"type":38,"value":1005},"req",{"type":33,"tag":255,"props":1007,"children":1008},{"style":272},[1009],{"type":38,"value":523},{"type":33,"tag":255,"props":1011,"children":1012},{"style":298},[1013],{"type":38,"value":1014}," NextRequest",{"type":33,"tag":255,"props":1016,"children":1017},{"style":283},[1018],{"type":38,"value":327},{"type":33,"tag":255,"props":1020,"children":1021},{"class":257,"line":365},[1022,1026,1030,1034,1039,1043,1047,1052],{"type":33,"tag":255,"props":1023,"children":1024},{"style":272},[1025],{"type":38,"value":761},{"type":33,"tag":255,"props":1027,"children":1028},{"style":339},[1029],{"type":38,"value":375},{"type":33,"tag":255,"props":1031,"children":1032},{"style":272},[1033],{"type":38,"value":347},{"type":33,"tag":255,"props":1035,"children":1036},{"style":283},[1037],{"type":38,"value":1038}," req.cookies.",{"type":33,"tag":255,"props":1040,"children":1041},{"style":298},[1042],{"type":38,"value":389},{"type":33,"tag":255,"props":1044,"children":1045},{"style":283},[1046],{"type":38,"value":306},{"type":33,"tag":255,"props":1048,"children":1049},{"style":396},[1050],{"type":38,"value":1051},"'user_id'",{"type":33,"tag":255,"props":1053,"children":1054},{"style":283},[1055],{"type":38,"value":1056},")?.value;\n",{"type":33,"tag":255,"props":1058,"children":1059},{"class":257,"line":412},[1060,1065,1070,1075,1080,1085,1090,1095],{"type":33,"tag":255,"props":1061,"children":1062},{"style":272},[1063],{"type":38,"value":1064},"  if",{"type":33,"tag":255,"props":1066,"children":1067},{"style":283},[1068],{"type":38,"value":1069}," (",{"type":33,"tag":255,"props":1071,"children":1072},{"style":272},[1073],{"type":38,"value":1074},"!",{"type":33,"tag":255,"props":1076,"children":1077},{"style":283},[1078],{"type":38,"value":1079},"userId) ",{"type":33,"tag":255,"props":1081,"children":1082},{"style":272},[1083],{"type":38,"value":1084},"return",{"type":33,"tag":255,"props":1086,"children":1087},{"style":283},[1088],{"type":38,"value":1089}," NextResponse.",{"type":33,"tag":255,"props":1091,"children":1092},{"style":298},[1093],{"type":38,"value":1094},"next",{"type":33,"tag":255,"props":1096,"children":1097},{"style":283},[1098],{"type":38,"value":1099},"();\n",{"type":33,"tag":255,"props":1101,"children":1102},{"class":257,"line":422},[1103],{"type":33,"tag":255,"props":1104,"children":1105},{"emptyLinePlaceholder":416},[1106],{"type":38,"value":419},{"type":33,"tag":255,"props":1108,"children":1109},{"class":257,"line":431},[1110],{"type":33,"tag":255,"props":1111,"children":1112},{"style":262},[1113],{"type":38,"value":1114},"  \u002F\u002F Récupérer le segment depuis Edge Config (équivalent KV Vercel)\n",{"type":33,"tag":255,"props":1116,"children":1117},{"class":257,"line":27},[1118,1122,1126,1130,1134,1138,1142,1147,1152,1157,1162,1167,1171,1176,1181,1186,1191],{"type":33,"tag":255,"props":1119,"children":1120},{"style":272},[1121],{"type":38,"value":761},{"type":33,"tag":255,"props":1123,"children":1124},{"style":339},[1125],{"type":38,"value":441},{"type":33,"tag":255,"props":1127,"children":1128},{"style":272},[1129],{"type":38,"value":347},{"type":33,"tag":255,"props":1131,"children":1132},{"style":272},[1133],{"type":38,"value":450},{"type":33,"tag":255,"props":1135,"children":1136},{"style":298},[1137],{"type":38,"value":301},{"type":33,"tag":255,"props":1139,"children":1140},{"style":283},[1141],{"type":38,"value":306},{"type":33,"tag":255,"props":1143,"children":1144},{"style":396},[1145],{"type":38,"value":1146},"`https:\u002F\u002Fedge-config.vercel.com\u002F${",{"type":33,"tag":255,"props":1148,"children":1149},{"style":283},[1150],{"type":38,"value":1151},"userId",{"type":33,"tag":255,"props":1153,"children":1154},{"style":396},[1155],{"type":38,"value":1156},"}`",{"type":33,"tag":255,"props":1158,"children":1159},{"style":283},[1160],{"type":38,"value":1161},").",{"type":33,"tag":255,"props":1163,"children":1164},{"style":298},[1165],{"type":38,"value":1166},"then",{"type":33,"tag":255,"props":1168,"children":1169},{"style":283},[1170],{"type":38,"value":306},{"type":33,"tag":255,"props":1172,"children":1173},{"style":309},[1174],{"type":38,"value":1175},"r",{"type":33,"tag":255,"props":1177,"children":1178},{"style":272},[1179],{"type":38,"value":1180}," =>",{"type":33,"tag":255,"props":1182,"children":1183},{"style":283},[1184],{"type":38,"value":1185}," r.",{"type":33,"tag":255,"props":1187,"children":1188},{"style":298},[1189],{"type":38,"value":1190},"json",{"type":33,"tag":255,"props":1192,"children":1193},{"style":283},[1194],{"type":38,"value":1195},"());\n",{"type":33,"tag":255,"props":1197,"children":1198},{"class":257,"line":541},[1199],{"type":33,"tag":255,"props":1200,"children":1201},{"emptyLinePlaceholder":416},[1202],{"type":38,"value":419},{"type":33,"tag":255,"props":1204,"children":1205},{"class":257,"line":549},[1206],{"type":33,"tag":255,"props":1207,"children":1208},{"style":262},[1209],{"type":38,"value":1210},"  \u002F\u002F Ajouter les infos de segment en en-tête, lues par le composant page\n",{"type":33,"tag":255,"props":1212,"children":1213},{"class":257,"line":558},[1214,1218,1223,1227,1231,1235],{"type":33,"tag":255,"props":1215,"children":1216},{"style":272},[1217],{"type":38,"value":761},{"type":33,"tag":255,"props":1219,"children":1220},{"style":339},[1221],{"type":38,"value":1222}," response",{"type":33,"tag":255,"props":1224,"children":1225},{"style":272},[1226],{"type":38,"value":347},{"type":33,"tag":255,"props":1228,"children":1229},{"style":283},[1230],{"type":38,"value":1089},{"type":33,"tag":255,"props":1232,"children":1233},{"style":298},[1234],{"type":38,"value":1094},{"type":33,"tag":255,"props":1236,"children":1237},{"style":283},[1238],{"type":38,"value":1099},{"type":33,"tag":255,"props":1240,"children":1241},{"class":257,"line":585},[1242,1247,1252,1256,1261],{"type":33,"tag":255,"props":1243,"children":1244},{"style":283},[1245],{"type":38,"value":1246},"  response.headers.",{"type":33,"tag":255,"props":1248,"children":1249},{"style":298},[1250],{"type":38,"value":1251},"set",{"type":33,"tag":255,"props":1253,"children":1254},{"style":283},[1255],{"type":38,"value":306},{"type":33,"tag":255,"props":1257,"children":1258},{"style":396},[1259],{"type":38,"value":1260},"'x-user-segment'",{"type":33,"tag":255,"props":1262,"children":1263},{"style":283},[1264],{"type":38,"value":1265},", segment.tier);\n",{"type":33,"tag":255,"props":1267,"children":1268},{"class":257,"line":593},[1269,1273],{"type":33,"tag":255,"props":1270,"children":1271},{"style":272},[1272],{"type":38,"value":827},{"type":33,"tag":255,"props":1274,"children":1275},{"style":283},[1276],{"type":38,"value":1277}," response;\n",{"type":33,"tag":255,"props":1279,"children":1280},{"class":257,"line":616},[1281],{"type":33,"tag":255,"props":1282,"children":1283},{"style":283},[1284],{"type":38,"value":864},{"type":33,"tag":255,"props":1286,"children":1287},{"class":257,"line":625},[1288],{"type":33,"tag":255,"props":1289,"children":1290},{"emptyLinePlaceholder":416},[1291],{"type":38,"value":419},{"type":33,"tag":255,"props":1293,"children":1294},{"class":257,"line":649},[1295,1299,1304,1309,1313],{"type":33,"tag":255,"props":1296,"children":1297},{"style":272},[1298],{"type":38,"value":275},{"type":33,"tag":255,"props":1300,"children":1301},{"style":272},[1302],{"type":38,"value":1303}," const",{"type":33,"tag":255,"props":1305,"children":1306},{"style":339},[1307],{"type":38,"value":1308}," config",{"type":33,"tag":255,"props":1310,"children":1311},{"style":272},[1312],{"type":38,"value":347},{"type":33,"tag":255,"props":1314,"children":1315},{"style":283},[1316],{"type":38,"value":286},{"type":33,"tag":255,"props":1318,"children":1319},{"class":257,"line":676},[1320,1325,1330,1334,1339],{"type":33,"tag":255,"props":1321,"children":1322},{"style":283},[1323],{"type":38,"value":1324},"  matcher: [",{"type":33,"tag":255,"props":1326,"children":1327},{"style":396},[1328],{"type":38,"value":1329},"'\u002Fproduct\u002F:path*'",{"type":33,"tag":255,"props":1331,"children":1332},{"style":283},[1333],{"type":38,"value":317},{"type":33,"tag":255,"props":1335,"children":1336},{"style":396},[1337],{"type":38,"value":1338},"'\u002Fcategory\u002F:path*'",{"type":33,"tag":255,"props":1340,"children":1341},{"style":283},[1342],{"type":38,"value":1343},"],\n",{"type":33,"tag":255,"props":1345,"children":1346},{"class":257,"line":685},[1347],{"type":33,"tag":255,"props":1348,"children":1349},{"style":283},[1350],{"type":38,"value":709},{"type":33,"tag":34,"props":1352,"children":1353},{},[1354,1356,1368],{"type":38,"value":1355},"Cette approche fonctionne bien pour personnaliser les pages de listing de produits dans une architecture ",{"type":33,"tag":1357,"props":1358,"children":1362},"a",{"href":1359,"rel":1360},"https:\u002F\u002Fwww.roibase.com.tr\u002Ffr\u002Fheadless",[1361],"nofollow",[1363],{"type":33,"tag":41,"props":1364,"children":1365},{},[1366],{"type":38,"value":1367},"headless commerce",{"type":38,"value":1369},". Par exemple, vous montrez un classement de produits différent aux utilisateurs premium. Le composant page lit l'en-tête :",{"type":33,"tag":244,"props":1371,"children":1375},{"className":1372,"code":1373,"language":1374,"meta":17,"style":17},"language-tsx shiki shiki-themes github-dark","\u002F\u002F app\u002Fproduct\u002F[id]\u002Fpage.tsx\nexport default async function ProductPage({ params, headers }) {\n  const segment = headers.get('x-user-segment');\n  const products = await fetchProducts(params.id, segment);\n  return \u003CProductList items={products} \u002F>;\n}\n","tsx",[1376],{"type":33,"tag":251,"props":1377,"children":1378},{"__ignoreMap":17},[1379,1387,1435,1472,1502,1534],{"type":33,"tag":255,"props":1380,"children":1381},{"class":257,"line":258},[1382],{"type":33,"tag":255,"props":1383,"children":1384},{"style":262},[1385],{"type":38,"value":1386},"\u002F\u002F app\u002Fproduct\u002F[id]\u002Fpage.tsx\n",{"type":33,"tag":255,"props":1388,"children":1389},{"class":257,"line":268},[1390,1394,1398,1402,1406,1411,1416,1421,1425,1430],{"type":33,"tag":255,"props":1391,"children":1392},{"style":272},[1393],{"type":38,"value":275},{"type":33,"tag":255,"props":1395,"children":1396},{"style":272},[1397],{"type":38,"value":280},{"type":33,"tag":255,"props":1399,"children":1400},{"style":272},[1401],{"type":38,"value":986},{"type":33,"tag":255,"props":1403,"children":1404},{"style":272},[1405],{"type":38,"value":991},{"type":33,"tag":255,"props":1407,"children":1408},{"style":298},[1409],{"type":38,"value":1410}," ProductPage",{"type":33,"tag":255,"props":1412,"children":1413},{"style":283},[1414],{"type":38,"value":1415},"({ ",{"type":33,"tag":255,"props":1417,"children":1418},{"style":309},[1419],{"type":38,"value":1420},"params",{"type":33,"tag":255,"props":1422,"children":1423},{"style":283},[1424],{"type":38,"value":317},{"type":33,"tag":255,"props":1426,"children":1427},{"style":309},[1428],{"type":38,"value":1429},"headers",{"type":33,"tag":255,"props":1431,"children":1432},{"style":283},[1433],{"type":38,"value":1434}," }) {\n",{"type":33,"tag":255,"props":1436,"children":1437},{"class":257,"line":289},[1438,1442,1446,1450,1455,1459,1463,1467],{"type":33,"tag":255,"props":1439,"children":1440},{"style":272},[1441],{"type":38,"value":761},{"type":33,"tag":255,"props":1443,"children":1444},{"style":339},[1445],{"type":38,"value":441},{"type":33,"tag":255,"props":1447,"children":1448},{"style":272},[1449],{"type":38,"value":347},{"type":33,"tag":255,"props":1451,"children":1452},{"style":283},[1453],{"type":38,"value":1454}," headers.",{"type":33,"tag":255,"props":1456,"children":1457},{"style":298},[1458],{"type":38,"value":389},{"type":33,"tag":255,"props":1460,"children":1461},{"style":283},[1462],{"type":38,"value":306},{"type":33,"tag":255,"props":1464,"children":1465},{"style":396},[1466],{"type":38,"value":1260},{"type":33,"tag":255,"props":1468,"children":1469},{"style":283},[1470],{"type":38,"value":1471},");\n",{"type":33,"tag":255,"props":1473,"children":1474},{"class":257,"line":330},[1475,1479,1484,1488,1492,1497],{"type":33,"tag":255,"props":1476,"children":1477},{"style":272},[1478],{"type":38,"value":761},{"type":33,"tag":255,"props":1480,"children":1481},{"style":339},[1482],{"type":38,"value":1483}," products",{"type":33,"tag":255,"props":1485,"children":1486},{"style":272},[1487],{"type":38,"value":347},{"type":33,"tag":255,"props":1489,"children":1490},{"style":272},[1491],{"type":38,"value":450},{"type":33,"tag":255,"props":1493,"children":1494},{"style":298},[1495],{"type":38,"value":1496}," fetchProducts",{"type":33,"tag":255,"props":1498,"children":1499},{"style":283},[1500],{"type":38,"value":1501},"(params.id, segment);\n",{"type":33,"tag":255,"props":1503,"children":1504},{"class":257,"line":365},[1505,1509,1514,1519,1524,1529],{"type":33,"tag":255,"props":1506,"children":1507},{"style":272},[1508],{"type":38,"value":827},{"type":33,"tag":255,"props":1510,"children":1511},{"style":283},[1512],{"type":38,"value":1513}," \u003C",{"type":33,"tag":255,"props":1515,"children":1516},{"style":339},[1517],{"type":38,"value":1518},"ProductList",{"type":33,"tag":255,"props":1520,"children":1521},{"style":298},[1522],{"type":38,"value":1523}," items",{"type":33,"tag":255,"props":1525,"children":1526},{"style":272},[1527],{"type":38,"value":1528},"=",{"type":33,"tag":255,"props":1530,"children":1531},{"style":283},[1532],{"type":38,"value":1533},"{products} \u002F>;\n",{"type":33,"tag":255,"props":1535,"children":1536},{"class":257,"line":412},[1537],{"type":33,"tag":255,"props":1538,"children":1539},{"style":283},[1540],{"type":38,"value":864},{"type":33,"tag":34,"props":1542,"children":1543},{},[1544],{"type":38,"value":1545},"Vercel Edge Config réplique globalement en moins de 150ms — les mises à jour KV se propagent aux edges dans ce laps de temps. Compromis : Edge Config est environ 20% plus lent que Cloudflare KV, mais mieux intégré à l'écosystème Next.js.",{"type":33,"tag":232,"props":1547,"children":1549},{"id":1548},"architecture-kv-store-stratégie-de-segmentation",[1550],{"type":38,"value":1551},"Architecture KV Store : stratégie de segmentation",{"type":33,"tag":34,"props":1553,"children":1554},{},[1555],{"type":38,"value":1556},"Les données de personnalisation sont stockées dans KV sur trois couches :",{"type":33,"tag":1558,"props":1559,"children":1560},"ol",{},[1561,1586,1608],{"type":33,"tag":1562,"props":1563,"children":1564},"li",{},[1565,1570,1572,1578,1580],{"type":33,"tag":193,"props":1566,"children":1567},{},[1568],{"type":38,"value":1569},"Segment utilisateur :",{"type":38,"value":1571}," ",{"type":33,"tag":251,"props":1573,"children":1575},{"className":1574},[],[1576],{"type":38,"value":1577},"USER_SEGMENTS:{userId}",{"type":38,"value":1579}," → ",{"type":33,"tag":251,"props":1581,"children":1583},{"className":1582},[],[1584],{"type":38,"value":1585},"{\"tier\":\"premium\",\"region\":\"EU\"}",{"type":33,"tag":1562,"props":1587,"children":1588},{},[1589,1594,1595,1601,1602],{"type":33,"tag":193,"props":1590,"children":1591},{},[1592],{"type":38,"value":1593},"Config de segment :",{"type":38,"value":1571},{"type":33,"tag":251,"props":1596,"children":1598},{"className":1597},[],[1599],{"type":38,"value":1600},"SEGMENT_CONFIG:{tier}",{"type":38,"value":1579},{"type":33,"tag":251,"props":1603,"children":1605},{"className":1604},[],[1606],{"type":38,"value":1607},"{\"discount\":0.2,\"hero\":\"premium.jpg\"}",{"type":33,"tag":1562,"props":1609,"children":1610},{},[1611,1616,1617,1623],{"type":33,"tag":193,"props":1612,"children":1613},{},[1614],{"type":38,"value":1615},"Modèle de page :",{"type":38,"value":1571},{"type":33,"tag":251,"props":1618,"children":1620},{"className":1619},[],[1621],{"type":38,"value":1622},"PAGE_TPL:{page}:{tier}",{"type":38,"value":1624}," → fragment HTML pré-rendu",{"type":33,"tag":34,"props":1626,"children":1627},{},[1628,1630,1635],{"type":38,"value":1629},"Cette structure assure que lors d'un changement de segment, seul ",{"type":33,"tag":251,"props":1631,"children":1633},{"className":1632},[],[1634],{"type":38,"value":460},{"type":38,"value":1636}," est mis à jour ; les modèles restent en cache. Pour 1 million d'utilisateurs, le coût KV est : 1M utilisateurs × 1 lecture\u002Frequête × $0.50\u002F1M lectures = $0.0000005 par requête. Le coût d'une requête à la base de données d'origine est 100 fois supérieur.",{"type":33,"tag":34,"props":1638,"children":1639},{},[1640],{"type":38,"value":1641},"Stratégie TTL dans KV :",{"type":33,"tag":244,"props":1643,"children":1645},{"className":246,"code":1644,"language":248,"meta":17,"style":17},"\u002F\u002F Le segment est en cache 24 heures\nawait env.USER_SEGMENTS.put(userId, JSON.stringify(segment), {\n  expirationTtl: 86400,\n});\n\n\u002F\u002F La config est en cache 1 heure (peut changer fréquemment)\nawait env.SEGMENT_CONFIG.put(tier, JSON.stringify(config), {\n  expirationTtl: 3600,\n});\n",[1646],{"type":33,"tag":251,"props":1647,"children":1648},{"__ignoreMap":17},[1649,1657,1706,1723,1731,1738,1746,1792,1808],{"type":33,"tag":255,"props":1650,"children":1651},{"class":257,"line":258},[1652],{"type":33,"tag":255,"props":1653,"children":1654},{"style":262},[1655],{"type":38,"value":1656},"\u002F\u002F Le segment est en cache 24 heures\n",{"type":33,"tag":255,"props":1658,"children":1659},{"class":257,"line":268},[1660,1665,1669,1673,1677,1682,1687,1692,1696,1701],{"type":33,"tag":255,"props":1661,"children":1662},{"style":272},[1663],{"type":38,"value":1664},"await",{"type":33,"tag":255,"props":1666,"children":1667},{"style":283},[1668],{"type":38,"value":455},{"type":33,"tag":255,"props":1670,"children":1671},{"style":339},[1672],{"type":38,"value":460},{"type":33,"tag":255,"props":1674,"children":1675},{"style":283},[1676],{"type":38,"value":60},{"type":33,"tag":255,"props":1678,"children":1679},{"style":298},[1680],{"type":38,"value":1681},"put",{"type":33,"tag":255,"props":1683,"children":1684},{"style":283},[1685],{"type":38,"value":1686},"(userId, ",{"type":33,"tag":255,"props":1688,"children":1689},{"style":339},[1690],{"type":38,"value":1691},"JSON",{"type":33,"tag":255,"props":1693,"children":1694},{"style":283},[1695],{"type":38,"value":60},{"type":33,"tag":255,"props":1697,"children":1698},{"style":298},[1699],{"type":38,"value":1700},"stringify",{"type":33,"tag":255,"props":1702,"children":1703},{"style":283},[1704],{"type":38,"value":1705},"(segment), {\n",{"type":33,"tag":255,"props":1707,"children":1708},{"class":257,"line":289},[1709,1714,1719],{"type":33,"tag":255,"props":1710,"children":1711},{"style":283},[1712],{"type":38,"value":1713},"  expirationTtl: ",{"type":33,"tag":255,"props":1715,"children":1716},{"style":339},[1717],{"type":38,"value":1718},"86400",{"type":33,"tag":255,"props":1720,"children":1721},{"style":283},[1722],{"type":38,"value":646},{"type":33,"tag":255,"props":1724,"children":1725},{"class":257,"line":330},[1726],{"type":33,"tag":255,"props":1727,"children":1728},{"style":283},[1729],{"type":38,"value":1730},"});\n",{"type":33,"tag":255,"props":1732,"children":1733},{"class":257,"line":365},[1734],{"type":33,"tag":255,"props":1735,"children":1736},{"emptyLinePlaceholder":416},[1737],{"type":38,"value":419},{"type":33,"tag":255,"props":1739,"children":1740},{"class":257,"line":412},[1741],{"type":33,"tag":255,"props":1742,"children":1743},{"style":262},[1744],{"type":38,"value":1745},"\u002F\u002F La config est en cache 1 heure (peut changer fréquemment)\n",{"type":33,"tag":255,"props":1747,"children":1748},{"class":257,"line":422},[1749,1753,1757,1762,1766,1770,1775,1779,1783,1787],{"type":33,"tag":255,"props":1750,"children":1751},{"style":272},[1752],{"type":38,"value":1664},{"type":33,"tag":255,"props":1754,"children":1755},{"style":283},[1756],{"type":38,"value":455},{"type":33,"tag":255,"props":1758,"children":1759},{"style":339},[1760],{"type":38,"value":1761},"SEGMENT_CONFIG",{"type":33,"tag":255,"props":1763,"children":1764},{"style":283},[1765],{"type":38,"value":60},{"type":33,"tag":255,"props":1767,"children":1768},{"style":298},[1769],{"type":38,"value":1681},{"type":33,"tag":255,"props":1771,"children":1772},{"style":283},[1773],{"type":38,"value":1774},"(tier, ",{"type":33,"tag":255,"props":1776,"children":1777},{"style":339},[1778],{"type":38,"value":1691},{"type":33,"tag":255,"props":1780,"children":1781},{"style":283},[1782],{"type":38,"value":60},{"type":33,"tag":255,"props":1784,"children":1785},{"style":298},[1786],{"type":38,"value":1700},{"type":33,"tag":255,"props":1788,"children":1789},{"style":283},[1790],{"type":38,"value":1791},"(config), {\n",{"type":33,"tag":255,"props":1793,"children":1794},{"class":257,"line":431},[1795,1799,1804],{"type":33,"tag":255,"props":1796,"children":1797},{"style":283},[1798],{"type":38,"value":1713},{"type":33,"tag":255,"props":1800,"children":1801},{"style":339},[1802],{"type":38,"value":1803},"3600",{"type":33,"tag":255,"props":1805,"children":1806},{"style":283},[1807],{"type":38,"value":646},{"type":33,"tag":255,"props":1809,"children":1810},{"class":257,"line":27},[1811],{"type":33,"tag":255,"props":1812,"children":1813},{"style":283},[1814],{"type":38,"value":1730},{"type":33,"tag":34,"props":1816,"children":1817},{},[1818,1820,1825,1827,1832],{"type":38,"value":1819},"Invalidation : lorsqu'un utilisateur se met à niveau, vous pouvez envoyer un signal via WebSocket ou ",{"type":33,"tag":41,"props":1821,"children":1822},{},[1823],{"type":38,"value":1824},"webhook",{"type":38,"value":1826}," au worker pour mettre à jour KV. Cependant, ce n'est pas en temps réel — il faut accepter une ",{"type":33,"tag":41,"props":1828,"children":1829},{},[1830],{"type":38,"value":1831},"eventual consistency",{"type":38,"value":1833}," (délai de 1–5 minutes).",{"type":33,"tag":62,"props":1835,"children":1837},{"id":1836},"compromis-de-rendu-static-vs-edge-ssr",[1838],{"type":38,"value":1839},"Compromis de rendu : Static vs. Edge SSR",{"type":33,"tag":34,"props":1841,"children":1842},{},[1843],{"type":38,"value":1844},"Edge SSR n'est pas toujours la meilleure solution. Comparaison :",{"type":33,"tag":100,"props":1846,"children":1847},{},[1848,1872],{"type":33,"tag":104,"props":1849,"children":1850},{},[1851],{"type":33,"tag":108,"props":1852,"children":1853},{},[1854,1859,1864,1868],{"type":33,"tag":112,"props":1855,"children":1856},{},[1857],{"type":38,"value":1858},"Métrique",{"type":33,"tag":112,"props":1860,"children":1861},{},[1862],{"type":38,"value":1863},"Static (ISR)",{"type":33,"tag":112,"props":1865,"children":1866},{},[1867],{"type":38,"value":126},{"type":33,"tag":112,"props":1869,"children":1870},{},[1871],{"type":38,"value":121},{"type":33,"tag":128,"props":1873,"children":1874},{},[1875,1896,1918,1946,1969],{"type":33,"tag":108,"props":1876,"children":1877},{},[1878,1883,1888,1892],{"type":33,"tag":135,"props":1879,"children":1880},{},[1881],{"type":38,"value":1882},"TTFB",{"type":33,"tag":135,"props":1884,"children":1885},{},[1886],{"type":38,"value":1887},"20ms",{"type":33,"tag":135,"props":1889,"children":1890},{},[1891],{"type":38,"value":213},{"type":33,"tag":135,"props":1893,"children":1894},{},[1895],{"type":38,"value":205},{"type":33,"tag":108,"props":1897,"children":1898},{},[1899,1904,1909,1914],{"type":33,"tag":135,"props":1900,"children":1901},{},[1902],{"type":38,"value":1903},"Personnalisation",{"type":33,"tag":135,"props":1905,"children":1906},{},[1907],{"type":38,"value":1908},"Non",{"type":33,"tag":135,"props":1910,"children":1911},{},[1912],{"type":38,"value":1913},"Oui",{"type":33,"tag":135,"props":1915,"children":1916},{},[1917],{"type":38,"value":1913},{"type":33,"tag":108,"props":1919,"children":1920},{},[1921,1931,1936,1941],{"type":33,"tag":135,"props":1922,"children":1923},{},[1924,1926],{"type":38,"value":1925},"Ratio de ",{"type":33,"tag":41,"props":1927,"children":1928},{},[1929],{"type":38,"value":1930},"cache hit",{"type":33,"tag":135,"props":1932,"children":1933},{},[1934],{"type":38,"value":1935},"%99",{"type":33,"tag":135,"props":1937,"children":1938},{},[1939],{"type":38,"value":1940},"%60",{"type":33,"tag":135,"props":1942,"children":1943},{},[1944],{"type":38,"value":1945},"%10",{"type":33,"tag":108,"props":1947,"children":1948},{},[1949,1954,1959,1964],{"type":33,"tag":135,"props":1950,"children":1951},{},[1952],{"type":38,"value":1953},"Coût (1M req)",{"type":33,"tag":135,"props":1955,"children":1956},{},[1957],{"type":38,"value":1958},"$0.20",{"type":33,"tag":135,"props":1960,"children":1961},{},[1962],{"type":38,"value":1963},"$2.50",{"type":33,"tag":135,"props":1965,"children":1966},{},[1967],{"type":38,"value":1968},"$15",{"type":33,"tag":108,"props":1970,"children":1971},{},[1972,1977,1982,1987],{"type":33,"tag":135,"props":1973,"children":1974},{},[1975],{"type":38,"value":1976},"Complexité",{"type":33,"tag":135,"props":1978,"children":1979},{},[1980],{"type":38,"value":1981},"Faible",{"type":33,"tag":135,"props":1983,"children":1984},{},[1985],{"type":38,"value":1986},"Moyenne",{"type":33,"tag":135,"props":1988,"children":1989},{},[1990],{"type":38,"value":1991},"Élevée",{"type":33,"tag":34,"props":1993,"children":1994},{},[1995,1997,2002,2004,2008],{"type":38,"value":1996},"ISR (",{"type":33,"tag":41,"props":1998,"children":1999},{},[2000],{"type":38,"value":2001},"Incremental Static Regeneration",{"type":38,"value":2003},") atteint un ratio de ",{"type":33,"tag":41,"props":2005,"children":2006},{},[2007],{"type":38,"value":1930},{"type":38,"value":2009}," de %99, mais pas de personnalisation. Avec Edge SSR, le cache se fragmente par segment utilisateur — chaque segment crée une clé de cache différente, d'où un ratio de hit plus faible.",{"type":33,"tag":34,"props":2011,"children":2012},{},[2013],{"type":38,"value":2014},"Approche hybride : le layout principal est statique, les composants personnalisés sont rendus à l'edge puis injectés côté client. Par exemple, la grille de produits est statique, mais \"Recommandations pour vous\" vient d'Edge SSR :",{"type":33,"tag":244,"props":2016,"children":2018},{"className":246,"code":2017,"language":248,"meta":17,"style":17},"\u002F\u002F Hybride : HTML statique + section personnalisée injectée depuis edge\nconst staticHTML = await env.STATIC_PAGES.get(pathname);\nconst personalizedSection = await renderPersonalizedRecommendations(userId);\nconst finalHTML = staticHTML.replace('\u003C!--INJECT-->', personalizedSection);\n",[2019],{"type":33,"tag":251,"props":2020,"children":2021},{"__ignoreMap":17},[2022,2030,2073,2102],{"type":33,"tag":255,"props":2023,"children":2024},{"class":257,"line":258},[2025],{"type":33,"tag":255,"props":2026,"children":2027},{"style":262},[2028],{"type":38,"value":2029},"\u002F\u002F Hybride : HTML statique + section personnalisée injectée depuis edge\n",{"type":33,"tag":255,"props":2031,"children":2032},{"class":257,"line":268},[2033,2038,2043,2047,2051,2055,2060,2064,2068],{"type":33,"tag":255,"props":2034,"children":2035},{"style":272},[2036],{"type":38,"value":2037},"const",{"type":33,"tag":255,"props":2039,"children":2040},{"style":339},[2041],{"type":38,"value":2042}," staticHTML",{"type":33,"tag":255,"props":2044,"children":2045},{"style":272},[2046],{"type":38,"value":347},{"type":33,"tag":255,"props":2048,"children":2049},{"style":272},[2050],{"type":38,"value":450},{"type":33,"tag":255,"props":2052,"children":2053},{"style":283},[2054],{"type":38,"value":455},{"type":33,"tag":255,"props":2056,"children":2057},{"style":339},[2058],{"type":38,"value":2059},"STATIC_PAGES",{"type":33,"tag":255,"props":2061,"children":2062},{"style":283},[2063],{"type":38,"value":60},{"type":33,"tag":255,"props":2065,"children":2066},{"style":298},[2067],{"type":38,"value":389},{"type":33,"tag":255,"props":2069,"children":2070},{"style":283},[2071],{"type":38,"value":2072},"(pathname);\n",{"type":33,"tag":255,"props":2074,"children":2075},{"class":257,"line":289},[2076,2080,2085,2089,2093,2098],{"type":33,"tag":255,"props":2077,"children":2078},{"style":272},[2079],{"type":38,"value":2037},{"type":33,"tag":255,"props":2081,"children":2082},{"style":339},[2083],{"type":38,"value":2084}," personalizedSection",{"type":33,"tag":255,"props":2086,"children":2087},{"style":272},[2088],{"type":38,"value":347},{"type":33,"tag":255,"props":2090,"children":2091},{"style":272},[2092],{"type":38,"value":450},{"type":33,"tag":255,"props":2094,"children":2095},{"style":298},[2096],{"type":38,"value":2097}," renderPersonalizedRecommendations",{"type":33,"tag":255,"props":2099,"children":2100},{"style":283},[2101],{"type":38,"value":473},{"type":33,"tag":255,"props":2103,"children":2104},{"class":257,"line":330},[2105,2109,2114,2118,2123,2128,2132,2137],{"type":33,"tag":255,"props":2106,"children":2107},{"style":272},[2108],{"type":38,"value":2037},{"type":33,"tag":255,"props":2110,"children":2111},{"style":339},[2112],{"type":38,"value":2113}," finalHTML",{"type":33,"tag":255,"props":2115,"children":2116},{"style":272},[2117],{"type":38,"value":347},{"type":33,"tag":255,"props":2119,"children":2120},{"style":283},[2121],{"type":38,"value":2122}," staticHTML.",{"type":33,"tag":255,"props":2124,"children":2125},{"style":298},[2126],{"type":38,"value":2127},"replace",{"type":33,"tag":255,"props":2129,"children":2130},{"style":283},[2131],{"type":38,"value":306},{"type":33,"tag":255,"props":2133,"children":2134},{"style":396},[2135],{"type":38,"value":2136},"'\u003C!--INJECT-->'",{"type":33,"tag":255,"props":2138,"children":2139},{"style":283},[2140],{"type":38,"value":2141},", personalizedSection);\n",{"type":33,"tag":34,"props":2143,"children":2144},{},[2145],{"type":38,"value":2146},"Cette approche maintient le TTFB autour de 30ms tout en offrant de la personnalisation.",{"type":33,"tag":62,"props":2148,"children":2150},{"id":2149},"débogage-et-monitoring-limites-du-runtime-edge",[2151],{"type":38,"value":2152},"Débogage et monitoring : limites du runtime edge",{"type":33,"tag":34,"props":2154,"children":2155},{},[2156,2158,2163],{"type":38,"value":2157},"Sur la production, déboguer un runtime edge est compliqué — les logs sont dispersés, les traces de pile d'erreurs incomplètes. Avec Cloudflare Workers, vous pouvez créer un flux de logs en temps réel via ",{"type":33,"tag":41,"props":2159,"children":2160},{},[2161],{"type":38,"value":2162},"Tail Workers",{"type":38,"value":923},{"type":33,"tag":244,"props":2165,"children":2167},{"className":246,"code":2166,"language":248,"meta":17,"style":17},"\u002F\u002F tail-worker.js\nexport default {\n  async tail(events) {\n    for (const event of events) {\n      console.log(JSON.stringify({\n        timestamp: event.timestamp,\n        outcome: event.outcome,\n        logs: event.logs,\n      }));\n    }\n  },\n};\n",[2168],{"type":33,"tag":251,"props":2169,"children":2170},{"__ignoreMap":17},[2171,2179,2194,2219,2250,2284,2292,2300,2308,2316,2324,2331],{"type":33,"tag":255,"props":2172,"children":2173},{"class":257,"line":258},[2174],{"type":33,"tag":255,"props":2175,"children":2176},{"style":262},[2177],{"type":38,"value":2178},"\u002F\u002F tail-worker.js\n",{"type":33,"tag":255,"props":2180,"children":2181},{"class":257,"line":268},[2182,2186,2190],{"type":33,"tag":255,"props":2183,"children":2184},{"style":272},[2185],{"type":38,"value":275},{"type":33,"tag":255,"props":2187,"children":2188},{"style":272},[2189],{"type":38,"value":280},{"type":33,"tag":255,"props":2191,"children":2192},{"style":283},[2193],{"type":38,"value":286},{"type":33,"tag":255,"props":2195,"children":2196},{"class":257,"line":289},[2197,2201,2206,2210,2215],{"type":33,"tag":255,"props":2198,"children":2199},{"style":272},[2200],{"type":38,"value":295},{"type":33,"tag":255,"props":2202,"children":2203},{"style":298},[2204],{"type":38,"value":2205}," tail",{"type":33,"tag":255,"props":2207,"children":2208},{"style":283},[2209],{"type":38,"value":306},{"type":33,"tag":255,"props":2211,"children":2212},{"style":309},[2213],{"type":38,"value":2214},"events",{"type":33,"tag":255,"props":2216,"children":2217},{"style":283},[2218],{"type":38,"value":327},{"type":33,"tag":255,"props":2220,"children":2221},{"class":257,"line":330},[2222,2227,2231,2235,2240,2245],{"type":33,"tag":255,"props":2223,"children":2224},{"style":272},[2225],{"type":38,"value":2226},"    for",{"type":33,"tag":255,"props":2228,"children":2229},{"style":283},[2230],{"type":38,"value":1069},{"type":33,"tag":255,"props":2232,"children":2233},{"style":272},[2234],{"type":38,"value":2037},{"type":33,"tag":255,"props":2236,"children":2237},{"style":339},[2238],{"type":38,"value":2239}," event",{"type":33,"tag":255,"props":2241,"children":2242},{"style":272},[2243],{"type":38,"value":2244}," of",{"type":33,"tag":255,"props":2246,"children":2247},{"style":283},[2248],{"type":38,"value":2249}," events) {\n",{"type":33,"tag":255,"props":2251,"children":2252},{"class":257,"line":365},[2253,2258,2263,2267,2271,2275,2279],{"type":33,"tag":255,"props":2254,"children":2255},{"style":283},[2256],{"type":38,"value":2257},"      console.",{"type":33,"tag":255,"props":2259,"children":2260},{"style":298},[2261],{"type":38,"value":2262},"log",{"type":33,"tag":255,"props":2264,"children":2265},{"style":283},[2266],{"type":38,"value":306},{"type":33,"tag":255,"props":2268,"children":2269},{"style":339},[2270],{"type":38,"value":1691},{"type":33,"tag":255,"props":2272,"children":2273},{"style":283},[2274],{"type":38,"value":60},{"type":33,"tag":255,"props":2276,"children":2277},{"style":298},[2278],{"type":38,"value":1700},{"type":33,"tag":255,"props":2280,"children":2281},{"style":283},[2282],{"type":38,"value":2283},"({\n",{"type":33,"tag":255,"props":2285,"children":2286},{"class":257,"line":412},[2287],{"type":33,"tag":255,"props":2288,"children":2289},{"style":283},[2290],{"type":38,"value":2291},"        timestamp: event.timestamp,\n",{"type":33,"tag":255,"props":2293,"children":2294},{"class":257,"line":422},[2295],{"type":33,"tag":255,"props":2296,"children":2297},{"style":283},[2298],{"type":38,"value":2299},"        outcome: event.outcome,\n",{"type":33,"tag":255,"props":2301,"children":2302},{"class":257,"line":431},[2303],{"type":33,"tag":255,"props":2304,"children":2305},{"style":283},[2306],{"type":38,"value":2307},"        logs: event.logs,\n",{"type":33,"tag":255,"props":2309,"children":2310},{"class":257,"line":27},[2311],{"type":33,"tag":255,"props":2312,"children":2313},{"style":283},[2314],{"type":38,"value":2315},"      }));\n",{"type":33,"tag":255,"props":2317,"children":2318},{"class":257,"line":541},[2319],{"type":33,"tag":255,"props":2320,"children":2321},{"style":283},[2322],{"type":38,"value":2323},"    }\n",{"type":33,"tag":255,"props":2325,"children":2326},{"class":257,"line":549},[2327],{"type":33,"tag":255,"props":2328,"children":2329},{"style":283},[2330],{"type":38,"value":700},{"type":33,"tag":255,"props":2332,"children":2333},{"class":257,"line":558},[2334],{"type":33,"tag":255,"props":2335,"children":2336},{"style":283},[2337],{"type":38,"value":709},{"type":33,"tag":34,"props":2339,"children":2340},{},[2341,2343,2349,2351,2356],{"type":38,"value":2342},"Chez Vercel, ",{"type":33,"tag":251,"props":2344,"children":2346},{"className":2345},[],[2347],{"type":38,"value":2348},"console.log",{"type":38,"value":2350}," s'écoule dans les ",{"type":33,"tag":41,"props":2352,"children":2353},{},[2354],{"type":38,"value":2355},"edge logs",{"type":38,"value":2357},", diffusé via le tableau de bord Vercel. Cependant, en production, le logging verbeux peut dépasser la limite CPU — ne loggez que les événements critiques.",{"type":33,"tag":34,"props":2359,"children":2360},{},[2361],{"type":38,"value":2362},"Métriques de monitoring :",{"type":33,"tag":2364,"props":2365,"children":2366},"ul",{},[2367,2395,2405],{"type":33,"tag":1562,"props":2368,"children":2369},{},[2370,2381,2383,2388,2390,2394],{"type":33,"tag":193,"props":2371,"children":2372},{},[2373,2375,2380],{"type":38,"value":2374},"Latence de ",{"type":33,"tag":41,"props":2376,"children":2377},{},[2378],{"type":38,"value":2379},"cold start",{"type":38,"value":923},{"type":38,"value":2382}," 80–120ms au premier chargement du worker — les requêtes ",{"type":33,"tag":41,"props":2384,"children":2385},{},[2386],{"type":38,"value":2387},"warm",{"type":38,"value":2389}," prennent 15ms. Les routes fréquemment utilisées restent ",{"type":33,"tag":41,"props":2391,"children":2392},{},[2393],{"type":38,"value":2387},{"type":38,"value":60},{"type":33,"tag":1562,"props":2396,"children":2397},{},[2398,2403],{"type":33,"tag":193,"props":2399,"children":2400},{},[2401],{"type":38,"value":2402},"Taux d'échec KV :",{"type":38,"value":2404}," %0.01 (SLA Cloudflare). Solution de secours : si KV ne se lit pas, utiliser un segment par défaut.",{"type":33,"tag":1562,"props":2406,"children":2407},{},[2408,2413,2415,2421],{"type":33,"tag":193,"props":2409,"children":2410},{},[2411],{"type":38,"value":2412},"Temps CPU :",{"type":38,"value":2414}," dépasser 50ms retourne une erreur %429. Profiling : mesurez avec ",{"type":33,"tag":251,"props":2416,"children":2418},{"className":2417},[],[2419],{"type":38,"value":2420},"console.time()",{"type":38,"value":2422},", déplacez les opérations lourdes vers l'origine.",{"type":33,"tag":34,"props":2424,"children":2425},{},[2426],{"type":38,"value":2427},"Exemple de gestion d'erreurs :",{"type":33,"tag":244,"props":2429,"children":2431},{"className":246,"code":2430,"language":248,"meta":17,"style":17},"try {\n  const segment = await env.USER_SEGMENTS.get(userId);\n} catch (err) {\n  \u002F\u002F Échec KV — utiliser la config par défaut\n  return renderHTML({ tier: 'free' }, pathname);\n}\n",[2432],{"type":33,"tag":251,"props":2433,"children":2434},{"__ignoreMap":17},[2435,2447,2486,2504,2512,2537],{"type":33,"tag":255,"props":2436,"children":2437},{"class":257,"line":258},[2438,2443],{"type":33,"tag":255,"props":2439,"children":2440},{"style":272},[2441],{"type":38,"value":2442},"try",{"type":33,"tag":255,"props":2444,"children":2445},{"style":283},[2446],{"type":38,"value":286},{"type":33,"tag":255,"props":2448,"children":2449},{"class":257,"line":268},[2450,2454,2458,2462,2466,2470,2474,2478,2482],{"type":33,"tag":255,"props":2451,"children":2452},{"style":272},[2453],{"type":38,"value":761},{"type":33,"tag":255,"props":2455,"children":2456},{"style":339},[2457],{"type":38,"value":441},{"type":33,"tag":255,"props":2459,"children":2460},{"style":272},[2461],{"type":38,"value":347},{"type":33,"tag":255,"props":2463,"children":2464},{"style":272},[2465],{"type":38,"value":450},{"type":33,"tag":255,"props":2467,"children":2468},{"style":283},[2469],{"type":38,"value":455},{"type":33,"tag":255,"props":2471,"children":2472},{"style":339},[2473],{"type":38,"value":460},{"type":33,"tag":255,"props":2475,"children":2476},{"style":283},[2477],{"type":38,"value":60},{"type":33,"tag":255,"props":2479,"children":2480},{"style":298},[2481],{"type":38,"value":389},{"type":33,"tag":255,"props":2483,"children":2484},{"style":283},[2485],{"type":38,"value":473},{"type":33,"tag":255,"props":2487,"children":2488},{"class":257,"line":289},[2489,2494,2499],{"type":33,"tag":255,"props":2490,"children":2491},{"style":283},[2492],{"type":38,"value":2493},"} ",{"type":33,"tag":255,"props":2495,"children":2496},{"style":272},[2497],{"type":38,"value":2498},"catch",{"type":33,"tag":255,"props":2500,"children":2501},{"style":283},[2502],{"type":38,"value":2503}," (err) {\n",{"type":33,"tag":255,"props":2505,"children":2506},{"class":257,"line":330},[2507],{"type":33,"tag":255,"props":2508,"children":2509},{"style":262},[2510],{"type":38,"value":2511},"  \u002F\u002F Échec KV — utiliser la config par défaut\n",{"type":33,"tag":255,"props":2513,"children":2514},{"class":257,"line":365},[2515,2519,2523,2528,2532],{"type":33,"tag":255,"props":2516,"children":2517},{"style":272},[2518],{"type":38,"value":827},{"type":33,"tag":255,"props":2520,"children":2521},{"style":298},[2522],{"type":38,"value":577},{"type":33,"tag":255,"props":2524,"children":2525},{"style":283},[2526],{"type":38,"value":2527},"({ tier: ",{"type":33,"tag":255,"props":2529,"children":2530},{"style":396},[2531],{"type":38,"value":533},{"type":33,"tag":255,"props":2533,"children":2534},{"style":283},[2535],{"type":38,"value":2536}," }, pathname);\n",{"type":33,"tag":255,"props":2538,"children":2539},{"class":257,"line":412},[2540],{"type":33,"tag":255,"props":2541,"children":2542},{"style":283},[2543],{"type":38,"value":864},{"type":33,"tag":34,"props":2545,"children":2546},{},[2547,2549,2553],{"type":38,"value":2548},"Si vous acceptez ces compromis avec Edge SSR, la réduction de 250ms à 40ms génère une différence mesurable en conversion. Particulièrement sur mobile, où la latence réseau est élevée, la proximité edge est critique. L'étape suivante : configurer correctement la ",{"type":33,"tag":41,"props":2550,"children":2551},{},[2552],{"type":38,"value":52},{"type":38,"value":2554},", définir votre stratégie de segments et tester les limites du runtime edge.",{"type":33,"tag":2556,"props":2557,"children":2558},"style",{},[2559],{"type":38,"value":2560},"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":17,"searchDepth":289,"depth":289,"links":2562},[2563,2566,2569,2570],{"id":64,"depth":268,"text":67,"children":2564},[2565],{"id":234,"depth":289,"text":237},{"id":899,"depth":268,"text":902,"children":2567},[2568],{"id":1548,"depth":289,"text":1551},{"id":1836,"depth":268,"text":1839},{"id":2149,"depth":268,"text":2152},"markdown","content:fr:tech:edge-ssr-personnalisation-40ms.md","content","fr\u002Ftech\u002Fedge-ssr-personnalisation-40ms.md","fr\u002Ftech\u002Fedge-ssr-personnalisation-40ms","md",1782079493293]