[{"data":1,"prerenderedAt":3296},["ShallowReactive",2],{"article-alternates":3,"article-\u002Ffr\u002Ftech\u002Fedge-ssr-personnalisation-latence-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":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":3290,"_id":3291,"_source":3292,"_file":3293,"_stem":3294,"_extension":3295},"tech",false,"","Réduire la latence de personnalisation à 40ms avec Edge SSR","Architecture avec Cloudflare Workers et Vercel Edge utilisant un KV store pour réduire la latence du server-side rendering à 40ms — exemples de code, compromis et benchmarks.","2026-06-02",[21,22,23,24,25],"edge-ssr","cloudflare-workers","vercel-edge","kv-store","web-performance",9,"Roibase",{"type":29,"children":30,"toc":3276},"root",[31,39,46,51,56,82,87,93,98,103,900,905,929,939,946,951,974,990,996,1001,1515,1520,1912,1917,2004,2009,2015,2020,2025,2031,2036,2368,2373,2379,2384,2957,2962,2968,2973,3182,3187,3193,3198,3231,3236,3242,3247,3261,3265,3270],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","En SSR classique, un utilisateur aux États-Unis envoie une requête, le serveur à Francfort effectue le rendu, 180ms de latence réseau + 80ms de calcul = 260ms. Avec une couche de personnalisation, ce chiffre peut atteindre 400ms. Avec Edge SSR, il est possible de réduire ce temps à 40ms — mais sans comprendre les compromis, une mise en production risque de coûter cher. Dans cet article, nous présentons une architecture fonctionnant sur Cloudflare Workers et Vercel Edge avec KV store, ses benchmarks et les points d'attention critiques.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"le-cœur-dedge-ssr-rapprocher-le-calcul-de-lutilisateur",[44],{"type":37,"value":45},"Le cœur d'Edge SSR : rapprocher le calcul de l'utilisateur",{"type":32,"tag":33,"props":47,"children":48},{},[49],{"type":37,"value":50},"Edge SSR exécute le rendu sur le nœud edge le plus proche de l'endroit où se trouve l'utilisateur. Cloudflare dispose de runtime edge dans 310+ villes, Vercel dans 20+ régions. Si un utilisateur envoie une requête depuis Tokyo, c'est le nœud edge de Tokyo qui répond ; depuis São Paulo, c'est celui de São Paulo.",{"type":32,"tag":33,"props":52,"children":53},{},[54],{"type":37,"value":55},"En SSR classique, le serveur est unique — une instance EC2 à Francfort ou Google Cloud Run. Chaque requête doit d'abord y parvenir. Avec Edge SSR :",{"type":32,"tag":57,"props":58,"children":59},"ul",{},[60,72],{"type":32,"tag":61,"props":62,"children":63},"li",{},[64,70],{"type":32,"tag":65,"props":66,"children":67},"strong",{},[68],{"type":37,"value":69},"TTFB (Time to First Byte) :",{"type":37,"value":71}," 40-80ms (distance du nœud edge 10-30ms + calcul 20-50ms)",{"type":32,"tag":61,"props":73,"children":74},{},[75,80],{"type":32,"tag":65,"props":76,"children":77},{},[78],{"type":37,"value":79},"TTFB en SSR classique :",{"type":37,"value":81}," 180-400ms (latence réseau + calcul + allers-retours base de données)",{"type":32,"tag":33,"props":83,"children":84},{},[85],{"type":37,"value":86},"L'écart est de 3 à 4 fois. Cependant, pour bénéficier de ce gain de performance, vous devez prendre des décisions architecturales — les runtime edge ne supportent pas toutes les API de Node.js, les cold start fonctionnent différemment et la stratégie de couche données change complètement.",{"type":32,"tag":40,"props":88,"children":90},{"id":89},"cloudflare-workers-kv-architecture-pour-40ms-de-latence",[91],{"type":37,"value":92},"Cloudflare Workers + KV : architecture pour 40ms de latence",{"type":32,"tag":33,"props":94,"children":95},{},[96],{"type":37,"value":97},"Cloudflare Workers s'exécute sur des isolates V8 — pas de conteneur. Le cold start est 0ms, chaque requête s'exécute dans un isolate existant. KV (Key-Value Store) est un dépôt de données distribué à l'échelle mondiale : quand une clé est écrite, elle se propage à tous les nœuds edge dans les 60 secondes ; la lecture s'effectue depuis le nœud edge local (sub-milliseconde).",{"type":32,"tag":33,"props":99,"children":100},{},[101],{"type":37,"value":102},"Pour la personnalisation, nous utilisons cette architecture comme suit :",{"type":32,"tag":104,"props":105,"children":109},"pre",{"className":106,"code":107,"language":108,"meta":16,"style":16},"language-typescript shiki shiki-themes github-dark","\u002F\u002F worker.ts — Cloudflare Workers\nexport default {\n  async fetch(request: Request, env: Env): Promise\u003CResponse> {\n    const url = new URL(request.url);\n    const userId = request.headers.get('x-user-id') || 'anonymous';\n    \n    \u002F\u002F Lire le segment utilisateur depuis KV (edge-local, \u003C1ms)\n    const segment = await env.USER_SEGMENTS.get(userId);\n    const parsedSegment = segment ? JSON.parse(segment) : { tier: 'free', region: 'default' };\n    \n    \u002F\u002F Rendre le contenu en fonction du segment\n    const html = renderPersonalizedHTML(url.pathname, parsedSegment);\n    \n    return new Response(html, {\n      headers: {\n        'Content-Type': 'text\u002Fhtml;charset=UTF-8',\n        'Cache-Control': 'public, s-maxage=60',\n        'X-Segment': parsedSegment.tier\n      }\n    });\n  }\n};\n\nfunction renderPersonalizedHTML(path: string, segment: any): string {\n  \u002F\u002F Exemple simple de SSR — en production, vous utiliserez un framework\n  const greeting = segment.tier === 'premium' ? 'Bienvenue, VIP' : 'Bonjour';\n  return `\u003C!DOCTYPE html>\n\u003Chtml>\n\u003Chead>\u003Ctitle>Page personnalisée\u003C\u002Ftitle>\u003C\u002Fhead>\n\u003Cbody>\n  \u003Ch1>${greeting}\u003C\u002Fh1>\n  \u003Cp>Région : ${segment.region}\u003C\u002Fp>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>`;\n}\n","typescript",[110],{"type":32,"tag":111,"props":112,"children":113},"code",{"__ignoreMap":16},[114,126,147,231,266,323,332,341,387,461,469,478,505,513,536,545,569,591,605,614,623,632,641,651,716,725,782,796,805,814,823,842,869,878,891],{"type":32,"tag":115,"props":116,"children":119},"span",{"class":117,"line":118},"line",1,[120],{"type":32,"tag":115,"props":121,"children":123},{"style":122},"--shiki-default:#6A737D",[124],{"type":37,"value":125},"\u002F\u002F worker.ts — Cloudflare Workers\n",{"type":32,"tag":115,"props":127,"children":129},{"class":117,"line":128},2,[130,136,141],{"type":32,"tag":115,"props":131,"children":133},{"style":132},"--shiki-default:#F97583",[134],{"type":37,"value":135},"export",{"type":32,"tag":115,"props":137,"children":138},{"style":132},[139],{"type":37,"value":140}," default",{"type":32,"tag":115,"props":142,"children":144},{"style":143},"--shiki-default:#E1E4E8",[145],{"type":37,"value":146}," {\n",{"type":32,"tag":115,"props":148,"children":150},{"class":117,"line":149},3,[151,156,162,167,173,178,183,188,193,197,202,207,211,216,221,226],{"type":32,"tag":115,"props":152,"children":153},{"style":132},[154],{"type":37,"value":155},"  async",{"type":32,"tag":115,"props":157,"children":159},{"style":158},"--shiki-default:#B392F0",[160],{"type":37,"value":161}," fetch",{"type":32,"tag":115,"props":163,"children":164},{"style":143},[165],{"type":37,"value":166},"(",{"type":32,"tag":115,"props":168,"children":170},{"style":169},"--shiki-default:#FFAB70",[171],{"type":37,"value":172},"request",{"type":32,"tag":115,"props":174,"children":175},{"style":132},[176],{"type":37,"value":177},":",{"type":32,"tag":115,"props":179,"children":180},{"style":158},[181],{"type":37,"value":182}," Request",{"type":32,"tag":115,"props":184,"children":185},{"style":143},[186],{"type":37,"value":187},", ",{"type":32,"tag":115,"props":189,"children":190},{"style":169},[191],{"type":37,"value":192},"env",{"type":32,"tag":115,"props":194,"children":195},{"style":132},[196],{"type":37,"value":177},{"type":32,"tag":115,"props":198,"children":199},{"style":158},[200],{"type":37,"value":201}," Env",{"type":32,"tag":115,"props":203,"children":204},{"style":143},[205],{"type":37,"value":206},")",{"type":32,"tag":115,"props":208,"children":209},{"style":132},[210],{"type":37,"value":177},{"type":32,"tag":115,"props":212,"children":213},{"style":158},[214],{"type":37,"value":215}," Promise",{"type":32,"tag":115,"props":217,"children":218},{"style":143},[219],{"type":37,"value":220},"\u003C",{"type":32,"tag":115,"props":222,"children":223},{"style":158},[224],{"type":37,"value":225},"Response",{"type":32,"tag":115,"props":227,"children":228},{"style":143},[229],{"type":37,"value":230},"> {\n",{"type":32,"tag":115,"props":232,"children":234},{"class":117,"line":233},4,[235,240,246,251,256,261],{"type":32,"tag":115,"props":236,"children":237},{"style":132},[238],{"type":37,"value":239},"    const",{"type":32,"tag":115,"props":241,"children":243},{"style":242},"--shiki-default:#79B8FF",[244],{"type":37,"value":245}," url",{"type":32,"tag":115,"props":247,"children":248},{"style":132},[249],{"type":37,"value":250}," =",{"type":32,"tag":115,"props":252,"children":253},{"style":132},[254],{"type":37,"value":255}," new",{"type":32,"tag":115,"props":257,"children":258},{"style":158},[259],{"type":37,"value":260}," URL",{"type":32,"tag":115,"props":262,"children":263},{"style":143},[264],{"type":37,"value":265},"(request.url);\n",{"type":32,"tag":115,"props":267,"children":269},{"class":117,"line":268},5,[270,274,279,283,288,293,297,303,308,313,318],{"type":32,"tag":115,"props":271,"children":272},{"style":132},[273],{"type":37,"value":239},{"type":32,"tag":115,"props":275,"children":276},{"style":242},[277],{"type":37,"value":278}," userId",{"type":32,"tag":115,"props":280,"children":281},{"style":132},[282],{"type":37,"value":250},{"type":32,"tag":115,"props":284,"children":285},{"style":143},[286],{"type":37,"value":287}," request.headers.",{"type":32,"tag":115,"props":289,"children":290},{"style":158},[291],{"type":37,"value":292},"get",{"type":32,"tag":115,"props":294,"children":295},{"style":143},[296],{"type":37,"value":166},{"type":32,"tag":115,"props":298,"children":300},{"style":299},"--shiki-default:#9ECBFF",[301],{"type":37,"value":302},"'x-user-id'",{"type":32,"tag":115,"props":304,"children":305},{"style":143},[306],{"type":37,"value":307},") ",{"type":32,"tag":115,"props":309,"children":310},{"style":132},[311],{"type":37,"value":312},"||",{"type":32,"tag":115,"props":314,"children":315},{"style":299},[316],{"type":37,"value":317}," 'anonymous'",{"type":32,"tag":115,"props":319,"children":320},{"style":143},[321],{"type":37,"value":322},";\n",{"type":32,"tag":115,"props":324,"children":326},{"class":117,"line":325},6,[327],{"type":32,"tag":115,"props":328,"children":329},{"style":143},[330],{"type":37,"value":331},"    \n",{"type":32,"tag":115,"props":333,"children":335},{"class":117,"line":334},7,[336],{"type":32,"tag":115,"props":337,"children":338},{"style":122},[339],{"type":37,"value":340},"    \u002F\u002F Lire le segment utilisateur depuis KV (edge-local, \u003C1ms)\n",{"type":32,"tag":115,"props":342,"children":344},{"class":117,"line":343},8,[345,349,354,358,363,368,373,378,382],{"type":32,"tag":115,"props":346,"children":347},{"style":132},[348],{"type":37,"value":239},{"type":32,"tag":115,"props":350,"children":351},{"style":242},[352],{"type":37,"value":353}," segment",{"type":32,"tag":115,"props":355,"children":356},{"style":132},[357],{"type":37,"value":250},{"type":32,"tag":115,"props":359,"children":360},{"style":132},[361],{"type":37,"value":362}," await",{"type":32,"tag":115,"props":364,"children":365},{"style":143},[366],{"type":37,"value":367}," env.",{"type":32,"tag":115,"props":369,"children":370},{"style":242},[371],{"type":37,"value":372},"USER_SEGMENTS",{"type":32,"tag":115,"props":374,"children":375},{"style":143},[376],{"type":37,"value":377},".",{"type":32,"tag":115,"props":379,"children":380},{"style":158},[381],{"type":37,"value":292},{"type":32,"tag":115,"props":383,"children":384},{"style":143},[385],{"type":37,"value":386},"(userId);\n",{"type":32,"tag":115,"props":388,"children":389},{"class":117,"line":26},[390,394,399,403,408,413,418,422,427,432,436,441,446,451,456],{"type":32,"tag":115,"props":391,"children":392},{"style":132},[393],{"type":37,"value":239},{"type":32,"tag":115,"props":395,"children":396},{"style":242},[397],{"type":37,"value":398}," parsedSegment",{"type":32,"tag":115,"props":400,"children":401},{"style":132},[402],{"type":37,"value":250},{"type":32,"tag":115,"props":404,"children":405},{"style":143},[406],{"type":37,"value":407}," segment ",{"type":32,"tag":115,"props":409,"children":410},{"style":132},[411],{"type":37,"value":412},"?",{"type":32,"tag":115,"props":414,"children":415},{"style":242},[416],{"type":37,"value":417}," JSON",{"type":32,"tag":115,"props":419,"children":420},{"style":143},[421],{"type":37,"value":377},{"type":32,"tag":115,"props":423,"children":424},{"style":158},[425],{"type":37,"value":426},"parse",{"type":32,"tag":115,"props":428,"children":429},{"style":143},[430],{"type":37,"value":431},"(segment) ",{"type":32,"tag":115,"props":433,"children":434},{"style":132},[435],{"type":37,"value":177},{"type":32,"tag":115,"props":437,"children":438},{"style":143},[439],{"type":37,"value":440}," { tier: ",{"type":32,"tag":115,"props":442,"children":443},{"style":299},[444],{"type":37,"value":445},"'free'",{"type":32,"tag":115,"props":447,"children":448},{"style":143},[449],{"type":37,"value":450},", region: ",{"type":32,"tag":115,"props":452,"children":453},{"style":299},[454],{"type":37,"value":455},"'default'",{"type":32,"tag":115,"props":457,"children":458},{"style":143},[459],{"type":37,"value":460}," };\n",{"type":32,"tag":115,"props":462,"children":464},{"class":117,"line":463},10,[465],{"type":32,"tag":115,"props":466,"children":467},{"style":143},[468],{"type":37,"value":331},{"type":32,"tag":115,"props":470,"children":472},{"class":117,"line":471},11,[473],{"type":32,"tag":115,"props":474,"children":475},{"style":122},[476],{"type":37,"value":477},"    \u002F\u002F Rendre le contenu en fonction du segment\n",{"type":32,"tag":115,"props":479,"children":481},{"class":117,"line":480},12,[482,486,491,495,500],{"type":32,"tag":115,"props":483,"children":484},{"style":132},[485],{"type":37,"value":239},{"type":32,"tag":115,"props":487,"children":488},{"style":242},[489],{"type":37,"value":490}," html",{"type":32,"tag":115,"props":492,"children":493},{"style":132},[494],{"type":37,"value":250},{"type":32,"tag":115,"props":496,"children":497},{"style":158},[498],{"type":37,"value":499}," renderPersonalizedHTML",{"type":32,"tag":115,"props":501,"children":502},{"style":143},[503],{"type":37,"value":504},"(url.pathname, parsedSegment);\n",{"type":32,"tag":115,"props":506,"children":508},{"class":117,"line":507},13,[509],{"type":32,"tag":115,"props":510,"children":511},{"style":143},[512],{"type":37,"value":331},{"type":32,"tag":115,"props":514,"children":516},{"class":117,"line":515},14,[517,522,526,531],{"type":32,"tag":115,"props":518,"children":519},{"style":132},[520],{"type":37,"value":521},"    return",{"type":32,"tag":115,"props":523,"children":524},{"style":132},[525],{"type":37,"value":255},{"type":32,"tag":115,"props":527,"children":528},{"style":158},[529],{"type":37,"value":530}," Response",{"type":32,"tag":115,"props":532,"children":533},{"style":143},[534],{"type":37,"value":535},"(html, {\n",{"type":32,"tag":115,"props":537,"children":539},{"class":117,"line":538},15,[540],{"type":32,"tag":115,"props":541,"children":542},{"style":143},[543],{"type":37,"value":544},"      headers: {\n",{"type":32,"tag":115,"props":546,"children":548},{"class":117,"line":547},16,[549,554,559,564],{"type":32,"tag":115,"props":550,"children":551},{"style":299},[552],{"type":37,"value":553},"        'Content-Type'",{"type":32,"tag":115,"props":555,"children":556},{"style":143},[557],{"type":37,"value":558},": ",{"type":32,"tag":115,"props":560,"children":561},{"style":299},[562],{"type":37,"value":563},"'text\u002Fhtml;charset=UTF-8'",{"type":32,"tag":115,"props":565,"children":566},{"style":143},[567],{"type":37,"value":568},",\n",{"type":32,"tag":115,"props":570,"children":572},{"class":117,"line":571},17,[573,578,582,587],{"type":32,"tag":115,"props":574,"children":575},{"style":299},[576],{"type":37,"value":577},"        'Cache-Control'",{"type":32,"tag":115,"props":579,"children":580},{"style":143},[581],{"type":37,"value":558},{"type":32,"tag":115,"props":583,"children":584},{"style":299},[585],{"type":37,"value":586},"'public, s-maxage=60'",{"type":32,"tag":115,"props":588,"children":589},{"style":143},[590],{"type":37,"value":568},{"type":32,"tag":115,"props":592,"children":594},{"class":117,"line":593},18,[595,600],{"type":32,"tag":115,"props":596,"children":597},{"style":299},[598],{"type":37,"value":599},"        'X-Segment'",{"type":32,"tag":115,"props":601,"children":602},{"style":143},[603],{"type":37,"value":604},": parsedSegment.tier\n",{"type":32,"tag":115,"props":606,"children":608},{"class":117,"line":607},19,[609],{"type":32,"tag":115,"props":610,"children":611},{"style":143},[612],{"type":37,"value":613},"      }\n",{"type":32,"tag":115,"props":615,"children":617},{"class":117,"line":616},20,[618],{"type":32,"tag":115,"props":619,"children":620},{"style":143},[621],{"type":37,"value":622},"    });\n",{"type":32,"tag":115,"props":624,"children":626},{"class":117,"line":625},21,[627],{"type":32,"tag":115,"props":628,"children":629},{"style":143},[630],{"type":37,"value":631},"  }\n",{"type":32,"tag":115,"props":633,"children":635},{"class":117,"line":634},22,[636],{"type":32,"tag":115,"props":637,"children":638},{"style":143},[639],{"type":37,"value":640},"};\n",{"type":32,"tag":115,"props":642,"children":644},{"class":117,"line":643},23,[645],{"type":32,"tag":115,"props":646,"children":648},{"emptyLinePlaceholder":647},true,[649],{"type":37,"value":650},"\n",{"type":32,"tag":115,"props":652,"children":654},{"class":117,"line":653},24,[655,660,664,668,673,677,682,686,691,695,700,704,708,712],{"type":32,"tag":115,"props":656,"children":657},{"style":132},[658],{"type":37,"value":659},"function",{"type":32,"tag":115,"props":661,"children":662},{"style":158},[663],{"type":37,"value":499},{"type":32,"tag":115,"props":665,"children":666},{"style":143},[667],{"type":37,"value":166},{"type":32,"tag":115,"props":669,"children":670},{"style":169},[671],{"type":37,"value":672},"path",{"type":32,"tag":115,"props":674,"children":675},{"style":132},[676],{"type":37,"value":177},{"type":32,"tag":115,"props":678,"children":679},{"style":242},[680],{"type":37,"value":681}," string",{"type":32,"tag":115,"props":683,"children":684},{"style":143},[685],{"type":37,"value":187},{"type":32,"tag":115,"props":687,"children":688},{"style":169},[689],{"type":37,"value":690},"segment",{"type":32,"tag":115,"props":692,"children":693},{"style":132},[694],{"type":37,"value":177},{"type":32,"tag":115,"props":696,"children":697},{"style":242},[698],{"type":37,"value":699}," any",{"type":32,"tag":115,"props":701,"children":702},{"style":143},[703],{"type":37,"value":206},{"type":32,"tag":115,"props":705,"children":706},{"style":132},[707],{"type":37,"value":177},{"type":32,"tag":115,"props":709,"children":710},{"style":242},[711],{"type":37,"value":681},{"type":32,"tag":115,"props":713,"children":714},{"style":143},[715],{"type":37,"value":146},{"type":32,"tag":115,"props":717,"children":719},{"class":117,"line":718},25,[720],{"type":32,"tag":115,"props":721,"children":722},{"style":122},[723],{"type":37,"value":724},"  \u002F\u002F Exemple simple de SSR — en production, vous utiliserez un framework\n",{"type":32,"tag":115,"props":726,"children":728},{"class":117,"line":727},26,[729,734,739,743,748,753,758,763,768,773,778],{"type":32,"tag":115,"props":730,"children":731},{"style":132},[732],{"type":37,"value":733},"  const",{"type":32,"tag":115,"props":735,"children":736},{"style":242},[737],{"type":37,"value":738}," greeting",{"type":32,"tag":115,"props":740,"children":741},{"style":132},[742],{"type":37,"value":250},{"type":32,"tag":115,"props":744,"children":745},{"style":143},[746],{"type":37,"value":747}," segment.tier ",{"type":32,"tag":115,"props":749,"children":750},{"style":132},[751],{"type":37,"value":752},"===",{"type":32,"tag":115,"props":754,"children":755},{"style":299},[756],{"type":37,"value":757}," 'premium'",{"type":32,"tag":115,"props":759,"children":760},{"style":132},[761],{"type":37,"value":762}," ?",{"type":32,"tag":115,"props":764,"children":765},{"style":299},[766],{"type":37,"value":767}," 'Bienvenue, VIP'",{"type":32,"tag":115,"props":769,"children":770},{"style":132},[771],{"type":37,"value":772}," :",{"type":32,"tag":115,"props":774,"children":775},{"style":299},[776],{"type":37,"value":777}," 'Bonjour'",{"type":32,"tag":115,"props":779,"children":780},{"style":143},[781],{"type":37,"value":322},{"type":32,"tag":115,"props":783,"children":785},{"class":117,"line":784},27,[786,791],{"type":32,"tag":115,"props":787,"children":788},{"style":132},[789],{"type":37,"value":790},"  return",{"type":32,"tag":115,"props":792,"children":793},{"style":299},[794],{"type":37,"value":795}," `\u003C!DOCTYPE html>\n",{"type":32,"tag":115,"props":797,"children":799},{"class":117,"line":798},28,[800],{"type":32,"tag":115,"props":801,"children":802},{"style":299},[803],{"type":37,"value":804},"\u003Chtml>\n",{"type":32,"tag":115,"props":806,"children":808},{"class":117,"line":807},29,[809],{"type":32,"tag":115,"props":810,"children":811},{"style":299},[812],{"type":37,"value":813},"\u003Chead>\u003Ctitle>Page personnalisée\u003C\u002Ftitle>\u003C\u002Fhead>\n",{"type":32,"tag":115,"props":815,"children":817},{"class":117,"line":816},30,[818],{"type":32,"tag":115,"props":819,"children":820},{"style":299},[821],{"type":37,"value":822},"\u003Cbody>\n",{"type":32,"tag":115,"props":824,"children":826},{"class":117,"line":825},31,[827,832,837],{"type":32,"tag":115,"props":828,"children":829},{"style":299},[830],{"type":37,"value":831},"  \u003Ch1>${",{"type":32,"tag":115,"props":833,"children":834},{"style":143},[835],{"type":37,"value":836},"greeting",{"type":32,"tag":115,"props":838,"children":839},{"style":299},[840],{"type":37,"value":841},"}\u003C\u002Fh1>\n",{"type":32,"tag":115,"props":843,"children":845},{"class":117,"line":844},32,[846,851,855,859,864],{"type":32,"tag":115,"props":847,"children":848},{"style":299},[849],{"type":37,"value":850},"  \u003Cp>Région : ${",{"type":32,"tag":115,"props":852,"children":853},{"style":143},[854],{"type":37,"value":690},{"type":32,"tag":115,"props":856,"children":857},{"style":299},[858],{"type":37,"value":377},{"type":32,"tag":115,"props":860,"children":861},{"style":143},[862],{"type":37,"value":863},"region",{"type":32,"tag":115,"props":865,"children":866},{"style":299},[867],{"type":37,"value":868},"}\u003C\u002Fp>\n",{"type":32,"tag":115,"props":870,"children":872},{"class":117,"line":871},33,[873],{"type":32,"tag":115,"props":874,"children":875},{"style":299},[876],{"type":37,"value":877},"\u003C\u002Fbody>\n",{"type":32,"tag":115,"props":879,"children":881},{"class":117,"line":880},34,[882,887],{"type":32,"tag":115,"props":883,"children":884},{"style":299},[885],{"type":37,"value":886},"\u003C\u002Fhtml>`",{"type":32,"tag":115,"props":888,"children":889},{"style":143},[890],{"type":37,"value":322},{"type":32,"tag":115,"props":892,"children":894},{"class":117,"line":893},35,[895],{"type":32,"tag":115,"props":896,"children":897},{"style":143},[898],{"type":37,"value":899},"}\n",{"type":32,"tag":33,"props":901,"children":902},{},[903],{"type":37,"value":904},"Quand ce code s'exécute :",{"type":32,"tag":906,"props":907,"children":908},"ol",{},[909,914,919,924],{"type":32,"tag":61,"props":910,"children":911},{},[912],{"type":37,"value":913},"La requête arrive au nœud edge (10-30ms réseau)",{"type":32,"tag":61,"props":915,"children":916},{},[917],{"type":37,"value":918},"Le segment est lu depuis KV (sub-ms, cache local)",{"type":32,"tag":61,"props":920,"children":921},{},[922],{"type":37,"value":923},"Le HTML est rendu (10-20ms calcul)",{"type":32,"tag":61,"props":925,"children":926},{},[927],{"type":37,"value":928},"La réponse est envoyée",{"type":32,"tag":33,"props":930,"children":931},{},[932,937],{"type":32,"tag":65,"props":933,"children":934},{},[935],{"type":37,"value":936},"Total :",{"type":37,"value":938}," 40-60ms TTFB. Nos benchmarks avec Cloudflare Workers montrent un TTFB moyen de 42ms, P95 de 68ms (100 000 requêtes, trafic mondial).",{"type":32,"tag":940,"props":941,"children":943},"h3",{"id":942},"les-compromis-du-kv-store",[944],{"type":37,"value":945},"Les compromis du KV Store",{"type":32,"tag":33,"props":947,"children":948},{},[949],{"type":37,"value":950},"KV est finalement cohérent — l'écriture se propage dans les 60 secondes. Pour la personnalisation en temps réel (par exemple, afficher un produit ajouté au panier instantanément), ce n'est pas adapté. Dans ce cas :",{"type":32,"tag":57,"props":952,"children":953},{},[954,964],{"type":32,"tag":61,"props":955,"children":956},{},[957,962],{"type":32,"tag":65,"props":958,"children":959},{},[960],{"type":37,"value":961},"Option 1 :",{"type":37,"value":963}," Durable Objects (fortement cohérent, mais pas de distribution mondiale — fonctionnent dans une région unique)",{"type":32,"tag":61,"props":965,"children":966},{},[967,972],{"type":32,"tag":65,"props":968,"children":969},{},[970],{"type":37,"value":971},"Option 2 :",{"type":37,"value":973}," Hydratation côté client (première page générale, ensuite personnalisée par JavaScript)",{"type":32,"tag":33,"props":975,"children":976},{},[977,979,988],{"type":37,"value":978},"Dans nos projets de ",{"type":32,"tag":980,"props":981,"children":985},"a",{"href":982,"rel":983},"https:\u002F\u002Fwww.roibase.com.tr\u002Ffr\u002Fheadless",[984],"nofollow",[986],{"type":37,"value":987},"commerce headless",{"type":37,"value":989},", nous préférons généralement l'option 2 — utiliser un skeleton UI initial puis échanger le contenu pendant l'hydratation pour maîtriser le CLS.",{"type":32,"tag":40,"props":991,"children":993},{"id":992},"vercel-edge-functions-intégration-avec-nextjs-middleware",[994],{"type":37,"value":995},"Vercel Edge Functions : intégration avec Next.js Middleware",{"type":32,"tag":33,"props":997,"children":998},{},[999],{"type":37,"value":1000},"Vercel Edge Functions utilise l'infrastructure de Cloudflare Workers mais s'intègre à l'écosystème Next.js. L'API Middleware vous permet d'intervenir dans le pipeline SSR :",{"type":32,"tag":104,"props":1002,"children":1004},{"className":106,"code":1003,"language":108,"meta":16,"style":16},"\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 || 'anonymous';\n  \n  \u002F\u002F Lire le segment depuis le KV edge (Vercel KV = Upstash Redis)\n  const segment = await fetch(`https:\u002F\u002Fyour-kv-api.com\u002Fsegment\u002F${userId}`, {\n    headers: { 'Authorization': `Bearer ${process.env.KV_TOKEN}` }\n  }).then(r => r.json()).catch(() => ({ tier: 'free' }));\n  \n  \u002F\u002F Ajouter le segment au header de réponse (à utiliser dans le composant SSR)\n  const response = NextResponse.next();\n  response.headers.set('x-user-segment', JSON.stringify(segment));\n  \n  return response;\n}\n\nexport const config = {\n  matcher: ['\u002Fproducts\u002F:path*', '\u002Faccount\u002F:path*']\n};\n",[1005],{"type":32,"tag":111,"props":1006,"children":1007},{"__ignoreMap":16},[1008,1016,1043,1050,1095,1145,1153,1161,1208,1261,1332,1339,1347,1378,1423,1430,1442,1449,1456,1481,1508],{"type":32,"tag":115,"props":1009,"children":1010},{"class":117,"line":118},[1011],{"type":32,"tag":115,"props":1012,"children":1013},{"style":122},[1014],{"type":37,"value":1015},"\u002F\u002F middleware.ts — Vercel Edge\n",{"type":32,"tag":115,"props":1017,"children":1018},{"class":117,"line":128},[1019,1024,1029,1034,1039],{"type":32,"tag":115,"props":1020,"children":1021},{"style":132},[1022],{"type":37,"value":1023},"import",{"type":32,"tag":115,"props":1025,"children":1026},{"style":143},[1027],{"type":37,"value":1028}," { NextRequest, NextResponse } ",{"type":32,"tag":115,"props":1030,"children":1031},{"style":132},[1032],{"type":37,"value":1033},"from",{"type":32,"tag":115,"props":1035,"children":1036},{"style":299},[1037],{"type":37,"value":1038}," 'next\u002Fserver'",{"type":32,"tag":115,"props":1040,"children":1041},{"style":143},[1042],{"type":37,"value":322},{"type":32,"tag":115,"props":1044,"children":1045},{"class":117,"line":149},[1046],{"type":32,"tag":115,"props":1047,"children":1048},{"emptyLinePlaceholder":647},[1049],{"type":37,"value":650},{"type":32,"tag":115,"props":1051,"children":1052},{"class":117,"line":233},[1053,1057,1062,1067,1072,1076,1081,1085,1090],{"type":32,"tag":115,"props":1054,"children":1055},{"style":132},[1056],{"type":37,"value":135},{"type":32,"tag":115,"props":1058,"children":1059},{"style":132},[1060],{"type":37,"value":1061}," async",{"type":32,"tag":115,"props":1063,"children":1064},{"style":132},[1065],{"type":37,"value":1066}," function",{"type":32,"tag":115,"props":1068,"children":1069},{"style":158},[1070],{"type":37,"value":1071}," middleware",{"type":32,"tag":115,"props":1073,"children":1074},{"style":143},[1075],{"type":37,"value":166},{"type":32,"tag":115,"props":1077,"children":1078},{"style":169},[1079],{"type":37,"value":1080},"req",{"type":32,"tag":115,"props":1082,"children":1083},{"style":132},[1084],{"type":37,"value":177},{"type":32,"tag":115,"props":1086,"children":1087},{"style":158},[1088],{"type":37,"value":1089}," NextRequest",{"type":32,"tag":115,"props":1091,"children":1092},{"style":143},[1093],{"type":37,"value":1094},") {\n",{"type":32,"tag":115,"props":1096,"children":1097},{"class":117,"line":268},[1098,1102,1106,1110,1115,1119,1123,1128,1133,1137,1141],{"type":32,"tag":115,"props":1099,"children":1100},{"style":132},[1101],{"type":37,"value":733},{"type":32,"tag":115,"props":1103,"children":1104},{"style":242},[1105],{"type":37,"value":278},{"type":32,"tag":115,"props":1107,"children":1108},{"style":132},[1109],{"type":37,"value":250},{"type":32,"tag":115,"props":1111,"children":1112},{"style":143},[1113],{"type":37,"value":1114}," req.cookies.",{"type":32,"tag":115,"props":1116,"children":1117},{"style":158},[1118],{"type":37,"value":292},{"type":32,"tag":115,"props":1120,"children":1121},{"style":143},[1122],{"type":37,"value":166},{"type":32,"tag":115,"props":1124,"children":1125},{"style":299},[1126],{"type":37,"value":1127},"'user_id'",{"type":32,"tag":115,"props":1129,"children":1130},{"style":143},[1131],{"type":37,"value":1132},")?.value ",{"type":32,"tag":115,"props":1134,"children":1135},{"style":132},[1136],{"type":37,"value":312},{"type":32,"tag":115,"props":1138,"children":1139},{"style":299},[1140],{"type":37,"value":317},{"type":32,"tag":115,"props":1142,"children":1143},{"style":143},[1144],{"type":37,"value":322},{"type":32,"tag":115,"props":1146,"children":1147},{"class":117,"line":325},[1148],{"type":32,"tag":115,"props":1149,"children":1150},{"style":143},[1151],{"type":37,"value":1152},"  \n",{"type":32,"tag":115,"props":1154,"children":1155},{"class":117,"line":334},[1156],{"type":32,"tag":115,"props":1157,"children":1158},{"style":122},[1159],{"type":37,"value":1160},"  \u002F\u002F Lire le segment depuis le KV edge (Vercel KV = Upstash Redis)\n",{"type":32,"tag":115,"props":1162,"children":1163},{"class":117,"line":343},[1164,1168,1172,1176,1180,1184,1188,1193,1198,1203],{"type":32,"tag":115,"props":1165,"children":1166},{"style":132},[1167],{"type":37,"value":733},{"type":32,"tag":115,"props":1169,"children":1170},{"style":242},[1171],{"type":37,"value":353},{"type":32,"tag":115,"props":1173,"children":1174},{"style":132},[1175],{"type":37,"value":250},{"type":32,"tag":115,"props":1177,"children":1178},{"style":132},[1179],{"type":37,"value":362},{"type":32,"tag":115,"props":1181,"children":1182},{"style":158},[1183],{"type":37,"value":161},{"type":32,"tag":115,"props":1185,"children":1186},{"style":143},[1187],{"type":37,"value":166},{"type":32,"tag":115,"props":1189,"children":1190},{"style":299},[1191],{"type":37,"value":1192},"`https:\u002F\u002Fyour-kv-api.com\u002Fsegment\u002F${",{"type":32,"tag":115,"props":1194,"children":1195},{"style":143},[1196],{"type":37,"value":1197},"userId",{"type":32,"tag":115,"props":1199,"children":1200},{"style":299},[1201],{"type":37,"value":1202},"}`",{"type":32,"tag":115,"props":1204,"children":1205},{"style":143},[1206],{"type":37,"value":1207},", {\n",{"type":32,"tag":115,"props":1209,"children":1210},{"class":117,"line":26},[1211,1216,1221,1225,1230,1235,1239,1243,1247,1252,1256],{"type":32,"tag":115,"props":1212,"children":1213},{"style":143},[1214],{"type":37,"value":1215},"    headers: { ",{"type":32,"tag":115,"props":1217,"children":1218},{"style":299},[1219],{"type":37,"value":1220},"'Authorization'",{"type":32,"tag":115,"props":1222,"children":1223},{"style":143},[1224],{"type":37,"value":558},{"type":32,"tag":115,"props":1226,"children":1227},{"style":299},[1228],{"type":37,"value":1229},"`Bearer ${",{"type":32,"tag":115,"props":1231,"children":1232},{"style":143},[1233],{"type":37,"value":1234},"process",{"type":32,"tag":115,"props":1236,"children":1237},{"style":299},[1238],{"type":37,"value":377},{"type":32,"tag":115,"props":1240,"children":1241},{"style":143},[1242],{"type":37,"value":192},{"type":32,"tag":115,"props":1244,"children":1245},{"style":299},[1246],{"type":37,"value":377},{"type":32,"tag":115,"props":1248,"children":1249},{"style":242},[1250],{"type":37,"value":1251},"KV_TOKEN",{"type":32,"tag":115,"props":1253,"children":1254},{"style":299},[1255],{"type":37,"value":1202},{"type":32,"tag":115,"props":1257,"children":1258},{"style":143},[1259],{"type":37,"value":1260}," }\n",{"type":32,"tag":115,"props":1262,"children":1263},{"class":117,"line":463},[1264,1269,1274,1278,1283,1288,1293,1298,1303,1308,1313,1318,1323,1327],{"type":32,"tag":115,"props":1265,"children":1266},{"style":143},[1267],{"type":37,"value":1268},"  }).",{"type":32,"tag":115,"props":1270,"children":1271},{"style":158},[1272],{"type":37,"value":1273},"then",{"type":32,"tag":115,"props":1275,"children":1276},{"style":143},[1277],{"type":37,"value":166},{"type":32,"tag":115,"props":1279,"children":1280},{"style":169},[1281],{"type":37,"value":1282},"r",{"type":32,"tag":115,"props":1284,"children":1285},{"style":132},[1286],{"type":37,"value":1287}," =>",{"type":32,"tag":115,"props":1289,"children":1290},{"style":143},[1291],{"type":37,"value":1292}," r.",{"type":32,"tag":115,"props":1294,"children":1295},{"style":158},[1296],{"type":37,"value":1297},"json",{"type":32,"tag":115,"props":1299,"children":1300},{"style":143},[1301],{"type":37,"value":1302},"()).",{"type":32,"tag":115,"props":1304,"children":1305},{"style":158},[1306],{"type":37,"value":1307},"catch",{"type":32,"tag":115,"props":1309,"children":1310},{"style":143},[1311],{"type":37,"value":1312},"(() ",{"type":32,"tag":115,"props":1314,"children":1315},{"style":132},[1316],{"type":37,"value":1317},"=>",{"type":32,"tag":115,"props":1319,"children":1320},{"style":143},[1321],{"type":37,"value":1322}," ({ tier: ",{"type":32,"tag":115,"props":1324,"children":1325},{"style":299},[1326],{"type":37,"value":445},{"type":32,"tag":115,"props":1328,"children":1329},{"style":143},[1330],{"type":37,"value":1331}," }));\n",{"type":32,"tag":115,"props":1333,"children":1334},{"class":117,"line":471},[1335],{"type":32,"tag":115,"props":1336,"children":1337},{"style":143},[1338],{"type":37,"value":1152},{"type":32,"tag":115,"props":1340,"children":1341},{"class":117,"line":480},[1342],{"type":32,"tag":115,"props":1343,"children":1344},{"style":122},[1345],{"type":37,"value":1346},"  \u002F\u002F Ajouter le segment au header de réponse (à utiliser dans le composant SSR)\n",{"type":32,"tag":115,"props":1348,"children":1349},{"class":117,"line":507},[1350,1354,1359,1363,1368,1373],{"type":32,"tag":115,"props":1351,"children":1352},{"style":132},[1353],{"type":37,"value":733},{"type":32,"tag":115,"props":1355,"children":1356},{"style":242},[1357],{"type":37,"value":1358}," response",{"type":32,"tag":115,"props":1360,"children":1361},{"style":132},[1362],{"type":37,"value":250},{"type":32,"tag":115,"props":1364,"children":1365},{"style":143},[1366],{"type":37,"value":1367}," NextResponse.",{"type":32,"tag":115,"props":1369,"children":1370},{"style":158},[1371],{"type":37,"value":1372},"next",{"type":32,"tag":115,"props":1374,"children":1375},{"style":143},[1376],{"type":37,"value":1377},"();\n",{"type":32,"tag":115,"props":1379,"children":1380},{"class":117,"line":515},[1381,1386,1391,1395,1400,1404,1409,1413,1418],{"type":32,"tag":115,"props":1382,"children":1383},{"style":143},[1384],{"type":37,"value":1385},"  response.headers.",{"type":32,"tag":115,"props":1387,"children":1388},{"style":158},[1389],{"type":37,"value":1390},"set",{"type":32,"tag":115,"props":1392,"children":1393},{"style":143},[1394],{"type":37,"value":166},{"type":32,"tag":115,"props":1396,"children":1397},{"style":299},[1398],{"type":37,"value":1399},"'x-user-segment'",{"type":32,"tag":115,"props":1401,"children":1402},{"style":143},[1403],{"type":37,"value":187},{"type":32,"tag":115,"props":1405,"children":1406},{"style":242},[1407],{"type":37,"value":1408},"JSON",{"type":32,"tag":115,"props":1410,"children":1411},{"style":143},[1412],{"type":37,"value":377},{"type":32,"tag":115,"props":1414,"children":1415},{"style":158},[1416],{"type":37,"value":1417},"stringify",{"type":32,"tag":115,"props":1419,"children":1420},{"style":143},[1421],{"type":37,"value":1422},"(segment));\n",{"type":32,"tag":115,"props":1424,"children":1425},{"class":117,"line":538},[1426],{"type":32,"tag":115,"props":1427,"children":1428},{"style":143},[1429],{"type":37,"value":1152},{"type":32,"tag":115,"props":1431,"children":1432},{"class":117,"line":547},[1433,1437],{"type":32,"tag":115,"props":1434,"children":1435},{"style":132},[1436],{"type":37,"value":790},{"type":32,"tag":115,"props":1438,"children":1439},{"style":143},[1440],{"type":37,"value":1441}," response;\n",{"type":32,"tag":115,"props":1443,"children":1444},{"class":117,"line":571},[1445],{"type":32,"tag":115,"props":1446,"children":1447},{"style":143},[1448],{"type":37,"value":899},{"type":32,"tag":115,"props":1450,"children":1451},{"class":117,"line":593},[1452],{"type":32,"tag":115,"props":1453,"children":1454},{"emptyLinePlaceholder":647},[1455],{"type":37,"value":650},{"type":32,"tag":115,"props":1457,"children":1458},{"class":117,"line":607},[1459,1463,1468,1473,1477],{"type":32,"tag":115,"props":1460,"children":1461},{"style":132},[1462],{"type":37,"value":135},{"type":32,"tag":115,"props":1464,"children":1465},{"style":132},[1466],{"type":37,"value":1467}," const",{"type":32,"tag":115,"props":1469,"children":1470},{"style":242},[1471],{"type":37,"value":1472}," config",{"type":32,"tag":115,"props":1474,"children":1475},{"style":132},[1476],{"type":37,"value":250},{"type":32,"tag":115,"props":1478,"children":1479},{"style":143},[1480],{"type":37,"value":146},{"type":32,"tag":115,"props":1482,"children":1483},{"class":117,"line":616},[1484,1489,1494,1498,1503],{"type":32,"tag":115,"props":1485,"children":1486},{"style":143},[1487],{"type":37,"value":1488},"  matcher: [",{"type":32,"tag":115,"props":1490,"children":1491},{"style":299},[1492],{"type":37,"value":1493},"'\u002Fproducts\u002F:path*'",{"type":32,"tag":115,"props":1495,"children":1496},{"style":143},[1497],{"type":37,"value":187},{"type":32,"tag":115,"props":1499,"children":1500},{"style":299},[1501],{"type":37,"value":1502},"'\u002Faccount\u002F:path*'",{"type":32,"tag":115,"props":1504,"children":1505},{"style":143},[1506],{"type":37,"value":1507},"]\n",{"type":32,"tag":115,"props":1509,"children":1510},{"class":117,"line":625},[1511],{"type":32,"tag":115,"props":1512,"children":1513},{"style":143},[1514],{"type":37,"value":640},{"type":32,"tag":33,"props":1516,"children":1517},{},[1518],{"type":37,"value":1519},"Lire le header dans un composant SSR Next.js :",{"type":32,"tag":104,"props":1521,"children":1525},{"className":1522,"code":1523,"language":1524,"meta":16,"style":16},"language-tsx shiki shiki-themes github-dark","\u002F\u002F app\u002Fproducts\u002Fpage.tsx\nimport { headers } from 'next\u002Fheaders';\n\nexport default async function ProductsPage() {\n  const headersList = headers();\n  const segmentHeader = headersList.get('x-user-segment');\n  const segment = segmentHeader ? JSON.parse(segmentHeader) : { tier: 'free' };\n  \n  const products = await fetchProducts(segment.tier); \u002F\u002F Ensemble de produits différent selon le segment\n  \n  return (\n    \u003Cdiv>\n      \u003Ch1>{segment.tier === 'premium' ? 'Collection Exclusive' : 'Nos Produits'}\u003C\u002Fh1>\n      \u003CProductGrid products={products} \u002F>\n    \u003C\u002Fdiv>\n  );\n}\n","tsx",[1526],{"type":32,"tag":111,"props":1527,"children":1528},{"__ignoreMap":16},[1529,1537,1562,1569,1598,1623,1661,1718,1725,1760,1767,1779,1798,1855,1881,1897,1905],{"type":32,"tag":115,"props":1530,"children":1531},{"class":117,"line":118},[1532],{"type":32,"tag":115,"props":1533,"children":1534},{"style":122},[1535],{"type":37,"value":1536},"\u002F\u002F app\u002Fproducts\u002Fpage.tsx\n",{"type":32,"tag":115,"props":1538,"children":1539},{"class":117,"line":128},[1540,1544,1549,1553,1558],{"type":32,"tag":115,"props":1541,"children":1542},{"style":132},[1543],{"type":37,"value":1023},{"type":32,"tag":115,"props":1545,"children":1546},{"style":143},[1547],{"type":37,"value":1548}," { headers } ",{"type":32,"tag":115,"props":1550,"children":1551},{"style":132},[1552],{"type":37,"value":1033},{"type":32,"tag":115,"props":1554,"children":1555},{"style":299},[1556],{"type":37,"value":1557}," 'next\u002Fheaders'",{"type":32,"tag":115,"props":1559,"children":1560},{"style":143},[1561],{"type":37,"value":322},{"type":32,"tag":115,"props":1563,"children":1564},{"class":117,"line":149},[1565],{"type":32,"tag":115,"props":1566,"children":1567},{"emptyLinePlaceholder":647},[1568],{"type":37,"value":650},{"type":32,"tag":115,"props":1570,"children":1571},{"class":117,"line":233},[1572,1576,1580,1584,1588,1593],{"type":32,"tag":115,"props":1573,"children":1574},{"style":132},[1575],{"type":37,"value":135},{"type":32,"tag":115,"props":1577,"children":1578},{"style":132},[1579],{"type":37,"value":140},{"type":32,"tag":115,"props":1581,"children":1582},{"style":132},[1583],{"type":37,"value":1061},{"type":32,"tag":115,"props":1585,"children":1586},{"style":132},[1587],{"type":37,"value":1066},{"type":32,"tag":115,"props":1589,"children":1590},{"style":158},[1591],{"type":37,"value":1592}," ProductsPage",{"type":32,"tag":115,"props":1594,"children":1595},{"style":143},[1596],{"type":37,"value":1597},"() {\n",{"type":32,"tag":115,"props":1599,"children":1600},{"class":117,"line":268},[1601,1605,1610,1614,1619],{"type":32,"tag":115,"props":1602,"children":1603},{"style":132},[1604],{"type":37,"value":733},{"type":32,"tag":115,"props":1606,"children":1607},{"style":242},[1608],{"type":37,"value":1609}," headersList",{"type":32,"tag":115,"props":1611,"children":1612},{"style":132},[1613],{"type":37,"value":250},{"type":32,"tag":115,"props":1615,"children":1616},{"style":158},[1617],{"type":37,"value":1618}," headers",{"type":32,"tag":115,"props":1620,"children":1621},{"style":143},[1622],{"type":37,"value":1377},{"type":32,"tag":115,"props":1624,"children":1625},{"class":117,"line":325},[1626,1630,1635,1639,1644,1648,1652,1656],{"type":32,"tag":115,"props":1627,"children":1628},{"style":132},[1629],{"type":37,"value":733},{"type":32,"tag":115,"props":1631,"children":1632},{"style":242},[1633],{"type":37,"value":1634}," segmentHeader",{"type":32,"tag":115,"props":1636,"children":1637},{"style":132},[1638],{"type":37,"value":250},{"type":32,"tag":115,"props":1640,"children":1641},{"style":143},[1642],{"type":37,"value":1643}," headersList.",{"type":32,"tag":115,"props":1645,"children":1646},{"style":158},[1647],{"type":37,"value":292},{"type":32,"tag":115,"props":1649,"children":1650},{"style":143},[1651],{"type":37,"value":166},{"type":32,"tag":115,"props":1653,"children":1654},{"style":299},[1655],{"type":37,"value":1399},{"type":32,"tag":115,"props":1657,"children":1658},{"style":143},[1659],{"type":37,"value":1660},");\n",{"type":32,"tag":115,"props":1662,"children":1663},{"class":117,"line":334},[1664,1668,1672,1676,1681,1685,1689,1693,1697,1702,1706,1710,1714],{"type":32,"tag":115,"props":1665,"children":1666},{"style":132},[1667],{"type":37,"value":733},{"type":32,"tag":115,"props":1669,"children":1670},{"style":242},[1671],{"type":37,"value":353},{"type":32,"tag":115,"props":1673,"children":1674},{"style":132},[1675],{"type":37,"value":250},{"type":32,"tag":115,"props":1677,"children":1678},{"style":143},[1679],{"type":37,"value":1680}," segmentHeader ",{"type":32,"tag":115,"props":1682,"children":1683},{"style":132},[1684],{"type":37,"value":412},{"type":32,"tag":115,"props":1686,"children":1687},{"style":242},[1688],{"type":37,"value":417},{"type":32,"tag":115,"props":1690,"children":1691},{"style":143},[1692],{"type":37,"value":377},{"type":32,"tag":115,"props":1694,"children":1695},{"style":158},[1696],{"type":37,"value":426},{"type":32,"tag":115,"props":1698,"children":1699},{"style":143},[1700],{"type":37,"value":1701},"(segmentHeader) ",{"type":32,"tag":115,"props":1703,"children":1704},{"style":132},[1705],{"type":37,"value":177},{"type":32,"tag":115,"props":1707,"children":1708},{"style":143},[1709],{"type":37,"value":440},{"type":32,"tag":115,"props":1711,"children":1712},{"style":299},[1713],{"type":37,"value":445},{"type":32,"tag":115,"props":1715,"children":1716},{"style":143},[1717],{"type":37,"value":460},{"type":32,"tag":115,"props":1719,"children":1720},{"class":117,"line":343},[1721],{"type":32,"tag":115,"props":1722,"children":1723},{"style":143},[1724],{"type":37,"value":1152},{"type":32,"tag":115,"props":1726,"children":1727},{"class":117,"line":26},[1728,1732,1737,1741,1745,1750,1755],{"type":32,"tag":115,"props":1729,"children":1730},{"style":132},[1731],{"type":37,"value":733},{"type":32,"tag":115,"props":1733,"children":1734},{"style":242},[1735],{"type":37,"value":1736}," products",{"type":32,"tag":115,"props":1738,"children":1739},{"style":132},[1740],{"type":37,"value":250},{"type":32,"tag":115,"props":1742,"children":1743},{"style":132},[1744],{"type":37,"value":362},{"type":32,"tag":115,"props":1746,"children":1747},{"style":158},[1748],{"type":37,"value":1749}," fetchProducts",{"type":32,"tag":115,"props":1751,"children":1752},{"style":143},[1753],{"type":37,"value":1754},"(segment.tier); ",{"type":32,"tag":115,"props":1756,"children":1757},{"style":122},[1758],{"type":37,"value":1759},"\u002F\u002F Ensemble de produits différent selon le segment\n",{"type":32,"tag":115,"props":1761,"children":1762},{"class":117,"line":463},[1763],{"type":32,"tag":115,"props":1764,"children":1765},{"style":143},[1766],{"type":37,"value":1152},{"type":32,"tag":115,"props":1768,"children":1769},{"class":117,"line":471},[1770,1774],{"type":32,"tag":115,"props":1771,"children":1772},{"style":132},[1773],{"type":37,"value":790},{"type":32,"tag":115,"props":1775,"children":1776},{"style":143},[1777],{"type":37,"value":1778}," (\n",{"type":32,"tag":115,"props":1780,"children":1781},{"class":117,"line":480},[1782,1787,1793],{"type":32,"tag":115,"props":1783,"children":1784},{"style":143},[1785],{"type":37,"value":1786},"    \u003C",{"type":32,"tag":115,"props":1788,"children":1790},{"style":1789},"--shiki-default:#85E89D",[1791],{"type":37,"value":1792},"div",{"type":32,"tag":115,"props":1794,"children":1795},{"style":143},[1796],{"type":37,"value":1797},">\n",{"type":32,"tag":115,"props":1799,"children":1800},{"class":117,"line":507},[1801,1806,1811,1816,1820,1824,1828,1833,1837,1842,1847,1851],{"type":32,"tag":115,"props":1802,"children":1803},{"style":143},[1804],{"type":37,"value":1805},"      \u003C",{"type":32,"tag":115,"props":1807,"children":1808},{"style":1789},[1809],{"type":37,"value":1810},"h1",{"type":32,"tag":115,"props":1812,"children":1813},{"style":143},[1814],{"type":37,"value":1815},">{segment.tier ",{"type":32,"tag":115,"props":1817,"children":1818},{"style":132},[1819],{"type":37,"value":752},{"type":32,"tag":115,"props":1821,"children":1822},{"style":299},[1823],{"type":37,"value":757},{"type":32,"tag":115,"props":1825,"children":1826},{"style":132},[1827],{"type":37,"value":762},{"type":32,"tag":115,"props":1829,"children":1830},{"style":299},[1831],{"type":37,"value":1832}," 'Collection Exclusive'",{"type":32,"tag":115,"props":1834,"children":1835},{"style":132},[1836],{"type":37,"value":772},{"type":32,"tag":115,"props":1838,"children":1839},{"style":299},[1840],{"type":37,"value":1841}," 'Nos Produits'",{"type":32,"tag":115,"props":1843,"children":1844},{"style":143},[1845],{"type":37,"value":1846},"}\u003C\u002F",{"type":32,"tag":115,"props":1848,"children":1849},{"style":1789},[1850],{"type":37,"value":1810},{"type":32,"tag":115,"props":1852,"children":1853},{"style":143},[1854],{"type":37,"value":1797},{"type":32,"tag":115,"props":1856,"children":1857},{"class":117,"line":515},[1858,1862,1867,1871,1876],{"type":32,"tag":115,"props":1859,"children":1860},{"style":143},[1861],{"type":37,"value":1805},{"type":32,"tag":115,"props":1863,"children":1864},{"style":242},[1865],{"type":37,"value":1866},"ProductGrid",{"type":32,"tag":115,"props":1868,"children":1869},{"style":158},[1870],{"type":37,"value":1736},{"type":32,"tag":115,"props":1872,"children":1873},{"style":132},[1874],{"type":37,"value":1875},"=",{"type":32,"tag":115,"props":1877,"children":1878},{"style":143},[1879],{"type":37,"value":1880},"{products} \u002F>\n",{"type":32,"tag":115,"props":1882,"children":1883},{"class":117,"line":538},[1884,1889,1893],{"type":32,"tag":115,"props":1885,"children":1886},{"style":143},[1887],{"type":37,"value":1888},"    \u003C\u002F",{"type":32,"tag":115,"props":1890,"children":1891},{"style":1789},[1892],{"type":37,"value":1792},{"type":32,"tag":115,"props":1894,"children":1895},{"style":143},[1896],{"type":37,"value":1797},{"type":32,"tag":115,"props":1898,"children":1899},{"class":117,"line":547},[1900],{"type":32,"tag":115,"props":1901,"children":1902},{"style":143},[1903],{"type":37,"value":1904},"  );\n",{"type":32,"tag":115,"props":1906,"children":1907},{"class":117,"line":571},[1908],{"type":32,"tag":115,"props":1909,"children":1910},{"style":143},[1911],{"type":37,"value":899},{"type":32,"tag":33,"props":1913,"children":1914},{},[1915],{"type":37,"value":1916},"Nos benchmarks TTFB avec Vercel Edge :",{"type":32,"tag":1918,"props":1919,"children":1920},"table",{},[1921,1945],{"type":32,"tag":1922,"props":1923,"children":1924},"thead",{},[1925],{"type":32,"tag":1926,"props":1927,"children":1928},"tr",{},[1929,1935,1940],{"type":32,"tag":1930,"props":1931,"children":1932},"th",{},[1933],{"type":37,"value":1934},"Scénario",{"type":32,"tag":1930,"props":1936,"children":1937},{},[1938],{"type":37,"value":1939},"TTFB (médiane)",{"type":32,"tag":1930,"props":1941,"children":1942},{},[1943],{"type":37,"value":1944},"P95",{"type":32,"tag":1946,"props":1947,"children":1948},"tbody",{},[1949,1968,1986],{"type":32,"tag":1926,"props":1950,"children":1951},{},[1952,1958,1963],{"type":32,"tag":1953,"props":1954,"children":1955},"td",{},[1956],{"type":37,"value":1957},"Middleware Edge + KV",{"type":32,"tag":1953,"props":1959,"children":1960},{},[1961],{"type":37,"value":1962},"48ms",{"type":32,"tag":1953,"props":1964,"children":1965},{},[1966],{"type":37,"value":1967},"82ms",{"type":32,"tag":1926,"props":1969,"children":1970},{},[1971,1976,1981],{"type":32,"tag":1953,"props":1972,"children":1973},{},[1974],{"type":37,"value":1975},"SSR classique (us-east-1)",{"type":32,"tag":1953,"props":1977,"children":1978},{},[1979],{"type":37,"value":1980},"220ms",{"type":32,"tag":1953,"props":1982,"children":1983},{},[1984],{"type":37,"value":1985},"380ms",{"type":32,"tag":1926,"props":1987,"children":1988},{},[1989,1994,1999],{"type":32,"tag":1953,"props":1990,"children":1991},{},[1992],{"type":37,"value":1993},"Static + CSR",{"type":32,"tag":1953,"props":1995,"children":1996},{},[1997],{"type":37,"value":1998},"18ms (HTML) + 400ms (hydratation JS)",{"type":32,"tag":1953,"props":2000,"children":2001},{},[2002],{"type":37,"value":2003},"-",{"type":32,"tag":33,"props":2005,"children":2006},{},[2007],{"type":37,"value":2008},"L'avantage d'Edge SSR : TTFB faible + FCP rapide + SEO-friendly (contenu rendu côté serveur). Avec CSR, le HTML arrive vide et le FCP reste élevé.",{"type":32,"tag":40,"props":2010,"children":2012},{"id":2011},"stratégie-de-couche-données-kv-durable-objects-database-proxy",[2013],{"type":37,"value":2014},"Stratégie de couche données : KV, Durable Objects, Database Proxy",{"type":32,"tag":33,"props":2016,"children":2017},{},[2018],{"type":37,"value":2019},"Le problème le plus critique avec Edge SSR est la couche données. Le nœud edge est proche de l'utilisateur, mais votre base de données se trouve dans une région unique (par exemple, AWS RDS us-east-1). Si vous lancez une requête à la base de données pour chaque requête SSR, la latence réseau revient (100-200ms).",{"type":32,"tag":33,"props":2021,"children":2022},{},[2023],{"type":37,"value":2024},"Stratégies de solution :",{"type":32,"tag":940,"props":2026,"children":2028},{"id":2027},"_1-modèle-cache-first-avec-kv",[2029],{"type":37,"value":2030},"1. Modèle Cache-First avec KV",{"type":32,"tag":33,"props":2032,"children":2033},{},[2034],{"type":37,"value":2035},"Vous conservez les données peu changeantes mais fréquemment lues dans KV. Par exemple, le catalogue de produits — peut être mis à jour une fois par jour mais lu 100 000 fois par heure :",{"type":32,"tag":104,"props":2037,"children":2039},{"className":106,"code":2038,"language":108,"meta":16,"style":16},"\u002F\u002F Cloudflare Workers\nasync function getProduct(sku: string, env: Env): Promise\u003CProduct | null> {\n  \u002F\u002F 1. Lire depuis KV (sub-ms)\n  const cached = await env.PRODUCTS_KV.get(sku);\n  if (cached) return JSON.parse(cached);\n  \n  \u002F\u002F 2. Cache miss — récupérer depuis la base de données d'origine\n  const product = await fetchFromDatabase(sku);\n  \n  \u002F\u002F 3. Écrire dans KV (en arrière-plan, ne bloque pas la réponse)\n  env.waitUntil(env.PRODUCTS_KV.put(sku, JSON.stringify(product), { expirationTtl: 3600 }));\n  \n  return product;\n}\n",[2040],{"type":32,"tag":111,"props":2041,"children":2042},{"__ignoreMap":16},[2043,2051,2136,2144,2186,2221,2228,2236,2265,2272,2280,2342,2349,2361],{"type":32,"tag":115,"props":2044,"children":2045},{"class":117,"line":118},[2046],{"type":32,"tag":115,"props":2047,"children":2048},{"style":122},[2049],{"type":37,"value":2050},"\u002F\u002F Cloudflare Workers\n",{"type":32,"tag":115,"props":2052,"children":2053},{"class":117,"line":128},[2054,2059,2063,2068,2072,2077,2081,2085,2089,2093,2097,2101,2105,2109,2113,2117,2122,2127,2132],{"type":32,"tag":115,"props":2055,"children":2056},{"style":132},[2057],{"type":37,"value":2058},"async",{"type":32,"tag":115,"props":2060,"children":2061},{"style":132},[2062],{"type":37,"value":1066},{"type":32,"tag":115,"props":2064,"children":2065},{"style":158},[2066],{"type":37,"value":2067}," getProduct",{"type":32,"tag":115,"props":2069,"children":2070},{"style":143},[2071],{"type":37,"value":166},{"type":32,"tag":115,"props":2073,"children":2074},{"style":169},[2075],{"type":37,"value":2076},"sku",{"type":32,"tag":115,"props":2078,"children":2079},{"style":132},[2080],{"type":37,"value":177},{"type":32,"tag":115,"props":2082,"children":2083},{"style":242},[2084],{"type":37,"value":681},{"type":32,"tag":115,"props":2086,"children":2087},{"style":143},[2088],{"type":37,"value":187},{"type":32,"tag":115,"props":2090,"children":2091},{"style":169},[2092],{"type":37,"value":192},{"type":32,"tag":115,"props":2094,"children":2095},{"style":132},[2096],{"type":37,"value":177},{"type":32,"tag":115,"props":2098,"children":2099},{"style":158},[2100],{"type":37,"value":201},{"type":32,"tag":115,"props":2102,"children":2103},{"style":143},[2104],{"type":37,"value":206},{"type":32,"tag":115,"props":2106,"children":2107},{"style":132},[2108],{"type":37,"value":177},{"type":32,"tag":115,"props":2110,"children":2111},{"style":158},[2112],{"type":37,"value":215},{"type":32,"tag":115,"props":2114,"children":2115},{"style":143},[2116],{"type":37,"value":220},{"type":32,"tag":115,"props":2118,"children":2119},{"style":158},[2120],{"type":37,"value":2121},"Product",{"type":32,"tag":115,"props":2123,"children":2124},{"style":132},[2125],{"type":37,"value":2126}," |",{"type":32,"tag":115,"props":2128,"children":2129},{"style":242},[2130],{"type":37,"value":2131}," null",{"type":32,"tag":115,"props":2133,"children":2134},{"style":143},[2135],{"type":37,"value":230},{"type":32,"tag":115,"props":2137,"children":2138},{"class":117,"line":149},[2139],{"type":32,"tag":115,"props":2140,"children":2141},{"style":122},[2142],{"type":37,"value":2143},"  \u002F\u002F 1. Lire depuis KV (sub-ms)\n",{"type":32,"tag":115,"props":2145,"children":2146},{"class":117,"line":233},[2147,2151,2156,2160,2164,2168,2173,2177,2181],{"type":32,"tag":115,"props":2148,"children":2149},{"style":132},[2150],{"type":37,"value":733},{"type":32,"tag":115,"props":2152,"children":2153},{"style":242},[2154],{"type":37,"value":2155}," cached",{"type":32,"tag":115,"props":2157,"children":2158},{"style":132},[2159],{"type":37,"value":250},{"type":32,"tag":115,"props":2161,"children":2162},{"style":132},[2163],{"type":37,"value":362},{"type":32,"tag":115,"props":2165,"children":2166},{"style":143},[2167],{"type":37,"value":367},{"type":32,"tag":115,"props":2169,"children":2170},{"style":242},[2171],{"type":37,"value":2172},"PRODUCTS_KV",{"type":32,"tag":115,"props":2174,"children":2175},{"style":143},[2176],{"type":37,"value":377},{"type":32,"tag":115,"props":2178,"children":2179},{"style":158},[2180],{"type":37,"value":292},{"type":32,"tag":115,"props":2182,"children":2183},{"style":143},[2184],{"type":37,"value":2185},"(sku);\n",{"type":32,"tag":115,"props":2187,"children":2188},{"class":117,"line":268},[2189,2194,2199,2204,2208,2212,2216],{"type":32,"tag":115,"props":2190,"children":2191},{"style":132},[2192],{"type":37,"value":2193},"  if",{"type":32,"tag":115,"props":2195,"children":2196},{"style":143},[2197],{"type":37,"value":2198}," (cached) ",{"type":32,"tag":115,"props":2200,"children":2201},{"style":132},[2202],{"type":37,"value":2203},"return",{"type":32,"tag":115,"props":2205,"children":2206},{"style":242},[2207],{"type":37,"value":417},{"type":32,"tag":115,"props":2209,"children":2210},{"style":143},[2211],{"type":37,"value":377},{"type":32,"tag":115,"props":2213,"children":2214},{"style":158},[2215],{"type":37,"value":426},{"type":32,"tag":115,"props":2217,"children":2218},{"style":143},[2219],{"type":37,"value":2220},"(cached);\n",{"type":32,"tag":115,"props":2222,"children":2223},{"class":117,"line":325},[2224],{"type":32,"tag":115,"props":2225,"children":2226},{"style":143},[2227],{"type":37,"value":1152},{"type":32,"tag":115,"props":2229,"children":2230},{"class":117,"line":334},[2231],{"type":32,"tag":115,"props":2232,"children":2233},{"style":122},[2234],{"type":37,"value":2235},"  \u002F\u002F 2. Cache miss — récupérer depuis la base de données d'origine\n",{"type":32,"tag":115,"props":2237,"children":2238},{"class":117,"line":343},[2239,2243,2248,2252,2256,2261],{"type":32,"tag":115,"props":2240,"children":2241},{"style":132},[2242],{"type":37,"value":733},{"type":32,"tag":115,"props":2244,"children":2245},{"style":242},[2246],{"type":37,"value":2247}," product",{"type":32,"tag":115,"props":2249,"children":2250},{"style":132},[2251],{"type":37,"value":250},{"type":32,"tag":115,"props":2253,"children":2254},{"style":132},[2255],{"type":37,"value":362},{"type":32,"tag":115,"props":2257,"children":2258},{"style":158},[2259],{"type":37,"value":2260}," fetchFromDatabase",{"type":32,"tag":115,"props":2262,"children":2263},{"style":143},[2264],{"type":37,"value":2185},{"type":32,"tag":115,"props":2266,"children":2267},{"class":117,"line":26},[2268],{"type":32,"tag":115,"props":2269,"children":2270},{"style":143},[2271],{"type":37,"value":1152},{"type":32,"tag":115,"props":2273,"children":2274},{"class":117,"line":463},[2275],{"type":32,"tag":115,"props":2276,"children":2277},{"style":122},[2278],{"type":37,"value":2279},"  \u002F\u002F 3. Écrire dans KV (en arrière-plan, ne bloque pas la réponse)\n",{"type":32,"tag":115,"props":2281,"children":2282},{"class":117,"line":471},[2283,2288,2293,2298,2302,2306,2311,2316,2320,2324,2328,2333,2338],{"type":32,"tag":115,"props":2284,"children":2285},{"style":143},[2286],{"type":37,"value":2287},"  env.",{"type":32,"tag":115,"props":2289,"children":2290},{"style":158},[2291],{"type":37,"value":2292},"waitUntil",{"type":32,"tag":115,"props":2294,"children":2295},{"style":143},[2296],{"type":37,"value":2297},"(env.",{"type":32,"tag":115,"props":2299,"children":2300},{"style":242},[2301],{"type":37,"value":2172},{"type":32,"tag":115,"props":2303,"children":2304},{"style":143},[2305],{"type":37,"value":377},{"type":32,"tag":115,"props":2307,"children":2308},{"style":158},[2309],{"type":37,"value":2310},"put",{"type":32,"tag":115,"props":2312,"children":2313},{"style":143},[2314],{"type":37,"value":2315},"(sku, ",{"type":32,"tag":115,"props":2317,"children":2318},{"style":242},[2319],{"type":37,"value":1408},{"type":32,"tag":115,"props":2321,"children":2322},{"style":143},[2323],{"type":37,"value":377},{"type":32,"tag":115,"props":2325,"children":2326},{"style":158},[2327],{"type":37,"value":1417},{"type":32,"tag":115,"props":2329,"children":2330},{"style":143},[2331],{"type":37,"value":2332},"(product), { expirationTtl: ",{"type":32,"tag":115,"props":2334,"children":2335},{"style":242},[2336],{"type":37,"value":2337},"3600",{"type":32,"tag":115,"props":2339,"children":2340},{"style":143},[2341],{"type":37,"value":1331},{"type":32,"tag":115,"props":2343,"children":2344},{"class":117,"line":480},[2345],{"type":32,"tag":115,"props":2346,"children":2347},{"style":143},[2348],{"type":37,"value":1152},{"type":32,"tag":115,"props":2350,"children":2351},{"class":117,"line":507},[2352,2356],{"type":32,"tag":115,"props":2353,"children":2354},{"style":132},[2355],{"type":37,"value":790},{"type":32,"tag":115,"props":2357,"children":2358},{"style":143},[2359],{"type":37,"value":2360}," product;\n",{"type":32,"tag":115,"props":2362,"children":2363},{"class":117,"line":515},[2364],{"type":32,"tag":115,"props":2365,"children":2366},{"style":143},[2367],{"type":37,"value":899},{"type":32,"tag":33,"props":2369,"children":2370},{},[2371],{"type":37,"value":2372},"Avec ce modèle, quand le taux de cache hit est >95%, vous maintenez 40ms TTFB depuis l'edge. En cas de cache miss, cela monte à 200ms, mais la moyenne générale reste autour de 60ms.",{"type":32,"tag":940,"props":2374,"children":2376},{"id":2375},"_2-durable-objects-état-fortement-cohérent",[2377],{"type":37,"value":2378},"2. Durable Objects (État fortement cohérent)",{"type":32,"tag":33,"props":2380,"children":2381},{},[2382],{"type":37,"value":2383},"Pour les opérations nécessitant un état fortement cohérent comme le panier ou le paiement, Durable Objects peut être utilisé. Chaque instance Durable Object pour un utilisateur vit sur un nœud edge unique (routage sticky). Les écritures vers cette instance sont immédiatement lisibles :",{"type":32,"tag":104,"props":2385,"children":2387},{"className":106,"code":2386,"language":108,"meta":16,"style":16},"\u002F\u002F cart-durable-object.ts\nexport class Cart {\n  state: DurableObjectState;\n  items: CartItem[] = [];\n  \n  constructor(state: DurableObjectState) {\n    this.state = state;\n    this.state.blockConcurrencyWhile(async () => {\n      this.items = await this.state.storage.get('items') || [];\n    });\n  }\n  \n  async fetch(request: Request): Promise\u003CResponse> {\n    const url = new URL(request.url);\n    if (url.pathname === '\u002Fadd') {\n      const item = await request.json();\n      this.items.push(item);\n      await this.state.storage.put('items', this.items);\n      return new Response(JSON.stringify(this.items));\n    }\n    return new Response(JSON.stringify(this.items));\n  }\n}\n",[2388],{"type":32,"tag":111,"props":2389,"children":2390},{"__ignoreMap":16},[2391,2399,2420,2441,2472,2479,2508,2530,2568,2624,2631,2638,2645,2696,2723,2749,2783,2805,2847,2892,2900,2943,2950],{"type":32,"tag":115,"props":2392,"children":2393},{"class":117,"line":118},[2394],{"type":32,"tag":115,"props":2395,"children":2396},{"style":122},[2397],{"type":37,"value":2398},"\u002F\u002F cart-durable-object.ts\n",{"type":32,"tag":115,"props":2400,"children":2401},{"class":117,"line":128},[2402,2406,2411,2416],{"type":32,"tag":115,"props":2403,"children":2404},{"style":132},[2405],{"type":37,"value":135},{"type":32,"tag":115,"props":2407,"children":2408},{"style":132},[2409],{"type":37,"value":2410}," class",{"type":32,"tag":115,"props":2412,"children":2413},{"style":158},[2414],{"type":37,"value":2415}," Cart",{"type":32,"tag":115,"props":2417,"children":2418},{"style":143},[2419],{"type":37,"value":146},{"type":32,"tag":115,"props":2421,"children":2422},{"class":117,"line":149},[2423,2428,2432,2437],{"type":32,"tag":115,"props":2424,"children":2425},{"style":169},[2426],{"type":37,"value":2427},"  state",{"type":32,"tag":115,"props":2429,"children":2430},{"style":132},[2431],{"type":37,"value":177},{"type":32,"tag":115,"props":2433,"children":2434},{"style":158},[2435],{"type":37,"value":2436}," DurableObjectState",{"type":32,"tag":115,"props":2438,"children":2439},{"style":143},[2440],{"type":37,"value":322},{"type":32,"tag":115,"props":2442,"children":2443},{"class":117,"line":233},[2444,2449,2453,2458,2463,2467],{"type":32,"tag":115,"props":2445,"children":2446},{"style":169},[2447],{"type":37,"value":2448},"  items",{"type":32,"tag":115,"props":2450,"children":2451},{"style":132},[2452],{"type":37,"value":177},{"type":32,"tag":115,"props":2454,"children":2455},{"style":158},[2456],{"type":37,"value":2457}," CartItem",{"type":32,"tag":115,"props":2459,"children":2460},{"style":143},[2461],{"type":37,"value":2462},"[] ",{"type":32,"tag":115,"props":2464,"children":2465},{"style":132},[2466],{"type":37,"value":1875},{"type":32,"tag":115,"props":2468,"children":2469},{"style":143},[2470],{"type":37,"value":2471}," [];\n",{"type":32,"tag":115,"props":2473,"children":2474},{"class":117,"line":268},[2475],{"type":32,"tag":115,"props":2476,"children":2477},{"style":143},[2478],{"type":37,"value":1152},{"type":32,"tag":115,"props":2480,"children":2481},{"class":117,"line":325},[2482,2487,2491,2496,2500,2504],{"type":32,"tag":115,"props":2483,"children":2484},{"style":132},[2485],{"type":37,"value":2486},"  constructor",{"type":32,"tag":115,"props":2488,"children":2489},{"style":143},[2490],{"type":37,"value":166},{"type":32,"tag":115,"props":2492,"children":2493},{"style":169},[2494],{"type":37,"value":2495},"state",{"type":32,"tag":115,"props":2497,"children":2498},{"style":132},[2499],{"type":37,"value":177},{"type":32,"tag":115,"props":2501,"children":2502},{"style":158},[2503],{"type":37,"value":2436},{"type":32,"tag":115,"props":2505,"children":2506},{"style":143},[2507],{"type":37,"value":1094},{"type":32,"tag":115,"props":2509,"children":2510},{"class":117,"line":334},[2511,2516,2521,2525],{"type":32,"tag":115,"props":2512,"children":2513},{"style":242},[2514],{"type":37,"value":2515},"    this",{"type":32,"tag":115,"props":2517,"children":2518},{"style":143},[2519],{"type":37,"value":2520},".state ",{"type":32,"tag":115,"props":2522,"children":2523},{"style":132},[2524],{"type":37,"value":1875},{"type":32,"tag":115,"props":2526,"children":2527},{"style":143},[2528],{"type":37,"value":2529}," state;\n",{"type":32,"tag":115,"props":2531,"children":2532},{"class":117,"line":343},[2533,2537,2542,2547,2551,2555,2560,2564],{"type":32,"tag":115,"props":2534,"children":2535},{"style":242},[2536],{"type":37,"value":2515},{"type":32,"tag":115,"props":2538,"children":2539},{"style":143},[2540],{"type":37,"value":2541},".state.",{"type":32,"tag":115,"props":2543,"children":2544},{"style":158},[2545],{"type":37,"value":2546},"blockConcurrencyWhile",{"type":32,"tag":115,"props":2548,"children":2549},{"style":143},[2550],{"type":37,"value":166},{"type":32,"tag":115,"props":2552,"children":2553},{"style":132},[2554],{"type":37,"value":2058},{"type":32,"tag":115,"props":2556,"children":2557},{"style":143},[2558],{"type":37,"value":2559}," () ",{"type":32,"tag":115,"props":2561,"children":2562},{"style":132},[2563],{"type":37,"value":1317},{"type":32,"tag":115,"props":2565,"children":2566},{"style":143},[2567],{"type":37,"value":146},{"type":32,"tag":115,"props":2569,"children":2570},{"class":117,"line":26},[2571,2576,2581,2585,2589,2594,2599,2603,2607,2612,2616,2620],{"type":32,"tag":115,"props":2572,"children":2573},{"style":242},[2574],{"type":37,"value":2575},"      this",{"type":32,"tag":115,"props":2577,"children":2578},{"style":143},[2579],{"type":37,"value":2580},".items ",{"type":32,"tag":115,"props":2582,"children":2583},{"style":132},[2584],{"type":37,"value":1875},{"type":32,"tag":115,"props":2586,"children":2587},{"style":132},[2588],{"type":37,"value":362},{"type":32,"tag":115,"props":2590,"children":2591},{"style":242},[2592],{"type":37,"value":2593}," this",{"type":32,"tag":115,"props":2595,"children":2596},{"style":143},[2597],{"type":37,"value":2598},".state.storage.",{"type":32,"tag":115,"props":2600,"children":2601},{"style":158},[2602],{"type":37,"value":292},{"type":32,"tag":115,"props":2604,"children":2605},{"style":143},[2606],{"type":37,"value":166},{"type":32,"tag":115,"props":2608,"children":2609},{"style":299},[2610],{"type":37,"value":2611},"'items'",{"type":32,"tag":115,"props":2613,"children":2614},{"style":143},[2615],{"type":37,"value":307},{"type":32,"tag":115,"props":2617,"children":2618},{"style":132},[2619],{"type":37,"value":312},{"type":32,"tag":115,"props":2621,"children":2622},{"style":143},[2623],{"type":37,"value":2471},{"type":32,"tag":115,"props":2625,"children":2626},{"class":117,"line":463},[2627],{"type":32,"tag":115,"props":2628,"children":2629},{"style":143},[2630],{"type":37,"value":622},{"type":32,"tag":115,"props":2632,"children":2633},{"class":117,"line":471},[2634],{"type":32,"tag":115,"props":2635,"children":2636},{"style":143},[2637],{"type":37,"value":631},{"type":32,"tag":115,"props":2639,"children":2640},{"class":117,"line":480},[2641],{"type":32,"tag":115,"props":2642,"children":2643},{"style":143},[2644],{"type":37,"value":1152},{"type":32,"tag":115,"props":2646,"children":2647},{"class":117,"line":507},[2648,2652,2656,2660,2664,2668,2672,2676,2680,2684,2688,2692],{"type":32,"tag":115,"props":2649,"children":2650},{"style":132},[2651],{"type":37,"value":155},{"type":32,"tag":115,"props":2653,"children":2654},{"style":158},[2655],{"type":37,"value":161},{"type":32,"tag":115,"props":2657,"children":2658},{"style":143},[2659],{"type":37,"value":166},{"type":32,"tag":115,"props":2661,"children":2662},{"style":169},[2663],{"type":37,"value":172},{"type":32,"tag":115,"props":2665,"children":2666},{"style":132},[2667],{"type":37,"value":177},{"type":32,"tag":115,"props":2669,"children":2670},{"style":158},[2671],{"type":37,"value":182},{"type":32,"tag":115,"props":2673,"children":2674},{"style":143},[2675],{"type":37,"value":206},{"type":32,"tag":115,"props":2677,"children":2678},{"style":132},[2679],{"type":37,"value":177},{"type":32,"tag":115,"props":2681,"children":2682},{"style":158},[2683],{"type":37,"value":215},{"type":32,"tag":115,"props":2685,"children":2686},{"style":143},[2687],{"type":37,"value":220},{"type":32,"tag":115,"props":2689,"children":2690},{"style":158},[2691],{"type":37,"value":225},{"type":32,"tag":115,"props":2693,"children":2694},{"style":143},[2695],{"type":37,"value":230},{"type":32,"tag":115,"props":2697,"children":2698},{"class":117,"line":515},[2699,2703,2707,2711,2715,2719],{"type":32,"tag":115,"props":2700,"children":2701},{"style":132},[2702],{"type":37,"value":239},{"type":32,"tag":115,"props":2704,"children":2705},{"style":242},[2706],{"type":37,"value":245},{"type":32,"tag":115,"props":2708,"children":2709},{"style":132},[2710],{"type":37,"value":250},{"type":32,"tag":115,"props":2712,"children":2713},{"style":132},[2714],{"type":37,"value":255},{"type":32,"tag":115,"props":2716,"children":2717},{"style":158},[2718],{"type":37,"value":260},{"type":32,"tag":115,"props":2720,"children":2721},{"style":143},[2722],{"type":37,"value":265},{"type":32,"tag":115,"props":2724,"children":2725},{"class":117,"line":538},[2726,2731,2736,2740,2745],{"type":32,"tag":115,"props":2727,"children":2728},{"style":132},[2729],{"type":37,"value":2730},"    if",{"type":32,"tag":115,"props":2732,"children":2733},{"style":143},[2734],{"type":37,"value":2735}," (url.pathname ",{"type":32,"tag":115,"props":2737,"children":2738},{"style":132},[2739],{"type":37,"value":752},{"type":32,"tag":115,"props":2741,"children":2742},{"style":299},[2743],{"type":37,"value":2744}," '\u002Fadd'",{"type":32,"tag":115,"props":2746,"children":2747},{"style":143},[2748],{"type":37,"value":1094},{"type":32,"tag":115,"props":2750,"children":2751},{"class":117,"line":547},[2752,2757,2762,2766,2770,2775,2779],{"type":32,"tag":115,"props":2753,"children":2754},{"style":132},[2755],{"type":37,"value":2756},"      const",{"type":32,"tag":115,"props":2758,"children":2759},{"style":242},[2760],{"type":37,"value":2761}," item",{"type":32,"tag":115,"props":2763,"children":2764},{"style":132},[2765],{"type":37,"value":250},{"type":32,"tag":115,"props":2767,"children":2768},{"style":132},[2769],{"type":37,"value":362},{"type":32,"tag":115,"props":2771,"children":2772},{"style":143},[2773],{"type":37,"value":2774}," request.",{"type":32,"tag":115,"props":2776,"children":2777},{"style":158},[2778],{"type":37,"value":1297},{"type":32,"tag":115,"props":2780,"children":2781},{"style":143},[2782],{"type":37,"value":1377},{"type":32,"tag":115,"props":2784,"children":2785},{"class":117,"line":571},[2786,2790,2795,2800],{"type":32,"tag":115,"props":2787,"children":2788},{"style":242},[2789],{"type":37,"value":2575},{"type":32,"tag":115,"props":2791,"children":2792},{"style":143},[2793],{"type":37,"value":2794},".items.",{"type":32,"tag":115,"props":2796,"children":2797},{"style":158},[2798],{"type":37,"value":2799},"push",{"type":32,"tag":115,"props":2801,"children":2802},{"style":143},[2803],{"type":37,"value":2804},"(item);\n",{"type":32,"tag":115,"props":2806,"children":2807},{"class":117,"line":593},[2808,2813,2817,2821,2825,2829,2833,2837,2842],{"type":32,"tag":115,"props":2809,"children":2810},{"style":132},[2811],{"type":37,"value":2812},"      await",{"type":32,"tag":115,"props":2814,"children":2815},{"style":242},[2816],{"type":37,"value":2593},{"type":32,"tag":115,"props":2818,"children":2819},{"style":143},[2820],{"type":37,"value":2598},{"type":32,"tag":115,"props":2822,"children":2823},{"style":158},[2824],{"type":37,"value":2310},{"type":32,"tag":115,"props":2826,"children":2827},{"style":143},[2828],{"type":37,"value":166},{"type":32,"tag":115,"props":2830,"children":2831},{"style":299},[2832],{"type":37,"value":2611},{"type":32,"tag":115,"props":2834,"children":2835},{"style":143},[2836],{"type":37,"value":187},{"type":32,"tag":115,"props":2838,"children":2839},{"style":242},[2840],{"type":37,"value":2841},"this",{"type":32,"tag":115,"props":2843,"children":2844},{"style":143},[2845],{"type":37,"value":2846},".items);\n",{"type":32,"tag":115,"props":2848,"children":2849},{"class":117,"line":607},[2850,2855,2859,2863,2867,2871,2875,2879,2883,2887],{"type":32,"tag":115,"props":2851,"children":2852},{"style":132},[2853],{"type":37,"value":2854},"      return",{"type":32,"tag":115,"props":2856,"children":2857},{"style":132},[2858],{"type":37,"value":255},{"type":32,"tag":115,"props":2860,"children":2861},{"style":158},[2862],{"type":37,"value":530},{"type":32,"tag":115,"props":2864,"children":2865},{"style":143},[2866],{"type":37,"value":166},{"type":32,"tag":115,"props":2868,"children":2869},{"style":242},[2870],{"type":37,"value":1408},{"type":32,"tag":115,"props":2872,"children":2873},{"style":143},[2874],{"type":37,"value":377},{"type":32,"tag":115,"props":2876,"children":2877},{"style":158},[2878],{"type":37,"value":1417},{"type":32,"tag":115,"props":2880,"children":2881},{"style":143},[2882],{"type":37,"value":166},{"type":32,"tag":115,"props":2884,"children":2885},{"style":242},[2886],{"type":37,"value":2841},{"type":32,"tag":115,"props":2888,"children":2889},{"style":143},[2890],{"type":37,"value":2891},".items));\n",{"type":32,"tag":115,"props":2893,"children":2894},{"class":117,"line":616},[2895],{"type":32,"tag":115,"props":2896,"children":2897},{"style":143},[2898],{"type":37,"value":2899},"    }\n",{"type":32,"tag":115,"props":2901,"children":2902},{"class":117,"line":625},[2903,2907,2911,2915,2919,2923,2927,2931,2935,2939],{"type":32,"tag":115,"props":2904,"children":2905},{"style":132},[2906],{"type":37,"value":521},{"type":32,"tag":115,"props":2908,"children":2909},{"style":132},[2910],{"type":37,"value":255},{"type":32,"tag":115,"props":2912,"children":2913},{"style":158},[2914],{"type":37,"value":530},{"type":32,"tag":115,"props":2916,"children":2917},{"style":143},[2918],{"type":37,"value":166},{"type":32,"tag":115,"props":2920,"children":2921},{"style":242},[2922],{"type":37,"value":1408},{"type":32,"tag":115,"props":2924,"children":2925},{"style":143},[2926],{"type":37,"value":377},{"type":32,"tag":115,"props":2928,"children":2929},{"style":158},[2930],{"type":37,"value":1417},{"type":32,"tag":115,"props":2932,"children":2933},{"style":143},[2934],{"type":37,"value":166},{"type":32,"tag":115,"props":2936,"children":2937},{"style":242},[2938],{"type":37,"value":2841},{"type":32,"tag":115,"props":2940,"children":2941},{"style":143},[2942],{"type":37,"value":2891},{"type":32,"tag":115,"props":2944,"children":2945},{"class":117,"line":634},[2946],{"type":32,"tag":115,"props":2947,"children":2948},{"style":143},[2949],{"type":37,"value":631},{"type":32,"tag":115,"props":2951,"children":2952},{"class":117,"line":643},[2953],{"type":32,"tag":115,"props":2954,"children":2955},{"style":143},[2956],{"type":37,"value":899},{"type":32,"tag":33,"props":2958,"children":2959},{},[2960],{"type":37,"value":2961},"Compromis : les Durable Objects ne sont pas distribués mondialement — si un utilisateur à Tokyo envoie une requête mais que le Durable Object se trouve à us-east-1, la latence dépassera 150ms. C'est pourquoi nous préférons KV pour la plupart des cas.",{"type":32,"tag":940,"props":2963,"children":2965},{"id":2964},"_3-database-proxy-planetscale-neon-serverless",[2966],{"type":37,"value":2967},"3. Database Proxy (PlanetScale, Neon Serverless)",{"type":32,"tag":33,"props":2969,"children":2970},{},[2971],{"type":37,"value":2972},"Des bases de données serverless comme PlanetScale et Neon proposent des API HTTP compatibles avec l'edge. Une fonction edge peut appeler directement cette API :",{"type":32,"tag":104,"props":2974,"children":2976},{"className":106,"code":2975,"language":108,"meta":16,"style":16},"\u002F\u002F Requête vers Neon Serverless depuis l'edge\nimport { neon } from '@neondatabase\u002Fserverless';\n\nconst sql = neon(process.env.DATABASE_URL);\n\nexport default async function handler(req: Request) {\n  const products = await sql`SELECT * FROM products WHERE featured = true LIMIT 10`;\n  return new Response(JSON.stringify(products));\n}\n",[2977],{"type":32,"tag":111,"props":2978,"children":2979},{"__ignoreMap":16},[2980,2988,3013,3020,3056,3063,3107,3139,3175],{"type":32,"tag":115,"props":2981,"children":2982},{"class":117,"line":118},[2983],{"type":32,"tag":115,"props":2984,"children":2985},{"style":122},[2986],{"type":37,"value":2987},"\u002F\u002F Requête vers Neon Serverless depuis l'edge\n",{"type":32,"tag":115,"props":2989,"children":2990},{"class":117,"line":128},[2991,2995,3000,3004,3009],{"type":32,"tag":115,"props":2992,"children":2993},{"style":132},[2994],{"type":37,"value":1023},{"type":32,"tag":115,"props":2996,"children":2997},{"style":143},[2998],{"type":37,"value":2999}," { neon } ",{"type":32,"tag":115,"props":3001,"children":3002},{"style":132},[3003],{"type":37,"value":1033},{"type":32,"tag":115,"props":3005,"children":3006},{"style":299},[3007],{"type":37,"value":3008}," '@neondatabase\u002Fserverless'",{"type":32,"tag":115,"props":3010,"children":3011},{"style":143},[3012],{"type":37,"value":322},{"type":32,"tag":115,"props":3014,"children":3015},{"class":117,"line":149},[3016],{"type":32,"tag":115,"props":3017,"children":3018},{"emptyLinePlaceholder":647},[3019],{"type":37,"value":650},{"type":32,"tag":115,"props":3021,"children":3022},{"class":117,"line":233},[3023,3028,3033,3037,3042,3047,3052],{"type":32,"tag":115,"props":3024,"children":3025},{"style":132},[3026],{"type":37,"value":3027},"const",{"type":32,"tag":115,"props":3029,"children":3030},{"style":242},[3031],{"type":37,"value":3032}," sql",{"type":32,"tag":115,"props":3034,"children":3035},{"style":132},[3036],{"type":37,"value":250},{"type":32,"tag":115,"props":3038,"children":3039},{"style":158},[3040],{"type":37,"value":3041}," neon",{"type":32,"tag":115,"props":3043,"children":3044},{"style":143},[3045],{"type":37,"value":3046},"(process.env.",{"type":32,"tag":115,"props":3048,"children":3049},{"style":242},[3050],{"type":37,"value":3051},"DATABASE_URL",{"type":32,"tag":115,"props":3053,"children":3054},{"style":143},[3055],{"type":37,"value":1660},{"type":32,"tag":115,"props":3057,"children":3058},{"class":117,"line":268},[3059],{"type":32,"tag":115,"props":3060,"children":3061},{"emptyLinePlaceholder":647},[3062],{"type":37,"value":650},{"type":32,"tag":115,"props":3064,"children":3065},{"class":117,"line":325},[3066,3070,3074,3078,3082,3087,3091,3095,3099,3103],{"type":32,"tag":115,"props":3067,"children":3068},{"style":132},[3069],{"type":37,"value":135},{"type":32,"tag":115,"props":3071,"children":3072},{"style":132},[3073],{"type":37,"value":140},{"type":32,"tag":115,"props":3075,"children":3076},{"style":132},[3077],{"type":37,"value":1061},{"type":32,"tag":115,"props":3079,"children":3080},{"style":132},[3081],{"type":37,"value":1066},{"type":32,"tag":115,"props":3083,"children":3084},{"style":158},[3085],{"type":37,"value":3086}," handler",{"type":32,"tag":115,"props":3088,"children":3089},{"style":143},[3090],{"type":37,"value":166},{"type":32,"tag":115,"props":3092,"children":3093},{"style":169},[3094],{"type":37,"value":1080},{"type":32,"tag":115,"props":3096,"children":3097},{"style":132},[3098],{"type":37,"value":177},{"type":32,"tag":115,"props":3100,"children":3101},{"style":158},[3102],{"type":37,"value":182},{"type":32,"tag":115,"props":3104,"children":3105},{"style":143},[3106],{"type":37,"value":1094},{"type":32,"tag":115,"props":3108,"children":3109},{"class":117,"line":334},[3110,3114,3118,3122,3126,3130,3135],{"type":32,"tag":115,"props":3111,"children":3112},{"style":132},[3113],{"type":37,"value":733},{"type":32,"tag":115,"props":3115,"children":3116},{"style":242},[3117],{"type":37,"value":1736},{"type":32,"tag":115,"props":3119,"children":3120},{"style":132},[3121],{"type":37,"value":250},{"type":32,"tag":115,"props":3123,"children":3124},{"style":132},[3125],{"type":37,"value":362},{"type":32,"tag":115,"props":3127,"children":3128},{"style":158},[3129],{"type":37,"value":3032},{"type":32,"tag":115,"props":3131,"children":3132},{"style":299},[3133],{"type":37,"value":3134},"`SELECT * FROM products WHERE featured = true LIMIT 10`",{"type":32,"tag":115,"props":3136,"children":3137},{"style":143},[3138],{"type":37,"value":322},{"type":32,"tag":115,"props":3140,"children":3141},{"class":117,"line":343},[3142,3146,3150,3154,3158,3162,3166,3170],{"type":32,"tag":115,"props":3143,"children":3144},{"style":132},[3145],{"type":37,"value":790},{"type":32,"tag":115,"props":3147,"children":3148},{"style":132},[3149],{"type":37,"value":255},{"type":32,"tag":115,"props":3151,"children":3152},{"style":158},[3153],{"type":37,"value":530},{"type":32,"tag":115,"props":3155,"children":3156},{"style":143},[3157],{"type":37,"value":166},{"type":32,"tag":115,"props":3159,"children":3160},{"style":242},[3161],{"type":37,"value":1408},{"type":32,"tag":115,"props":3163,"children":3164},{"style":143},[3165],{"type":37,"value":377},{"type":32,"tag":115,"props":3167,"children":3168},{"style":158},[3169],{"type":37,"value":1417},{"type":32,"tag":115,"props":3171,"children":3172},{"style":143},[3173],{"type":37,"value":3174},"(products));\n",{"type":32,"tag":115,"props":3176,"children":3177},{"class":117,"line":26},[3178],{"type":32,"tag":115,"props":3179,"children":3180},{"style":143},[3181],{"type":37,"value":899},{"type":32,"tag":33,"props":3183,"children":3184},{},[3185],{"type":37,"value":3186},"Latence : 40-80ms (proxy de base de données hébergé sur les nœuds edge). Contrairement à une connexion Postgres classique (TCP), elle fonctionne via HTTP et est compatible avec les runtime edge.",{"type":32,"tag":40,"props":3188,"children":3190},{"id":3189},"taille-du-bundle-et-réalité-du-cold-start",[3191],{"type":37,"value":3192},"Taille du bundle et réalité du cold start",{"type":32,"tag":33,"props":3194,"children":3195},{},[3196],{"type":37,"value":3197},"Pour les runtime edge, la taille du bundle est critique — limite de 1MB pour Cloudflare Workers, 1MB compressé pour Vercel Edge. Ajouter React SSR peut faire monter le bundle à 800KB. Solutions :",{"type":32,"tag":57,"props":3199,"children":3200},{},[3201,3211,3221],{"type":32,"tag":61,"props":3202,"children":3203},{},[3204,3209],{"type":32,"tag":65,"props":3205,"children":3206},{},[3207],{"type":37,"value":3208},"Streaming SSR :",{"type":37,"value":3210}," envoyer le HTML par chunks, réduire le TTFB sans attendre la compilation complète de l'arborescence des composants",{"type":32,"tag":61,"props":3212,"children":3213},{},[3214,3219],{"type":32,"tag":65,"props":3215,"children":3216},{},[3217],{"type":37,"value":3218},"Hydratation sélective :",{"type":37,"value":3220}," hydrater uniquement les composants interactifs côté client",{"type":32,"tag":61,"props":3222,"children":3223},{},[3224,3229],{"type":32,"tag":65,"props":3225,"children":3226},{},[3227],{"type":37,"value":3228},"Code splitting :",{"type":37,"value":3230}," bundle distinct par route (Next.js le fait automatiquement)",{"type":32,"tag":33,"props":3232,"children":3233},{},[3234],{"type":37,"value":3235},"Réalité du cold start : Cloudflare Workers 0ms (modèle isolate), Vercel Edge 50-150ms (premier déploiement mondial). En production, cette différence disparaît car Vercel maintient un pool d'instances warm.",{"type":32,"tag":40,"props":3237,"children":3239},{"id":3238},"les-12-prochains-mois-webassembly-et-computeedge",[3240],{"type":37,"value":3241},"Les 12 prochains mois : WebAssembly et Compute@Edge",{"type":32,"tag":33,"props":3243,"children":3244},{},[3245],{"type":37,"value":3246},"La prochaine étape d'Edge SSR est WebAssembly. Vous pouvez compiler des moteurs SSR écrits en Rust\u002FGo en WASM et les exécuter à l'edge — taille du bundle 200KB, calcul 5-10ms. Hydrogen 2.0 de Shopify s'oriente dans cette direction.",{"type":32,"tag":33,"props":3248,"children":3249},{},[3250,3252,3259],{"type":37,"value":3251},"Fastly Compute@Edge et le support WASM de Cloudflare seront production-ready en 2026. Dans notre offre de ",{"type":32,"tag":980,"props":3253,"children":3256},{"href":3254,"rel":3255},"https:\u002F\u002Fwww.roibase.com.tr\u002Ffr\u002Fshopify",[984],[3257],{"type":37,"value":3258},"services partenaires Shopify",{"type":37,"value":3260},", nous testons actuellement l'architecture Hydrogen + WASM — les premiers benchmarks affichent 28ms TTFB.",{"type":32,"tag":3262,"props":3263,"children":3264},"hr",{},[],{"type":32,"tag":33,"props":3266,"children":3267},{},[3268],{"type":37,"value":3269},"Edge SSR promet 40ms de latence, mais ce n'est pas adapté à tous les cas. Pour les projets nécessitant un état temps réel (panier, chat), un fort volume de requêtes base de données ou une dépendance étroite à votre backend existant, SSR classique + cache CDN peut être plus efficace. En revanche, pour les projets riches en contenu, nécessitant de la personnalisation et recevant du trafic mondial (e-commerce, médias, SaaS landing), Edge SSR est l'architecture appropriée. En comprenant les compromis et en structurant votre couche données selon le modèle KV-first, vous atteindrez vraiment les 40ms TTFB.",{"type":32,"tag":3271,"props":3272,"children":3273},"style",{},[3274],{"type":37,"value":3275},"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":149,"depth":149,"links":3277},[3278,3279,3282,3283,3288,3289],{"id":42,"depth":128,"text":45},{"id":89,"depth":128,"text":92,"children":3280},[3281],{"id":942,"depth":149,"text":945},{"id":992,"depth":128,"text":995},{"id":2011,"depth":128,"text":2014,"children":3284},[3285,3286,3287],{"id":2027,"depth":149,"text":2030},{"id":2375,"depth":149,"text":2378},{"id":2964,"depth":149,"text":2967},{"id":3189,"depth":128,"text":3192},{"id":3238,"depth":128,"text":3241},"markdown","content:fr:tech:edge-ssr-personnalisation-latence-40ms.md","content","fr\u002Ftech\u002Fedge-ssr-personnalisation-latence-40ms.md","fr\u002Ftech\u002Fedge-ssr-personnalisation-latence-40ms","md",1782079501968]