[{"data":1,"prerenderedAt":1550},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fit\u002Ftech\u002Fstrategie-prerender-nuxt-3":13},{"i18nKey":4,"paths":5},"tech-007-2026-05",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Ftech\u002Fssg-leitfaden-fuer-nuxt-3","\u002Fen\u002Ftech\u002Fnuxt-3-ssg-prerender-strategies-build-optimization","\u002Fes\u002Ftech\u002Festrategias-prerender-nuxt-3","\u002Ffr\u002Ftech\u002Fstrategie-prerender-nuxt-3-optimisation-build","\u002Fit\u002Ftech\u002Fstrategie-prerender-nuxt-3","\u002Fru\u002Ftech\u002Fssg-strategii-dlya-nuxt-3","\u002Ftr\u002Ftech\u002Fnuxt-3-ssg-prerender-stratejileri-ve-build-optimizasyonu",{"_path":10,"_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":1544,"_id":1545,"_source":1546,"_file":1547,"_stem":1548,"_extension":1549},"tech",false,"","Nuxt 3 SSG: Strategie di Prerendering e Ottimizzazione della Build","Static site generation con Nuxt 3: route rules, payload extraction e regenerazione incrementale. Ridurre i tempi di build da 40 a 8 secondi.","2026-05-21",[21,22,23,24,25],"nuxt-3","ssg","prerender","build-optimization","vue",8,"Roibase",{"type":29,"children":30,"toc":1533},"root",[31,55,62,67,80,92,112,125,131,179,481,502,509,522,692,719,732,738,743,762,831,836,854,978,983,989,1002,1073,1085,1090,1096,1101,1357,1370,1386,1392,1397,1508,1513,1518,1522,1527],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36,39,46,48,53],{"type":37,"value":38},"text","Il motore di static site generation (SSG) di Nuxt 3 è radicalmente diverso dalla versione 2.x. Con Nitro engine, le direttive ",{"type":32,"tag":40,"props":41,"children":43},"code",{"className":42},[],[44],{"type":37,"value":45},"routeRules",{"type":37,"value":47}," e ",{"type":32,"tag":40,"props":49,"children":51},{"className":50},[],[52],{"type":37,"value":23},{"type":37,"value":54},", insieme ai meccanismi di payload extraction, influenzano direttamente i tempi di build e le prestazioni runtime. Condividiamo le strategie con le quali abbiamo ridotto il tempo di build da 40 secondi a 8 secondi su un sito di e-commerce con 10.000 pagine, analizzando i trade-off e le metriche.",{"type":32,"tag":56,"props":57,"children":59},"h2",{"id":58},"matrice-di-selezione-delle-strategie-di-prerendering",[60],{"type":37,"value":61},"Matrice di Selezione delle Strategie di Prerendering",{"type":32,"tag":33,"props":63,"children":64},{},[65],{"type":37,"value":66},"Nuxt 3 offre 4 strategie principali di prerendering: full static, partial prerender, ISR hybrid e on-demand generation. Ognuna presenta differenti caratteristiche in termini di build time, runtime cost e cache hit rate.",{"type":32,"tag":33,"props":68,"children":69},{},[70,72,78],{"type":37,"value":71},"Full static (",{"type":32,"tag":40,"props":73,"children":75},{"className":74},[],[76],{"type":37,"value":77},"nitro.prerender.routes",{"type":37,"value":79},"): Renderizza tutte le route al momento della build e le esporta come HTML. Ideale per siti di 100 pagine, ma per 10.000 pagine la build può superare i 5 minuti. Pro: nessun runtime, cache hit del 100% su CDN. Contro: ogni modifica del contenuto richiede una rebuild completa. Per un e-commerce dove il catalogo prodotti si aggiorna 50 volte al giorno, questa soluzione non è sostenibile.",{"type":32,"tag":33,"props":81,"children":82},{},[83,85,90],{"type":37,"value":84},"Partial prerender (con ",{"type":32,"tag":40,"props":86,"children":88},{"className":87},[],[89],{"type":37,"value":45},{"type":37,"value":91},"): Prerenderi le route critiche (homepage, top 100 categorie) e gestisci la long tail con ISR. Il tempo di build diminuisce del 90%. Esempio: su un sito con 10.000 prodotti, prerenderi i primi 500, i restanti vengono cachati alla prima richiesta. Penalità per cache miss: 800ms (SSR), cache hit: 40ms (HTML statico).",{"type":32,"tag":33,"props":93,"children":94},{},[95,97,102,104,110],{"type":37,"value":96},"Incremental Static Regeneration (ISR): Su piattaforme come Vercel o Netlify, si implementa con ",{"type":32,"tag":40,"props":98,"children":100},{"className":99},[],[101],{"type":37,"value":45},{"type":37,"value":103}," + ",{"type":32,"tag":40,"props":105,"children":107},{"className":106},[],[108],{"type":37,"value":109},"swr\u002Fstale",{"type":37,"value":111},". La pagina entra in cache dopo il primo rendering, e viene rigenerata in background quando il TTL scade. Trade-off: rischio di contenuto stale rispetto al guadagno nel tempo di build. Con un TTL di 24 ore, non catturerai gli aggiornamenti dei prezzi giornalieri, ma il tempo di build scende a 2 secondi.",{"type":32,"tag":33,"props":113,"children":114},{},[115,117,123],{"type":37,"value":116},"On-demand (attivato tramite ",{"type":32,"tag":40,"props":118,"children":120},{"className":119},[],[121],{"type":37,"value":122},"server\u002Fapi",{"type":37,"value":124},"): Quando il contenuto cambia, solo la route interessata viene rigenerata, solitamente tramite webhook. Tempo di build minimo, ma complessità orchestrale massima. Devi implementare un pipeline CMS webhook → Nitro API → route invalidation.",{"type":32,"tag":56,"props":126,"children":128},{"id":127},"controllo-granulare-con-route-rules",[129],{"type":37,"value":130},"Controllo Granulare con Route Rules",{"type":32,"tag":33,"props":132,"children":133},{},[134,136,142,144,149,151,156,157,163,164,170,171,177],{"type":37,"value":135},"In ",{"type":32,"tag":40,"props":137,"children":139},{"className":138},[],[140],{"type":37,"value":141},"nuxt.config.ts",{"type":37,"value":143},", ",{"type":32,"tag":40,"props":145,"children":147},{"className":146},[],[148],{"type":37,"value":45},{"type":37,"value":150}," definisce una strategia di rendering diversa per ogni route. A questo livello, direttive come ",{"type":32,"tag":40,"props":152,"children":154},{"className":153},[],[155],{"type":37,"value":23},{"type":37,"value":143},{"type":32,"tag":40,"props":158,"children":160},{"className":159},[],[161],{"type":37,"value":162},"swr",{"type":37,"value":143},{"type":32,"tag":40,"props":165,"children":167},{"className":166},[],[168],{"type":37,"value":169},"isr",{"type":37,"value":143},{"type":32,"tag":40,"props":172,"children":174},{"className":173},[],[175],{"type":37,"value":176},"ssr",{"type":37,"value":178}," controllano il comportamento della cache per singola route.",{"type":32,"tag":180,"props":181,"children":185},"pre",{"className":182,"code":183,"language":184,"meta":16,"style":16},"language-typescript shiki shiki-themes github-dark","export default defineNuxtConfig({\n  routeRules: {\n    '\u002F': { prerender: true }, \u002F\u002F Homepage sempre statica\n    '\u002Fproducts\u002F**': { swr: 3600 }, \u002F\u002F Prodotti cachati per 1 ora\n    '\u002Fapi\u002F**': { cors: true, cache: false }, \u002F\u002F Endpoint API non cachati\n    '\u002Fcategory\u002F:slug': { isr: true }, \u002F\u002F ISR attivo\n  },\n  nitro: {\n    prerender: {\n      crawlLinks: true, \u002F\u002F Segui i link dalla sitemap\n      routes: ['\u002Fsitemap.xml'], \u002F\u002F Definizione manuale delle route\n      ignore: ['\u002Fadmin', '\u002Fcheckout\u002F**'], \u002F\u002F Escludere dal prerender\n    },\n  },\n})\n","typescript",[186],{"type":32,"tag":40,"props":187,"children":188},{"__ignoreMap":16},[189,218,227,259,287,324,351,360,368,377,399,423,455,464,472],{"type":32,"tag":190,"props":191,"children":194},"span",{"class":192,"line":193},"line",1,[195,201,206,212],{"type":32,"tag":190,"props":196,"children":198},{"style":197},"--shiki-default:#F97583",[199],{"type":37,"value":200},"export",{"type":32,"tag":190,"props":202,"children":203},{"style":197},[204],{"type":37,"value":205}," default",{"type":32,"tag":190,"props":207,"children":209},{"style":208},"--shiki-default:#B392F0",[210],{"type":37,"value":211}," defineNuxtConfig",{"type":32,"tag":190,"props":213,"children":215},{"style":214},"--shiki-default:#E1E4E8",[216],{"type":37,"value":217},"({\n",{"type":32,"tag":190,"props":219,"children":221},{"class":192,"line":220},2,[222],{"type":32,"tag":190,"props":223,"children":224},{"style":214},[225],{"type":37,"value":226},"  routeRules: {\n",{"type":32,"tag":190,"props":228,"children":230},{"class":192,"line":229},3,[231,237,242,248,253],{"type":32,"tag":190,"props":232,"children":234},{"style":233},"--shiki-default:#9ECBFF",[235],{"type":37,"value":236},"    '\u002F'",{"type":32,"tag":190,"props":238,"children":239},{"style":214},[240],{"type":37,"value":241},": { prerender: ",{"type":32,"tag":190,"props":243,"children":245},{"style":244},"--shiki-default:#79B8FF",[246],{"type":37,"value":247},"true",{"type":32,"tag":190,"props":249,"children":250},{"style":214},[251],{"type":37,"value":252}," }, ",{"type":32,"tag":190,"props":254,"children":256},{"style":255},"--shiki-default:#6A737D",[257],{"type":37,"value":258},"\u002F\u002F Homepage sempre statica\n",{"type":32,"tag":190,"props":260,"children":262},{"class":192,"line":261},4,[263,268,273,278,282],{"type":32,"tag":190,"props":264,"children":265},{"style":233},[266],{"type":37,"value":267},"    '\u002Fproducts\u002F**'",{"type":32,"tag":190,"props":269,"children":270},{"style":214},[271],{"type":37,"value":272},": { swr: ",{"type":32,"tag":190,"props":274,"children":275},{"style":244},[276],{"type":37,"value":277},"3600",{"type":32,"tag":190,"props":279,"children":280},{"style":214},[281],{"type":37,"value":252},{"type":32,"tag":190,"props":283,"children":284},{"style":255},[285],{"type":37,"value":286},"\u002F\u002F Prodotti cachati per 1 ora\n",{"type":32,"tag":190,"props":288,"children":290},{"class":192,"line":289},5,[291,296,301,305,310,315,319],{"type":32,"tag":190,"props":292,"children":293},{"style":233},[294],{"type":37,"value":295},"    '\u002Fapi\u002F**'",{"type":32,"tag":190,"props":297,"children":298},{"style":214},[299],{"type":37,"value":300},": { cors: ",{"type":32,"tag":190,"props":302,"children":303},{"style":244},[304],{"type":37,"value":247},{"type":32,"tag":190,"props":306,"children":307},{"style":214},[308],{"type":37,"value":309},", cache: ",{"type":32,"tag":190,"props":311,"children":312},{"style":244},[313],{"type":37,"value":314},"false",{"type":32,"tag":190,"props":316,"children":317},{"style":214},[318],{"type":37,"value":252},{"type":32,"tag":190,"props":320,"children":321},{"style":255},[322],{"type":37,"value":323},"\u002F\u002F Endpoint API non cachati\n",{"type":32,"tag":190,"props":325,"children":327},{"class":192,"line":326},6,[328,333,338,342,346],{"type":32,"tag":190,"props":329,"children":330},{"style":233},[331],{"type":37,"value":332},"    '\u002Fcategory\u002F:slug'",{"type":32,"tag":190,"props":334,"children":335},{"style":214},[336],{"type":37,"value":337},": { isr: ",{"type":32,"tag":190,"props":339,"children":340},{"style":244},[341],{"type":37,"value":247},{"type":32,"tag":190,"props":343,"children":344},{"style":214},[345],{"type":37,"value":252},{"type":32,"tag":190,"props":347,"children":348},{"style":255},[349],{"type":37,"value":350},"\u002F\u002F ISR attivo\n",{"type":32,"tag":190,"props":352,"children":354},{"class":192,"line":353},7,[355],{"type":32,"tag":190,"props":356,"children":357},{"style":214},[358],{"type":37,"value":359},"  },\n",{"type":32,"tag":190,"props":361,"children":362},{"class":192,"line":26},[363],{"type":32,"tag":190,"props":364,"children":365},{"style":214},[366],{"type":37,"value":367},"  nitro: {\n",{"type":32,"tag":190,"props":369,"children":371},{"class":192,"line":370},9,[372],{"type":32,"tag":190,"props":373,"children":374},{"style":214},[375],{"type":37,"value":376},"    prerender: {\n",{"type":32,"tag":190,"props":378,"children":380},{"class":192,"line":379},10,[381,386,390,394],{"type":32,"tag":190,"props":382,"children":383},{"style":214},[384],{"type":37,"value":385},"      crawlLinks: ",{"type":32,"tag":190,"props":387,"children":388},{"style":244},[389],{"type":37,"value":247},{"type":32,"tag":190,"props":391,"children":392},{"style":214},[393],{"type":37,"value":143},{"type":32,"tag":190,"props":395,"children":396},{"style":255},[397],{"type":37,"value":398},"\u002F\u002F Segui i link dalla sitemap\n",{"type":32,"tag":190,"props":400,"children":402},{"class":192,"line":401},11,[403,408,413,418],{"type":32,"tag":190,"props":404,"children":405},{"style":214},[406],{"type":37,"value":407},"      routes: [",{"type":32,"tag":190,"props":409,"children":410},{"style":233},[411],{"type":37,"value":412},"'\u002Fsitemap.xml'",{"type":32,"tag":190,"props":414,"children":415},{"style":214},[416],{"type":37,"value":417},"], ",{"type":32,"tag":190,"props":419,"children":420},{"style":255},[421],{"type":37,"value":422},"\u002F\u002F Definizione manuale delle route\n",{"type":32,"tag":190,"props":424,"children":426},{"class":192,"line":425},12,[427,432,437,441,446,450],{"type":32,"tag":190,"props":428,"children":429},{"style":214},[430],{"type":37,"value":431},"      ignore: [",{"type":32,"tag":190,"props":433,"children":434},{"style":233},[435],{"type":37,"value":436},"'\u002Fadmin'",{"type":32,"tag":190,"props":438,"children":439},{"style":214},[440],{"type":37,"value":143},{"type":32,"tag":190,"props":442,"children":443},{"style":233},[444],{"type":37,"value":445},"'\u002Fcheckout\u002F**'",{"type":32,"tag":190,"props":447,"children":448},{"style":214},[449],{"type":37,"value":417},{"type":32,"tag":190,"props":451,"children":452},{"style":255},[453],{"type":37,"value":454},"\u002F\u002F Escludere dal prerender\n",{"type":32,"tag":190,"props":456,"children":458},{"class":192,"line":457},13,[459],{"type":32,"tag":190,"props":460,"children":461},{"style":214},[462],{"type":37,"value":463},"    },\n",{"type":32,"tag":190,"props":465,"children":467},{"class":192,"line":466},14,[468],{"type":32,"tag":190,"props":469,"children":470},{"style":214},[471],{"type":37,"value":359},{"type":32,"tag":190,"props":473,"children":475},{"class":192,"line":474},15,[476],{"type":32,"tag":190,"props":477,"children":478},{"style":214},[479],{"type":37,"value":480},"})\n",{"type":32,"tag":33,"props":482,"children":483},{},[484,486,492,494,500],{"type":37,"value":485},"Con ",{"type":32,"tag":40,"props":487,"children":489},{"className":488},[],[490],{"type":37,"value":491},"crawlLinks: true",{"type":37,"value":493},", il sistema scopre automaticamente i link presenti nella sitemap. Per un sito di 500 pagine, non è necessario mantenere un elenco manuale di route. Però, su un sito di 50.000 pagine, il crawling di tutti i link richiede 10 minuti di build — in questo caso usa un array ",{"type":32,"tag":40,"props":495,"children":497},{"className":496},[],[498],{"type":37,"value":499},"routes",{"type":37,"value":501}," manuale + una strategia incrementale.",{"type":32,"tag":503,"props":504,"children":506},"h3",{"id":505},"evitare-la-duplicazione-di-dati-con-payload-extraction",[507],{"type":37,"value":508},"Evitare la Duplicazione di Dati con Payload Extraction",{"type":32,"tag":33,"props":510,"children":511},{},[512,514,520],{"type":37,"value":513},"Nuxt 3 genera un file ",{"type":32,"tag":40,"props":515,"children":517},{"className":516},[],[518],{"type":37,"value":519},"_payload.json",{"type":37,"value":521}," per ogni route prerendering. Questo file serializza i dati recuperati lato server. Durante la navigazione SPA, viene utilizzato questo JSON senza fare nuove chiamate API.",{"type":32,"tag":180,"props":523,"children":525},{"className":182,"code":524,"language":184,"meta":16,"style":16},"\u002F\u002F pages\u002Fproduct\u002F[id].vue\n\u003Cscript setup>\nconst route = useRoute()\nconst { data: product } = await useFetch(`\u002Fapi\u002Fproducts\u002F${route.params.id}`)\n\u003C\u002Fscript>\n",[526],{"type":32,"tag":40,"props":527,"children":528},{"__ignoreMap":16},[529,537,555,583,675],{"type":32,"tag":190,"props":530,"children":531},{"class":192,"line":193},[532],{"type":32,"tag":190,"props":533,"children":534},{"style":255},[535],{"type":37,"value":536},"\u002F\u002F pages\u002Fproduct\u002F[id].vue\n",{"type":32,"tag":190,"props":538,"children":539},{"class":192,"line":220},[540,545,550],{"type":32,"tag":190,"props":541,"children":542},{"style":197},[543],{"type":37,"value":544},"\u003C",{"type":32,"tag":190,"props":546,"children":547},{"style":214},[548],{"type":37,"value":549},"script setup",{"type":32,"tag":190,"props":551,"children":552},{"style":197},[553],{"type":37,"value":554},">\n",{"type":32,"tag":190,"props":556,"children":557},{"class":192,"line":229},[558,563,568,573,578],{"type":32,"tag":190,"props":559,"children":560},{"style":197},[561],{"type":37,"value":562},"const",{"type":32,"tag":190,"props":564,"children":565},{"style":244},[566],{"type":37,"value":567}," route",{"type":32,"tag":190,"props":569,"children":570},{"style":197},[571],{"type":37,"value":572}," =",{"type":32,"tag":190,"props":574,"children":575},{"style":208},[576],{"type":37,"value":577}," useRoute",{"type":32,"tag":190,"props":579,"children":580},{"style":214},[581],{"type":37,"value":582},"()\n",{"type":32,"tag":190,"props":584,"children":585},{"class":192,"line":261},[586,590,595,601,606,611,616,621,626,631,636,641,646,651,656,660,665,670],{"type":32,"tag":190,"props":587,"children":588},{"style":197},[589],{"type":37,"value":562},{"type":32,"tag":190,"props":591,"children":592},{"style":214},[593],{"type":37,"value":594}," { ",{"type":32,"tag":190,"props":596,"children":598},{"style":597},"--shiki-default:#FFAB70",[599],{"type":37,"value":600},"data",{"type":32,"tag":190,"props":602,"children":603},{"style":214},[604],{"type":37,"value":605},": ",{"type":32,"tag":190,"props":607,"children":608},{"style":244},[609],{"type":37,"value":610},"product",{"type":32,"tag":190,"props":612,"children":613},{"style":214},[614],{"type":37,"value":615}," } ",{"type":32,"tag":190,"props":617,"children":618},{"style":197},[619],{"type":37,"value":620},"=",{"type":32,"tag":190,"props":622,"children":623},{"style":197},[624],{"type":37,"value":625}," await",{"type":32,"tag":190,"props":627,"children":628},{"style":208},[629],{"type":37,"value":630}," useFetch",{"type":32,"tag":190,"props":632,"children":633},{"style":214},[634],{"type":37,"value":635},"(",{"type":32,"tag":190,"props":637,"children":638},{"style":233},[639],{"type":37,"value":640},"`\u002Fapi\u002Fproducts\u002F${",{"type":32,"tag":190,"props":642,"children":643},{"style":214},[644],{"type":37,"value":645},"route",{"type":32,"tag":190,"props":647,"children":648},{"style":233},[649],{"type":37,"value":650},".",{"type":32,"tag":190,"props":652,"children":653},{"style":214},[654],{"type":37,"value":655},"params",{"type":32,"tag":190,"props":657,"children":658},{"style":233},[659],{"type":37,"value":650},{"type":32,"tag":190,"props":661,"children":662},{"style":214},[663],{"type":37,"value":664},"id",{"type":32,"tag":190,"props":666,"children":667},{"style":233},[668],{"type":37,"value":669},"}`",{"type":32,"tag":190,"props":671,"children":672},{"style":214},[673],{"type":37,"value":674},")\n",{"type":32,"tag":190,"props":676,"children":677},{"class":192,"line":289},[678,683,688],{"type":32,"tag":190,"props":679,"children":680},{"style":197},[681],{"type":37,"value":682},"\u003C\u002F",{"type":32,"tag":190,"props":684,"children":685},{"style":214},[686],{"type":37,"value":687},"script",{"type":32,"tag":190,"props":689,"children":690},{"style":197},[691],{"type":37,"value":554},{"type":32,"tag":33,"props":693,"children":694},{},[695,697,703,705,710,712,717],{"type":37,"value":696},"Durante il prerendering, ",{"type":32,"tag":40,"props":698,"children":700},{"className":699},[],[701],{"type":37,"value":702},"\u002Fapi\u002Fproducts\u002F123",{"type":37,"value":704}," viene chiamato e la risposta viene incorporata nel ",{"type":32,"tag":40,"props":706,"children":708},{"className":707},[],[709],{"type":37,"value":519},{"type":37,"value":711},". Durante la navigazione lato client, lo stesso dato viene riutilizzato. Trade-off: dimensione del payload. Su un sito con 10.000 prodotti, se ogni ",{"type":32,"tag":40,"props":713,"children":715},{"className":714},[],[716],{"type":37,"value":519},{"type":37,"value":718}," è 5KB, genererai 50MB di asset statici. Includi questo calcolo nei costi di banda CDN.",{"type":32,"tag":33,"props":720,"children":721},{},[722,724,730],{"type":37,"value":723},"Per ottimizzare, comprimi il payload in ",{"type":32,"tag":40,"props":725,"children":727},{"className":726},[],[728],{"type":37,"value":729},"nitro.output.publicDir",{"type":37,"value":731}," con gzip\u002Fbrotli. Nginx\u002FCloudflare lo fanno automaticamente, ma con la compressione a livello di build riduci 5KB → 1.2KB.",{"type":32,"tag":56,"props":733,"children":735},{"id":734},"performance-della-build-parallelizzazione-e-strategie-di-cache",[736],{"type":37,"value":737},"Performance della Build: Parallelizzazione e Strategie di Cache",{"type":32,"tag":33,"props":739,"children":740},{},[741],{"type":37,"value":742},"La pipeline di build di Nuxt 3 ha 3 fasi: compilazione webpack\u002Fvite → prerendering nitro → ottimizzazione asset. Il prerendering di 10.000 route diventa il collo di bottiglia.",{"type":32,"tag":33,"props":744,"children":745},{},[746,752,754,760],{"type":32,"tag":747,"props":748,"children":749},"strong",{},[750],{"type":37,"value":751},"Parallelizzazione:",{"type":37,"value":753}," Il parametro ",{"type":32,"tag":40,"props":755,"children":757},{"className":756},[],[758],{"type":37,"value":759},"prerender.concurrency",{"type":37,"value":761}," di Nitro controlla quante route vengono renderizzate contemporaneamente. Default è 10. Se la RAM è sufficiente, aumenta a 50:",{"type":32,"tag":180,"props":763,"children":765},{"className":182,"code":764,"language":184,"meta":16,"style":16},"nitro: {\n  prerender: {\n    concurrency: 50,\n  },\n}\n",[766],{"type":32,"tag":40,"props":767,"children":768},{"__ignoreMap":16},[769,782,794,816,823],{"type":32,"tag":190,"props":770,"children":771},{"class":192,"line":193},[772,777],{"type":32,"tag":190,"props":773,"children":774},{"style":208},[775],{"type":37,"value":776},"nitro",{"type":32,"tag":190,"props":778,"children":779},{"style":214},[780],{"type":37,"value":781},": {\n",{"type":32,"tag":190,"props":783,"children":784},{"class":192,"line":220},[785,790],{"type":32,"tag":190,"props":786,"children":787},{"style":208},[788],{"type":37,"value":789},"  prerender",{"type":32,"tag":190,"props":791,"children":792},{"style":214},[793],{"type":37,"value":781},{"type":32,"tag":190,"props":795,"children":796},{"class":192,"line":229},[797,802,806,811],{"type":32,"tag":190,"props":798,"children":799},{"style":208},[800],{"type":37,"value":801},"    concurrency",{"type":32,"tag":190,"props":803,"children":804},{"style":214},[805],{"type":37,"value":605},{"type":32,"tag":190,"props":807,"children":808},{"style":244},[809],{"type":37,"value":810},"50",{"type":32,"tag":190,"props":812,"children":813},{"style":214},[814],{"type":37,"value":815},",\n",{"type":32,"tag":190,"props":817,"children":818},{"class":192,"line":261},[819],{"type":32,"tag":190,"props":820,"children":821},{"style":214},[822],{"type":37,"value":359},{"type":32,"tag":190,"props":824,"children":825},{"class":192,"line":289},[826],{"type":32,"tag":190,"props":827,"children":828},{"style":214},[829],{"type":37,"value":830},"}\n",{"type":32,"tag":33,"props":832,"children":833},{},[834],{"type":37,"value":835},"Con CPU a 4 core e 16GB RAM, cambiare da 10 a 50 ha ridotto il tempo di build da 40s a 12s. Oltre i 50, gli effetti di diminishing returns compaiono: l'overhead di context switch della CPU aumenta.",{"type":32,"tag":33,"props":837,"children":838},{},[839,844,846,852],{"type":32,"tag":747,"props":840,"children":841},{},[842],{"type":37,"value":843},"Cache incrementale della build:",{"type":37,"value":845}," Netlify e Vercel mantengono la cache ",{"type":32,"tag":40,"props":847,"children":849},{"className":848},[],[850],{"type":37,"value":851},".nuxt\u002Fprerender",{"type":37,"value":853},". Le route che non sono cambiate non vengono ricostruite. Con l'invalidazione della cache basata su hash Git, ogni deploy rigenera solo le route modificate.",{"type":32,"tag":180,"props":855,"children":857},{"className":182,"code":856,"language":184,"meta":16,"style":16},"\u002F\u002F netlify.toml\n[build]\n  command = \"nuxt build\"\n  publish = \".output\u002Fpublic\"\n\n[[plugins]]\n  package = \"@netlify\u002Fplugin-nextjs\"\n  \n[build.environment]\n  NUXT_TELEMETRY_DISABLED = \"1\"\n",[858],{"type":32,"tag":40,"props":859,"children":860},{"__ignoreMap":16},[861,869,877,894,911,920,928,945,953,961],{"type":32,"tag":190,"props":862,"children":863},{"class":192,"line":193},[864],{"type":32,"tag":190,"props":865,"children":866},{"style":255},[867],{"type":37,"value":868},"\u002F\u002F netlify.toml\n",{"type":32,"tag":190,"props":870,"children":871},{"class":192,"line":220},[872],{"type":32,"tag":190,"props":873,"children":874},{"style":214},[875],{"type":37,"value":876},"[build]\n",{"type":32,"tag":190,"props":878,"children":879},{"class":192,"line":229},[880,885,889],{"type":32,"tag":190,"props":881,"children":882},{"style":214},[883],{"type":37,"value":884},"  command ",{"type":32,"tag":190,"props":886,"children":887},{"style":197},[888],{"type":37,"value":620},{"type":32,"tag":190,"props":890,"children":891},{"style":233},[892],{"type":37,"value":893}," \"nuxt build\"\n",{"type":32,"tag":190,"props":895,"children":896},{"class":192,"line":261},[897,902,906],{"type":32,"tag":190,"props":898,"children":899},{"style":214},[900],{"type":37,"value":901},"  publish ",{"type":32,"tag":190,"props":903,"children":904},{"style":197},[905],{"type":37,"value":620},{"type":32,"tag":190,"props":907,"children":908},{"style":233},[909],{"type":37,"value":910}," \".output\u002Fpublic\"\n",{"type":32,"tag":190,"props":912,"children":913},{"class":192,"line":289},[914],{"type":32,"tag":190,"props":915,"children":917},{"emptyLinePlaceholder":916},true,[918],{"type":37,"value":919},"\n",{"type":32,"tag":190,"props":921,"children":922},{"class":192,"line":326},[923],{"type":32,"tag":190,"props":924,"children":925},{"style":214},[926],{"type":37,"value":927},"[[plugins]]\n",{"type":32,"tag":190,"props":929,"children":930},{"class":192,"line":353},[931,936,940],{"type":32,"tag":190,"props":932,"children":933},{"style":197},[934],{"type":37,"value":935},"  package",{"type":32,"tag":190,"props":937,"children":938},{"style":197},[939],{"type":37,"value":572},{"type":32,"tag":190,"props":941,"children":942},{"style":233},[943],{"type":37,"value":944}," \"@netlify\u002Fplugin-nextjs\"\n",{"type":32,"tag":190,"props":946,"children":947},{"class":192,"line":26},[948],{"type":32,"tag":190,"props":949,"children":950},{"style":214},[951],{"type":37,"value":952},"  \n",{"type":32,"tag":190,"props":954,"children":955},{"class":192,"line":370},[956],{"type":32,"tag":190,"props":957,"children":958},{"style":214},[959],{"type":37,"value":960},"[build.environment]\n",{"type":32,"tag":190,"props":962,"children":963},{"class":192,"line":379},[964,969,973],{"type":32,"tag":190,"props":965,"children":966},{"style":244},[967],{"type":37,"value":968},"  NUXT_TELEMETRY_DISABLED",{"type":32,"tag":190,"props":970,"children":971},{"style":197},[972],{"type":37,"value":572},{"type":32,"tag":190,"props":974,"children":975},{"style":233},[976],{"type":37,"value":977}," \"1\"\n",{"type":32,"tag":33,"props":979,"children":980},{},[981],{"type":37,"value":982},"Con un cache hit rate del 70%, un sito di 5000 route viene compilato in 5s invece di 15s.",{"type":32,"tag":503,"props":984,"children":986},{"id":985},"trade-off-bundle-size-vs-prerendering",[987],{"type":37,"value":988},"Trade-off Bundle Size vs Prerendering",{"type":32,"tag":33,"props":990,"children":991},{},[992,994,1000],{"type":37,"value":993},"Gli HTML generati dal prerendering contengono il bundle JS per l'hydration. Con ",{"type":32,"tag":40,"props":995,"children":997},{"className":996},[],[998],{"type":37,"value":999},"experimental.payloadExtraction",{"type":37,"value":1001}," in Nuxt 3, separi il payload dall'HTML. Questo ottimizza il chunk splitting.",{"type":32,"tag":180,"props":1003,"children":1005},{"className":182,"code":1004,"language":184,"meta":16,"style":16},"experimental: {\n  payloadExtraction: true,\n  inlineSSRStyles: false, \u002F\u002F CSS critico non è inline\n}\n",[1006],{"type":32,"tag":40,"props":1007,"children":1008},{"__ignoreMap":16},[1009,1021,1041,1066],{"type":32,"tag":190,"props":1010,"children":1011},{"class":192,"line":193},[1012,1017],{"type":32,"tag":190,"props":1013,"children":1014},{"style":208},[1015],{"type":37,"value":1016},"experimental",{"type":32,"tag":190,"props":1018,"children":1019},{"style":214},[1020],{"type":37,"value":781},{"type":32,"tag":190,"props":1022,"children":1023},{"class":192,"line":220},[1024,1029,1033,1037],{"type":32,"tag":190,"props":1025,"children":1026},{"style":208},[1027],{"type":37,"value":1028},"  payloadExtraction",{"type":32,"tag":190,"props":1030,"children":1031},{"style":214},[1032],{"type":37,"value":605},{"type":32,"tag":190,"props":1034,"children":1035},{"style":244},[1036],{"type":37,"value":247},{"type":32,"tag":190,"props":1038,"children":1039},{"style":214},[1040],{"type":37,"value":815},{"type":32,"tag":190,"props":1042,"children":1043},{"class":192,"line":229},[1044,1049,1053,1057,1061],{"type":32,"tag":190,"props":1045,"children":1046},{"style":208},[1047],{"type":37,"value":1048},"  inlineSSRStyles",{"type":32,"tag":190,"props":1050,"children":1051},{"style":214},[1052],{"type":37,"value":605},{"type":32,"tag":190,"props":1054,"children":1055},{"style":244},[1056],{"type":37,"value":314},{"type":32,"tag":190,"props":1058,"children":1059},{"style":214},[1060],{"type":37,"value":143},{"type":32,"tag":190,"props":1062,"children":1063},{"style":255},[1064],{"type":37,"value":1065},"\u002F\u002F CSS critico non è inline\n",{"type":32,"tag":190,"props":1067,"children":1068},{"class":192,"line":261},[1069],{"type":32,"tag":190,"props":1070,"children":1071},{"style":214},[1072],{"type":37,"value":830},{"type":32,"tag":33,"props":1074,"children":1075},{},[1076,1077,1083],{"type":37,"value":485},{"type":32,"tag":40,"props":1078,"children":1080},{"className":1079},[],[1081],{"type":37,"value":1082},"payloadExtraction: true",{"type":37,"value":1084},", un HTML di 250KB diventa 180KB HTML + 70KB JSON separati. Durante la navigazione lato client, il JSON viene recuperato, senza riparsare l'HTML. LCP scende da 2.1s a 1.8s (90° percentile, mobile 3G).",{"type":32,"tag":33,"props":1086,"children":1087},{},[1088],{"type":37,"value":1089},"Trade-off: una richiesta HTTP aggiuntiva. Con HTTP\u002F2 multiplexing, non è un problema; con HTTP\u002F1.1, la latenza aumenta. Su CDN moderni come Cloudflare o Fastly, HTTP\u002F2 è standard, quindi questa strategia genera guadagni.",{"type":32,"tag":56,"props":1091,"children":1093},{"id":1092},"integrazione-headless-commerce-shopify-nuxt-ssg",[1094],{"type":37,"value":1095},"Integrazione Headless Commerce: Shopify + Nuxt SSG",{"type":32,"tag":33,"props":1097,"children":1098},{},[1099],{"type":37,"value":1100},"Prerendering le pagine dei prodotti in un e-commerce crea complessità nella sincronizzazione dell'inventario. Con l'API GraphQL Storefront di Shopify, implementi una revalidazione guidata da webhook.",{"type":32,"tag":180,"props":1102,"children":1104},{"className":182,"code":1103,"language":184,"meta":16,"style":16},"\u002F\u002F server\u002Fapi\u002Frevalidate.post.ts\nexport default defineEventHandler(async (event) => {\n  const body = await readBody(event)\n  \n  if (body.topic === 'products\u002Fupdate') {\n    const productId = body.id\n    await nitroApp.hooks.callHook('prerender:routes', [\n      `\u002Fproducts\u002F${productId}`\n    ])\n  }\n  \n  return { status: 'revalidated' }\n})\n",[1105],{"type":32,"tag":40,"props":1106,"children":1107},{"__ignoreMap":16},[1108,1116,1166,1197,1204,1232,1254,1286,1304,1312,1320,1327,1350],{"type":32,"tag":190,"props":1109,"children":1110},{"class":192,"line":193},[1111],{"type":32,"tag":190,"props":1112,"children":1113},{"style":255},[1114],{"type":37,"value":1115},"\u002F\u002F server\u002Fapi\u002Frevalidate.post.ts\n",{"type":32,"tag":190,"props":1117,"children":1118},{"class":192,"line":220},[1119,1123,1127,1132,1136,1141,1146,1151,1156,1161],{"type":32,"tag":190,"props":1120,"children":1121},{"style":197},[1122],{"type":37,"value":200},{"type":32,"tag":190,"props":1124,"children":1125},{"style":197},[1126],{"type":37,"value":205},{"type":32,"tag":190,"props":1128,"children":1129},{"style":208},[1130],{"type":37,"value":1131}," defineEventHandler",{"type":32,"tag":190,"props":1133,"children":1134},{"style":214},[1135],{"type":37,"value":635},{"type":32,"tag":190,"props":1137,"children":1138},{"style":197},[1139],{"type":37,"value":1140},"async",{"type":32,"tag":190,"props":1142,"children":1143},{"style":214},[1144],{"type":37,"value":1145}," (",{"type":32,"tag":190,"props":1147,"children":1148},{"style":597},[1149],{"type":37,"value":1150},"event",{"type":32,"tag":190,"props":1152,"children":1153},{"style":214},[1154],{"type":37,"value":1155},") ",{"type":32,"tag":190,"props":1157,"children":1158},{"style":197},[1159],{"type":37,"value":1160},"=>",{"type":32,"tag":190,"props":1162,"children":1163},{"style":214},[1164],{"type":37,"value":1165}," {\n",{"type":32,"tag":190,"props":1167,"children":1168},{"class":192,"line":229},[1169,1174,1179,1183,1187,1192],{"type":32,"tag":190,"props":1170,"children":1171},{"style":197},[1172],{"type":37,"value":1173},"  const",{"type":32,"tag":190,"props":1175,"children":1176},{"style":244},[1177],{"type":37,"value":1178}," body",{"type":32,"tag":190,"props":1180,"children":1181},{"style":197},[1182],{"type":37,"value":572},{"type":32,"tag":190,"props":1184,"children":1185},{"style":197},[1186],{"type":37,"value":625},{"type":32,"tag":190,"props":1188,"children":1189},{"style":208},[1190],{"type":37,"value":1191}," readBody",{"type":32,"tag":190,"props":1193,"children":1194},{"style":214},[1195],{"type":37,"value":1196},"(event)\n",{"type":32,"tag":190,"props":1198,"children":1199},{"class":192,"line":261},[1200],{"type":32,"tag":190,"props":1201,"children":1202},{"style":214},[1203],{"type":37,"value":952},{"type":32,"tag":190,"props":1205,"children":1206},{"class":192,"line":289},[1207,1212,1217,1222,1227],{"type":32,"tag":190,"props":1208,"children":1209},{"style":197},[1210],{"type":37,"value":1211},"  if",{"type":32,"tag":190,"props":1213,"children":1214},{"style":214},[1215],{"type":37,"value":1216}," (body.topic ",{"type":32,"tag":190,"props":1218,"children":1219},{"style":197},[1220],{"type":37,"value":1221},"===",{"type":32,"tag":190,"props":1223,"children":1224},{"style":233},[1225],{"type":37,"value":1226}," 'products\u002Fupdate'",{"type":32,"tag":190,"props":1228,"children":1229},{"style":214},[1230],{"type":37,"value":1231},") {\n",{"type":32,"tag":190,"props":1233,"children":1234},{"class":192,"line":326},[1235,1240,1245,1249],{"type":32,"tag":190,"props":1236,"children":1237},{"style":197},[1238],{"type":37,"value":1239},"    const",{"type":32,"tag":190,"props":1241,"children":1242},{"style":244},[1243],{"type":37,"value":1244}," productId",{"type":32,"tag":190,"props":1246,"children":1247},{"style":197},[1248],{"type":37,"value":572},{"type":32,"tag":190,"props":1250,"children":1251},{"style":214},[1252],{"type":37,"value":1253}," body.id\n",{"type":32,"tag":190,"props":1255,"children":1256},{"class":192,"line":353},[1257,1262,1267,1272,1276,1281],{"type":32,"tag":190,"props":1258,"children":1259},{"style":197},[1260],{"type":37,"value":1261},"    await",{"type":32,"tag":190,"props":1263,"children":1264},{"style":214},[1265],{"type":37,"value":1266}," nitroApp.hooks.",{"type":32,"tag":190,"props":1268,"children":1269},{"style":208},[1270],{"type":37,"value":1271},"callHook",{"type":32,"tag":190,"props":1273,"children":1274},{"style":214},[1275],{"type":37,"value":635},{"type":32,"tag":190,"props":1277,"children":1278},{"style":233},[1279],{"type":37,"value":1280},"'prerender:routes'",{"type":32,"tag":190,"props":1282,"children":1283},{"style":214},[1284],{"type":37,"value":1285},", [\n",{"type":32,"tag":190,"props":1287,"children":1288},{"class":192,"line":26},[1289,1294,1299],{"type":32,"tag":190,"props":1290,"children":1291},{"style":233},[1292],{"type":37,"value":1293},"      `\u002Fproducts\u002F${",{"type":32,"tag":190,"props":1295,"children":1296},{"style":214},[1297],{"type":37,"value":1298},"productId",{"type":32,"tag":190,"props":1300,"children":1301},{"style":233},[1302],{"type":37,"value":1303},"}`\n",{"type":32,"tag":190,"props":1305,"children":1306},{"class":192,"line":370},[1307],{"type":32,"tag":190,"props":1308,"children":1309},{"style":214},[1310],{"type":37,"value":1311},"    ])\n",{"type":32,"tag":190,"props":1313,"children":1314},{"class":192,"line":379},[1315],{"type":32,"tag":190,"props":1316,"children":1317},{"style":214},[1318],{"type":37,"value":1319},"  }\n",{"type":32,"tag":190,"props":1321,"children":1322},{"class":192,"line":401},[1323],{"type":32,"tag":190,"props":1324,"children":1325},{"style":214},[1326],{"type":37,"value":952},{"type":32,"tag":190,"props":1328,"children":1329},{"class":192,"line":425},[1330,1335,1340,1345],{"type":32,"tag":190,"props":1331,"children":1332},{"style":197},[1333],{"type":37,"value":1334},"  return",{"type":32,"tag":190,"props":1336,"children":1337},{"style":214},[1338],{"type":37,"value":1339}," { status: ",{"type":32,"tag":190,"props":1341,"children":1342},{"style":233},[1343],{"type":37,"value":1344},"'revalidated'",{"type":32,"tag":190,"props":1346,"children":1347},{"style":214},[1348],{"type":37,"value":1349}," }\n",{"type":32,"tag":190,"props":1351,"children":1352},{"class":192,"line":457},[1353],{"type":32,"tag":190,"props":1354,"children":1355},{"style":214},[1356],{"type":37,"value":480},{"type":32,"tag":33,"props":1358,"children":1359},{},[1360,1362,1368],{"type":37,"value":1361},"Sottoscrivi i webhook dall'Admin API di Shopify → quando un prodotto si aggiorna, ",{"type":32,"tag":40,"props":1363,"children":1365},{"className":1364},[],[1366],{"type":37,"value":1367},"\u002Fapi\u002Frevalidate",{"type":37,"value":1369}," viene attivato → solo quella route viene rigenerata. Invece di una rebuild dell'intero catalogo, una singola rigenerazione della route richiede 200ms.",{"type":32,"tag":33,"props":1371,"children":1372},{},[1373,1375,1384],{"type":37,"value":1374},"In un'architettura ",{"type":32,"tag":1376,"props":1377,"children":1381},"a",{"href":1378,"rel":1379},"https:\u002F\u002Fwww.roibase.com.tr\u002Fit\u002Fheadless",[1380],"nofollow",[1382],{"type":37,"value":1383},"Headless Commerce",{"type":37,"value":1385},", questo pattern è critico. Su piattaforme monolitiche, la rebuild completa è obbligatoria; con headless, esegui l'invalidazione granulare. Con 50.000 SKU e 500 aggiornamenti di prodotti al giorno, una rebuild completa richiederebbe 6 ore, mentre la revalidazione incrementale impiega 2 minuti.",{"type":32,"tag":56,"props":1387,"children":1389},{"id":1388},"isr-edge-caching-strategia-ibrida-con-cloudflare-workers",[1390],{"type":37,"value":1391},"ISR + Edge Caching: Strategia Ibrida con Cloudflare Workers",{"type":32,"tag":33,"props":1393,"children":1394},{},[1395],{"type":37,"value":1396},"Combinando Nuxt 3 e Cloudflare Pages, implementi ISR con Workers KV. Una route viene renderizzata alla prima richiesta, scritta su KV, e le richieste successive servite da KV.",{"type":32,"tag":180,"props":1398,"children":1400},{"className":182,"code":1399,"language":184,"meta":16,"style":16},"\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  nitro: {\n    preset: 'cloudflare-pages',\n  },\n  routeRules: {\n    '\u002Fblog\u002F**': { isr: 3600 }, \u002F\u002F TTL di 1 ora\n  },\n})\n",[1401],{"type":32,"tag":40,"props":1402,"children":1403},{"__ignoreMap":16},[1404,1412,1431,1438,1455,1462,1469,1494,1501],{"type":32,"tag":190,"props":1405,"children":1406},{"class":192,"line":193},[1407],{"type":32,"tag":190,"props":1408,"children":1409},{"style":255},[1410],{"type":37,"value":1411},"\u002F\u002F nuxt.config.ts\n",{"type":32,"tag":190,"props":1413,"children":1414},{"class":192,"line":220},[1415,1419,1423,1427],{"type":32,"tag":190,"props":1416,"children":1417},{"style":197},[1418],{"type":37,"value":200},{"type":32,"tag":190,"props":1420,"children":1421},{"style":197},[1422],{"type":37,"value":205},{"type":32,"tag":190,"props":1424,"children":1425},{"style":208},[1426],{"type":37,"value":211},{"type":32,"tag":190,"props":1428,"children":1429},{"style":214},[1430],{"type":37,"value":217},{"type":32,"tag":190,"props":1432,"children":1433},{"class":192,"line":229},[1434],{"type":32,"tag":190,"props":1435,"children":1436},{"style":214},[1437],{"type":37,"value":367},{"type":32,"tag":190,"props":1439,"children":1440},{"class":192,"line":261},[1441,1446,1451],{"type":32,"tag":190,"props":1442,"children":1443},{"style":214},[1444],{"type":37,"value":1445},"    preset: ",{"type":32,"tag":190,"props":1447,"children":1448},{"style":233},[1449],{"type":37,"value":1450},"'cloudflare-pages'",{"type":32,"tag":190,"props":1452,"children":1453},{"style":214},[1454],{"type":37,"value":815},{"type":32,"tag":190,"props":1456,"children":1457},{"class":192,"line":289},[1458],{"type":32,"tag":190,"props":1459,"children":1460},{"style":214},[1461],{"type":37,"value":359},{"type":32,"tag":190,"props":1463,"children":1464},{"class":192,"line":326},[1465],{"type":32,"tag":190,"props":1466,"children":1467},{"style":214},[1468],{"type":37,"value":226},{"type":32,"tag":190,"props":1470,"children":1471},{"class":192,"line":353},[1472,1477,1481,1485,1489],{"type":32,"tag":190,"props":1473,"children":1474},{"style":233},[1475],{"type":37,"value":1476},"    '\u002Fblog\u002F**'",{"type":32,"tag":190,"props":1478,"children":1479},{"style":214},[1480],{"type":37,"value":337},{"type":32,"tag":190,"props":1482,"children":1483},{"style":244},[1484],{"type":37,"value":277},{"type":32,"tag":190,"props":1486,"children":1487},{"style":214},[1488],{"type":37,"value":252},{"type":32,"tag":190,"props":1490,"children":1491},{"style":255},[1492],{"type":37,"value":1493},"\u002F\u002F TTL di 1 ora\n",{"type":32,"tag":190,"props":1495,"children":1496},{"class":192,"line":26},[1497],{"type":32,"tag":190,"props":1498,"children":1499},{"style":214},[1500],{"type":37,"value":359},{"type":32,"tag":190,"props":1502,"children":1503},{"class":192,"line":370},[1504],{"type":32,"tag":190,"props":1505,"children":1506},{"style":214},[1507],{"type":37,"value":480},{"type":32,"tag":33,"props":1509,"children":1510},{},[1511],{"type":37,"value":1512},"La latenza di Cloudflare KV è ~50ms (edge globale). La prima richiesta richiede 800ms rendering + 50ms KV write; le richieste successive impiegano 50ms. Con un cache hit rate del 95%, il tempo di risposta medio è 95×50ms + 5×850ms = 90ms. Con SSR puro, sarebbe rimasto fisso a 800ms.",{"type":32,"tag":33,"props":1514,"children":1515},{},[1516],{"type":37,"value":1517},"Trade-off: costi di KV write. Con 1M richieste\u002Fmese, il costo è ~$0.50 (prezzi Cloudflare 2026). L'hosting statico costa $0, quindi ISR aggiunge costi, ma il guadagno in UX lo giustifica.",{"type":32,"tag":1519,"props":1520,"children":1521},"hr",{},[],{"type":32,"tag":33,"props":1523,"children":1524},{},[1525],{"type":37,"value":1526},"La strategia SSG di Nuxt 3 richiede di bilanciare tre fattori: freschezza dei dati, tempo di build e prestazioni runtime. Homepage prerendering, long tail con ISR, percorsi critici lato server — questo mix va ricalcolato per ogni progetto. Senza misurazione, affermare che \"full static è più veloce\" è errato; con 10.000 route, il tempo di build compromette l'UX. Con rigenerazione incrementale + edge cache, guadagni sia in tempo di build che in tempo di risposta, accettando la complessità orchestrale.",{"type":32,"tag":1528,"props":1529,"children":1530},"style",{},[1531],{"type":37,"value":1532},"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":229,"depth":229,"links":1534},[1535,1536,1539,1542,1543],{"id":58,"depth":220,"text":61},{"id":127,"depth":220,"text":130,"children":1537},[1538],{"id":505,"depth":229,"text":508},{"id":734,"depth":220,"text":737,"children":1540},[1541],{"id":985,"depth":229,"text":988},{"id":1092,"depth":220,"text":1095},{"id":1388,"depth":220,"text":1391},"markdown","content:it:tech:strategie-prerender-nuxt-3.md","content","it\u002Ftech\u002Fstrategie-prerender-nuxt-3.md","it\u002Ftech\u002Fstrategie-prerender-nuxt-3","md",1780898618177]