[{"data":1,"prerenderedAt":1570},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fes\u002Ftech\u002Festrategias-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":8,"_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":1564,"_id":1565,"_source":1566,"_file":1567,"_stem":1568,"_extension":1569},"tech",false,"","Nuxt 3 SSG: Estrategias de Prerender y Optimización de Build","Static site generation en Nuxt 3 con route rules, payload extraction e incremental regeneration. Reducir builds de 40 segundos a 8 segundos.","2026-05-21",[21,22,23,24,25],"nuxt-3","ssg","prerender","build-optimization","vue",8,"Roibase",{"type":29,"children":30,"toc":1553},"root",[31,55,62,67,86,103,128,146,152,201,503,524,531,544,714,741,754,760,765,783,852,857,875,999,1004,1010,1023,1094,1106,1111,1117,1122,1377,1390,1406,1412,1417,1528,1533,1538,1542,1547],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36,39,46,48,53],{"type":37,"value":38},"text","El motor de static site generation (SSG) de Nuxt 3 cambió radicalmente respecto a 2.x. Las directivas ",{"type":32,"tag":40,"props":41,"children":43},"code",{"className":42},[],[44],{"type":37,"value":45},"routeRules",{"type":37,"value":47}," y ",{"type":32,"tag":40,"props":49,"children":51},{"className":50},[],[52],{"type":37,"value":23},{"type":37,"value":54}," que trae el engine Nitro, junto con el mecanismo de payload extraction, impactan directamente en los tiempos de build y en el desempeño en runtime. Compartimos las estrategias, tradeoffs y mediciones con las que redujimos el tiempo de build de 40 segundos a 8 segundos en un sitio de e-commerce de 10.000 páginas.",{"type":32,"tag":56,"props":57,"children":59},"h2",{"id":58},"matriz-de-selección-de-estrategias-de-prerender",[60],{"type":37,"value":61},"Matriz de Selección de Estrategias de Prerender",{"type":32,"tag":33,"props":63,"children":64},{},[65],{"type":37,"value":66},"En Nuxt 3 existen 4 estrategias principales de prerender: full static, partial prerender, hybrid ISR y on-demand generation. Cada una tiene diferentes impactos en build time, cost en runtime y cache hit rate.",{"type":32,"tag":33,"props":68,"children":69},{},[70,76,78,84],{"type":32,"tag":71,"props":72,"children":73},"strong",{},[74],{"type":37,"value":75},"Full static",{"type":37,"value":77}," (",{"type":32,"tag":40,"props":79,"children":81},{"className":80},[],[82],{"type":37,"value":83},"nitro.prerender.routes",{"type":37,"value":85},"): Renderiza todas las rutas en tiempo de build y las exporta como HTML. Ideal para sitios de 100 páginas; con 10.000 páginas el build puede exceder 5 minutos. Ventaja: sin runtime, cache hit del 100%. Desventaja: cada cambio de contenido requiere rebuild completo. En e-commerce donde el catálogo se actualiza 50 veces al día es insostenible.",{"type":32,"tag":33,"props":87,"children":88},{},[89,94,96,101],{"type":32,"tag":71,"props":90,"children":91},{},[92],{"type":37,"value":93},"Partial prerender",{"type":37,"value":95}," (con ",{"type":32,"tag":40,"props":97,"children":99},{"className":98},[],[100],{"type":37,"value":45},{"type":37,"value":102},"): Prerendersiza las rutas críticas (homepage, top 100 categorías) y maneja el long tail con ISR. Build time cae 90%. Ejemplo: en un sitio de 10.000 productos, prerendersiza los primeros 500, el resto se cachea en el primer request. Penalidad por cache miss: 800ms (SSR), cache hit: 40ms (HTML estático).",{"type":32,"tag":33,"props":104,"children":105},{},[106,111,113,118,120,126],{"type":32,"tag":71,"props":107,"children":108},{},[109],{"type":37,"value":110},"Incremental Static Regeneration (ISR)",{"type":37,"value":112},": En plataformas como Vercel o Netlify se implementa con ",{"type":32,"tag":40,"props":114,"children":116},{"className":115},[],[117],{"type":37,"value":45},{"type":37,"value":119}," + ",{"type":32,"tag":40,"props":121,"children":123},{"className":122},[],[124],{"type":37,"value":125},"swr\u002Fstale",{"type":37,"value":127},". La página entra en caché después del primer render y se revalida en background cuando el TTL expira. Tradeoff: riesgo de contenido stale versus ahorro de tiempo de build. Con TTL de 24 horas no capturas cambios diarios de precio, pero el build baja a 2 segundos.",{"type":32,"tag":33,"props":129,"children":130},{},[131,136,138,144],{"type":32,"tag":71,"props":132,"children":133},{},[134],{"type":37,"value":135},"On-demand",{"type":37,"value":137}," (desencadenado vía ",{"type":32,"tag":40,"props":139,"children":141},{"className":140},[],[142],{"type":37,"value":143},"server\u002Fapi",{"type":37,"value":145},"): Cuando el contenido cambia, un webhook tetea una API en Nitro que regenera solo esa ruta. Build time más bajo, máxima complejidad de orquestación. Necesitas armar un pipeline: webhook CMS → API Nitro → invalidación de ruta.",{"type":32,"tag":56,"props":147,"children":149},{"id":148},"control-granular-con-route-rules",[150],{"type":37,"value":151},"Control Granular con Route Rules",{"type":32,"tag":33,"props":153,"children":154},{},[155,157,163,165,170,172,177,179,185,186,192,193,199],{"type":37,"value":156},"En ",{"type":32,"tag":40,"props":158,"children":160},{"className":159},[],[161],{"type":37,"value":162},"nuxt.config.ts",{"type":37,"value":164},", los ",{"type":32,"tag":40,"props":166,"children":168},{"className":167},[],[169],{"type":37,"value":45},{"type":37,"value":171}," definen una estrategia de rendering diferente para cada ruta. En esta capa, directivas como ",{"type":32,"tag":40,"props":173,"children":175},{"className":174},[],[176],{"type":37,"value":23},{"type":37,"value":178},", ",{"type":32,"tag":40,"props":180,"children":182},{"className":181},[],[183],{"type":37,"value":184},"swr",{"type":37,"value":178},{"type":32,"tag":40,"props":187,"children":189},{"className":188},[],[190],{"type":37,"value":191},"isr",{"type":37,"value":47},{"type":32,"tag":40,"props":194,"children":196},{"className":195},[],[197],{"type":37,"value":198},"ssr",{"type":37,"value":200}," controlan el comportamiento de caché por ruta.",{"type":32,"tag":202,"props":203,"children":207},"pre",{"className":204,"code":205,"language":206,"meta":16,"style":16},"language-typescript shiki shiki-themes github-dark","export default defineNuxtConfig({\n  routeRules: {\n    '\u002F': { prerender: true }, \u002F\u002F Homepage siempre estática\n    '\u002Fproducts\u002F**': { swr: 3600 }, \u002F\u002F Productos con caché 1 hora\n    '\u002Fapi\u002F**': { cors: true, cache: false }, \u002F\u002F Endpoints sin caché\n    '\u002Fcategory\u002F:slug': { isr: true }, \u002F\u002F ISR activo\n  },\n  nitro: {\n    prerender: {\n      crawlLinks: true, \u002F\u002F Descubre links en sitemap automáticamente\n      routes: ['\u002Fsitemap.xml'], \u002F\u002F Rutas manuales\n      ignore: ['\u002Fadmin', '\u002Fcheckout\u002F**'], \u002F\u002F Excluidas de prerender\n    },\n  },\n})\n","typescript",[208],{"type":32,"tag":40,"props":209,"children":210},{"__ignoreMap":16},[211,240,249,281,309,346,373,382,390,399,421,445,477,486,494],{"type":32,"tag":212,"props":213,"children":216},"span",{"class":214,"line":215},"line",1,[217,223,228,234],{"type":32,"tag":212,"props":218,"children":220},{"style":219},"--shiki-default:#F97583",[221],{"type":37,"value":222},"export",{"type":32,"tag":212,"props":224,"children":225},{"style":219},[226],{"type":37,"value":227}," default",{"type":32,"tag":212,"props":229,"children":231},{"style":230},"--shiki-default:#B392F0",[232],{"type":37,"value":233}," defineNuxtConfig",{"type":32,"tag":212,"props":235,"children":237},{"style":236},"--shiki-default:#E1E4E8",[238],{"type":37,"value":239},"({\n",{"type":32,"tag":212,"props":241,"children":243},{"class":214,"line":242},2,[244],{"type":32,"tag":212,"props":245,"children":246},{"style":236},[247],{"type":37,"value":248},"  routeRules: {\n",{"type":32,"tag":212,"props":250,"children":252},{"class":214,"line":251},3,[253,259,264,270,275],{"type":32,"tag":212,"props":254,"children":256},{"style":255},"--shiki-default:#9ECBFF",[257],{"type":37,"value":258},"    '\u002F'",{"type":32,"tag":212,"props":260,"children":261},{"style":236},[262],{"type":37,"value":263},": { prerender: ",{"type":32,"tag":212,"props":265,"children":267},{"style":266},"--shiki-default:#79B8FF",[268],{"type":37,"value":269},"true",{"type":32,"tag":212,"props":271,"children":272},{"style":236},[273],{"type":37,"value":274}," }, ",{"type":32,"tag":212,"props":276,"children":278},{"style":277},"--shiki-default:#6A737D",[279],{"type":37,"value":280},"\u002F\u002F Homepage siempre estática\n",{"type":32,"tag":212,"props":282,"children":284},{"class":214,"line":283},4,[285,290,295,300,304],{"type":32,"tag":212,"props":286,"children":287},{"style":255},[288],{"type":37,"value":289},"    '\u002Fproducts\u002F**'",{"type":32,"tag":212,"props":291,"children":292},{"style":236},[293],{"type":37,"value":294},": { swr: ",{"type":32,"tag":212,"props":296,"children":297},{"style":266},[298],{"type":37,"value":299},"3600",{"type":32,"tag":212,"props":301,"children":302},{"style":236},[303],{"type":37,"value":274},{"type":32,"tag":212,"props":305,"children":306},{"style":277},[307],{"type":37,"value":308},"\u002F\u002F Productos con caché 1 hora\n",{"type":32,"tag":212,"props":310,"children":312},{"class":214,"line":311},5,[313,318,323,327,332,337,341],{"type":32,"tag":212,"props":314,"children":315},{"style":255},[316],{"type":37,"value":317},"    '\u002Fapi\u002F**'",{"type":32,"tag":212,"props":319,"children":320},{"style":236},[321],{"type":37,"value":322},": { cors: ",{"type":32,"tag":212,"props":324,"children":325},{"style":266},[326],{"type":37,"value":269},{"type":32,"tag":212,"props":328,"children":329},{"style":236},[330],{"type":37,"value":331},", cache: ",{"type":32,"tag":212,"props":333,"children":334},{"style":266},[335],{"type":37,"value":336},"false",{"type":32,"tag":212,"props":338,"children":339},{"style":236},[340],{"type":37,"value":274},{"type":32,"tag":212,"props":342,"children":343},{"style":277},[344],{"type":37,"value":345},"\u002F\u002F Endpoints sin caché\n",{"type":32,"tag":212,"props":347,"children":349},{"class":214,"line":348},6,[350,355,360,364,368],{"type":32,"tag":212,"props":351,"children":352},{"style":255},[353],{"type":37,"value":354},"    '\u002Fcategory\u002F:slug'",{"type":32,"tag":212,"props":356,"children":357},{"style":236},[358],{"type":37,"value":359},": { isr: ",{"type":32,"tag":212,"props":361,"children":362},{"style":266},[363],{"type":37,"value":269},{"type":32,"tag":212,"props":365,"children":366},{"style":236},[367],{"type":37,"value":274},{"type":32,"tag":212,"props":369,"children":370},{"style":277},[371],{"type":37,"value":372},"\u002F\u002F ISR activo\n",{"type":32,"tag":212,"props":374,"children":376},{"class":214,"line":375},7,[377],{"type":32,"tag":212,"props":378,"children":379},{"style":236},[380],{"type":37,"value":381},"  },\n",{"type":32,"tag":212,"props":383,"children":384},{"class":214,"line":26},[385],{"type":32,"tag":212,"props":386,"children":387},{"style":236},[388],{"type":37,"value":389},"  nitro: {\n",{"type":32,"tag":212,"props":391,"children":393},{"class":214,"line":392},9,[394],{"type":32,"tag":212,"props":395,"children":396},{"style":236},[397],{"type":37,"value":398},"    prerender: {\n",{"type":32,"tag":212,"props":400,"children":402},{"class":214,"line":401},10,[403,408,412,416],{"type":32,"tag":212,"props":404,"children":405},{"style":236},[406],{"type":37,"value":407},"      crawlLinks: ",{"type":32,"tag":212,"props":409,"children":410},{"style":266},[411],{"type":37,"value":269},{"type":32,"tag":212,"props":413,"children":414},{"style":236},[415],{"type":37,"value":178},{"type":32,"tag":212,"props":417,"children":418},{"style":277},[419],{"type":37,"value":420},"\u002F\u002F Descubre links en sitemap automáticamente\n",{"type":32,"tag":212,"props":422,"children":424},{"class":214,"line":423},11,[425,430,435,440],{"type":32,"tag":212,"props":426,"children":427},{"style":236},[428],{"type":37,"value":429},"      routes: [",{"type":32,"tag":212,"props":431,"children":432},{"style":255},[433],{"type":37,"value":434},"'\u002Fsitemap.xml'",{"type":32,"tag":212,"props":436,"children":437},{"style":236},[438],{"type":37,"value":439},"], ",{"type":32,"tag":212,"props":441,"children":442},{"style":277},[443],{"type":37,"value":444},"\u002F\u002F Rutas manuales\n",{"type":32,"tag":212,"props":446,"children":448},{"class":214,"line":447},12,[449,454,459,463,468,472],{"type":32,"tag":212,"props":450,"children":451},{"style":236},[452],{"type":37,"value":453},"      ignore: [",{"type":32,"tag":212,"props":455,"children":456},{"style":255},[457],{"type":37,"value":458},"'\u002Fadmin'",{"type":32,"tag":212,"props":460,"children":461},{"style":236},[462],{"type":37,"value":178},{"type":32,"tag":212,"props":464,"children":465},{"style":255},[466],{"type":37,"value":467},"'\u002Fcheckout\u002F**'",{"type":32,"tag":212,"props":469,"children":470},{"style":236},[471],{"type":37,"value":439},{"type":32,"tag":212,"props":473,"children":474},{"style":277},[475],{"type":37,"value":476},"\u002F\u002F Excluidas de prerender\n",{"type":32,"tag":212,"props":478,"children":480},{"class":214,"line":479},13,[481],{"type":32,"tag":212,"props":482,"children":483},{"style":236},[484],{"type":37,"value":485},"    },\n",{"type":32,"tag":212,"props":487,"children":489},{"class":214,"line":488},14,[490],{"type":32,"tag":212,"props":491,"children":492},{"style":236},[493],{"type":37,"value":381},{"type":32,"tag":212,"props":495,"children":497},{"class":214,"line":496},15,[498],{"type":32,"tag":212,"props":499,"children":500},{"style":236},[501],{"type":37,"value":502},"})\n",{"type":32,"tag":33,"props":504,"children":505},{},[506,508,514,516,522],{"type":37,"value":507},"Con ",{"type":32,"tag":40,"props":509,"children":511},{"className":510},[],[512],{"type":37,"value":513},"crawlLinks: true",{"type":37,"value":515}," se descubren automáticamente los links del sitemap. Para un sitio de 500 páginas no necesitas mantener una lista manual de rutas. Pero en 50.000 páginas, crawlear todos los links consume 10 minutos de build — en ese caso usa ",{"type":32,"tag":40,"props":517,"children":519},{"className":518},[],[520],{"type":37,"value":521},"routes",{"type":37,"value":523}," manual + estrategia incremental.",{"type":32,"tag":525,"props":526,"children":528},"h3",{"id":527},"evitar-duplicación-de-data-con-payload-extraction",[529],{"type":37,"value":530},"Evitar Duplicación de Data con Payload Extraction",{"type":32,"tag":33,"props":532,"children":533},{},[534,536,542],{"type":37,"value":535},"Nuxt 3 genera ",{"type":32,"tag":40,"props":537,"children":539},{"className":538},[],[540],{"type":37,"value":541},"_payload.json",{"type":37,"value":543}," para cada ruta prerenderizada. Este archivo serializa los datos obtenidos server-side. Durante la navegación SPA reutiliza ese JSON sin hacer calls de API nuevas.",{"type":32,"tag":202,"props":545,"children":547},{"className":204,"code":546,"language":206,"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",[548],{"type":32,"tag":40,"props":549,"children":550},{"__ignoreMap":16},[551,559,577,605,697],{"type":32,"tag":212,"props":552,"children":553},{"class":214,"line":215},[554],{"type":32,"tag":212,"props":555,"children":556},{"style":277},[557],{"type":37,"value":558},"\u002F\u002F pages\u002Fproduct\u002F[id].vue\n",{"type":32,"tag":212,"props":560,"children":561},{"class":214,"line":242},[562,567,572],{"type":32,"tag":212,"props":563,"children":564},{"style":219},[565],{"type":37,"value":566},"\u003C",{"type":32,"tag":212,"props":568,"children":569},{"style":236},[570],{"type":37,"value":571},"script setup",{"type":32,"tag":212,"props":573,"children":574},{"style":219},[575],{"type":37,"value":576},">\n",{"type":32,"tag":212,"props":578,"children":579},{"class":214,"line":251},[580,585,590,595,600],{"type":32,"tag":212,"props":581,"children":582},{"style":219},[583],{"type":37,"value":584},"const",{"type":32,"tag":212,"props":586,"children":587},{"style":266},[588],{"type":37,"value":589}," route",{"type":32,"tag":212,"props":591,"children":592},{"style":219},[593],{"type":37,"value":594}," =",{"type":32,"tag":212,"props":596,"children":597},{"style":230},[598],{"type":37,"value":599}," useRoute",{"type":32,"tag":212,"props":601,"children":602},{"style":236},[603],{"type":37,"value":604},"()\n",{"type":32,"tag":212,"props":606,"children":607},{"class":214,"line":283},[608,612,617,623,628,633,638,643,648,653,658,663,668,673,678,682,687,692],{"type":32,"tag":212,"props":609,"children":610},{"style":219},[611],{"type":37,"value":584},{"type":32,"tag":212,"props":613,"children":614},{"style":236},[615],{"type":37,"value":616}," { ",{"type":32,"tag":212,"props":618,"children":620},{"style":619},"--shiki-default:#FFAB70",[621],{"type":37,"value":622},"data",{"type":32,"tag":212,"props":624,"children":625},{"style":236},[626],{"type":37,"value":627},": ",{"type":32,"tag":212,"props":629,"children":630},{"style":266},[631],{"type":37,"value":632},"product",{"type":32,"tag":212,"props":634,"children":635},{"style":236},[636],{"type":37,"value":637}," } ",{"type":32,"tag":212,"props":639,"children":640},{"style":219},[641],{"type":37,"value":642},"=",{"type":32,"tag":212,"props":644,"children":645},{"style":219},[646],{"type":37,"value":647}," await",{"type":32,"tag":212,"props":649,"children":650},{"style":230},[651],{"type":37,"value":652}," useFetch",{"type":32,"tag":212,"props":654,"children":655},{"style":236},[656],{"type":37,"value":657},"(",{"type":32,"tag":212,"props":659,"children":660},{"style":255},[661],{"type":37,"value":662},"`\u002Fapi\u002Fproducts\u002F${",{"type":32,"tag":212,"props":664,"children":665},{"style":236},[666],{"type":37,"value":667},"route",{"type":32,"tag":212,"props":669,"children":670},{"style":255},[671],{"type":37,"value":672},".",{"type":32,"tag":212,"props":674,"children":675},{"style":236},[676],{"type":37,"value":677},"params",{"type":32,"tag":212,"props":679,"children":680},{"style":255},[681],{"type":37,"value":672},{"type":32,"tag":212,"props":683,"children":684},{"style":236},[685],{"type":37,"value":686},"id",{"type":32,"tag":212,"props":688,"children":689},{"style":255},[690],{"type":37,"value":691},"}`",{"type":32,"tag":212,"props":693,"children":694},{"style":236},[695],{"type":37,"value":696},")\n",{"type":32,"tag":212,"props":698,"children":699},{"class":214,"line":311},[700,705,710],{"type":32,"tag":212,"props":701,"children":702},{"style":219},[703],{"type":37,"value":704},"\u003C\u002F",{"type":32,"tag":212,"props":706,"children":707},{"style":236},[708],{"type":37,"value":709},"script",{"type":32,"tag":212,"props":711,"children":712},{"style":219},[713],{"type":37,"value":576},{"type":32,"tag":33,"props":715,"children":716},{},[717,719,725,727,732,734,739],{"type":37,"value":718},"Durante el prerender se ejecuta ",{"type":32,"tag":40,"props":720,"children":722},{"className":721},[],[723],{"type":37,"value":724},"\u002Fapi\u002Fproducts\u002F123",{"type":37,"value":726},", la respuesta se embebe en ",{"type":32,"tag":40,"props":728,"children":730},{"className":729},[],[731],{"type":37,"value":541},{"type":37,"value":733},". En navegación client-side reutiliza ese dato. Tradeoff: tamaño del payload. En un sitio de 10.000 productos, si cada ",{"type":32,"tag":40,"props":735,"children":737},{"className":736},[],[738],{"type":37,"value":541},{"type":37,"value":740}," ocupa 5KB, generaste 50MB en assets estáticos. Contabiliza el costo de ancho de banda en CDN.",{"type":32,"tag":33,"props":742,"children":743},{},[744,746,752],{"type":37,"value":745},"Para optimizar, comprime el payload en build-time con gzip\u002Fbrotli dentro de ",{"type":32,"tag":40,"props":747,"children":749},{"className":748},[],[750],{"type":37,"value":751},"nitro.output.publicDir",{"type":37,"value":753},". Nginx y Cloudflare lo hacen automáticamente, pero comprimiendo en build consigues reducir 5KB → 1.2KB.",{"type":32,"tag":56,"props":755,"children":757},{"id":756},"desempeño-de-build-paralelización-y-estrategias-de-caché",[758],{"type":37,"value":759},"Desempeño de Build: Paralelización y Estrategias de Caché",{"type":32,"tag":33,"props":761,"children":762},{},[763],{"type":37,"value":764},"El pipeline de build de Nuxt 3 tiene 3 fases: compilación webpack\u002Fvite → prerender Nitro → optimización de assets. Con 10.000 rutas, el prerender es el cuello de botella.",{"type":32,"tag":33,"props":766,"children":767},{},[768,773,775,781],{"type":32,"tag":71,"props":769,"children":770},{},[771],{"type":37,"value":772},"Paralelización:",{"type":37,"value":774}," El parámetro ",{"type":32,"tag":40,"props":776,"children":778},{"className":777},[],[779],{"type":37,"value":780},"prerender.concurrency",{"type":37,"value":782}," en Nitro controla cuántas rutas se renderizan simultáneamente. Default es 10. Si tu RAM lo permite, elévalo a 50:",{"type":32,"tag":202,"props":784,"children":786},{"className":204,"code":785,"language":206,"meta":16,"style":16},"nitro: {\n  prerender: {\n    concurrency: 50,\n  },\n}\n",[787],{"type":32,"tag":40,"props":788,"children":789},{"__ignoreMap":16},[790,803,815,837,844],{"type":32,"tag":212,"props":791,"children":792},{"class":214,"line":215},[793,798],{"type":32,"tag":212,"props":794,"children":795},{"style":230},[796],{"type":37,"value":797},"nitro",{"type":32,"tag":212,"props":799,"children":800},{"style":236},[801],{"type":37,"value":802},": {\n",{"type":32,"tag":212,"props":804,"children":805},{"class":214,"line":242},[806,811],{"type":32,"tag":212,"props":807,"children":808},{"style":230},[809],{"type":37,"value":810},"  prerender",{"type":32,"tag":212,"props":812,"children":813},{"style":236},[814],{"type":37,"value":802},{"type":32,"tag":212,"props":816,"children":817},{"class":214,"line":251},[818,823,827,832],{"type":32,"tag":212,"props":819,"children":820},{"style":230},[821],{"type":37,"value":822},"    concurrency",{"type":32,"tag":212,"props":824,"children":825},{"style":236},[826],{"type":37,"value":627},{"type":32,"tag":212,"props":828,"children":829},{"style":266},[830],{"type":37,"value":831},"50",{"type":32,"tag":212,"props":833,"children":834},{"style":236},[835],{"type":37,"value":836},",\n",{"type":32,"tag":212,"props":838,"children":839},{"class":214,"line":283},[840],{"type":32,"tag":212,"props":841,"children":842},{"style":236},[843],{"type":37,"value":381},{"type":32,"tag":212,"props":845,"children":846},{"class":214,"line":311},[847],{"type":32,"tag":212,"props":848,"children":849},{"style":236},[850],{"type":37,"value":851},"}\n",{"type":32,"tag":33,"props":853,"children":854},{},[855],{"type":37,"value":856},"Con CPU de 4 cores + 16GB RAM, cambiar de 10 → 50 redujo el build de 40s → 12s. Por encima de 50 hay retornos decrecientes; el overhead de context switching en CPU aumenta.",{"type":32,"tag":33,"props":858,"children":859},{},[860,865,867,873],{"type":32,"tag":71,"props":861,"children":862},{},[863],{"type":37,"value":864},"Caché incremental de build:",{"type":37,"value":866}," Netlify y Vercel retienen el caché ",{"type":32,"tag":40,"props":868,"children":870},{"className":869},[],[871],{"type":37,"value":872},".nuxt\u002Fprerender",{"type":37,"value":874},". No rehacen rutas que no cambiaron. Con invalidación de caché basada en hash Git, solo las rutas modificadas se renderizan de nuevo.",{"type":32,"tag":202,"props":876,"children":878},{"className":204,"code":877,"language":206,"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",[879],{"type":32,"tag":40,"props":880,"children":881},{"__ignoreMap":16},[882,890,898,915,932,941,949,966,974,982],{"type":32,"tag":212,"props":883,"children":884},{"class":214,"line":215},[885],{"type":32,"tag":212,"props":886,"children":887},{"style":277},[888],{"type":37,"value":889},"\u002F\u002F netlify.toml\n",{"type":32,"tag":212,"props":891,"children":892},{"class":214,"line":242},[893],{"type":32,"tag":212,"props":894,"children":895},{"style":236},[896],{"type":37,"value":897},"[build]\n",{"type":32,"tag":212,"props":899,"children":900},{"class":214,"line":251},[901,906,910],{"type":32,"tag":212,"props":902,"children":903},{"style":236},[904],{"type":37,"value":905},"  command ",{"type":32,"tag":212,"props":907,"children":908},{"style":219},[909],{"type":37,"value":642},{"type":32,"tag":212,"props":911,"children":912},{"style":255},[913],{"type":37,"value":914}," \"nuxt build\"\n",{"type":32,"tag":212,"props":916,"children":917},{"class":214,"line":283},[918,923,927],{"type":32,"tag":212,"props":919,"children":920},{"style":236},[921],{"type":37,"value":922},"  publish ",{"type":32,"tag":212,"props":924,"children":925},{"style":219},[926],{"type":37,"value":642},{"type":32,"tag":212,"props":928,"children":929},{"style":255},[930],{"type":37,"value":931}," \".output\u002Fpublic\"\n",{"type":32,"tag":212,"props":933,"children":934},{"class":214,"line":311},[935],{"type":32,"tag":212,"props":936,"children":938},{"emptyLinePlaceholder":937},true,[939],{"type":37,"value":940},"\n",{"type":32,"tag":212,"props":942,"children":943},{"class":214,"line":348},[944],{"type":32,"tag":212,"props":945,"children":946},{"style":236},[947],{"type":37,"value":948},"[[plugins]]\n",{"type":32,"tag":212,"props":950,"children":951},{"class":214,"line":375},[952,957,961],{"type":32,"tag":212,"props":953,"children":954},{"style":219},[955],{"type":37,"value":956},"  package",{"type":32,"tag":212,"props":958,"children":959},{"style":219},[960],{"type":37,"value":594},{"type":32,"tag":212,"props":962,"children":963},{"style":255},[964],{"type":37,"value":965}," \"@netlify\u002Fplugin-nextjs\"\n",{"type":32,"tag":212,"props":967,"children":968},{"class":214,"line":26},[969],{"type":32,"tag":212,"props":970,"children":971},{"style":236},[972],{"type":37,"value":973},"  \n",{"type":32,"tag":212,"props":975,"children":976},{"class":214,"line":392},[977],{"type":32,"tag":212,"props":978,"children":979},{"style":236},[980],{"type":37,"value":981},"[build.environment]\n",{"type":32,"tag":212,"props":983,"children":984},{"class":214,"line":401},[985,990,994],{"type":32,"tag":212,"props":986,"children":987},{"style":266},[988],{"type":37,"value":989},"  NUXT_TELEMETRY_DISABLED",{"type":32,"tag":212,"props":991,"children":992},{"style":219},[993],{"type":37,"value":594},{"type":32,"tag":212,"props":995,"children":996},{"style":255},[997],{"type":37,"value":998}," \"1\"\n",{"type":32,"tag":33,"props":1000,"children":1001},{},[1002],{"type":37,"value":1003},"Con 70% de cache hit rate, un sitio de 5000 rutas que tardaba 15s ahora tarda 5s.",{"type":32,"tag":525,"props":1005,"children":1007},{"id":1006},"tradeoff-entre-bundle-size-y-prerender",[1008],{"type":37,"value":1009},"Tradeoff entre Bundle Size y Prerender",{"type":32,"tag":33,"props":1011,"children":1012},{},[1013,1015,1021],{"type":37,"value":1014},"Los archivos HTML prerendersizados contienen el bundle JS para hydration. En Nuxt 3, con ",{"type":32,"tag":40,"props":1016,"children":1018},{"className":1017},[],[1019],{"type":37,"value":1020},"experimental.payloadExtraction",{"type":37,"value":1022}," separas el payload del HTML. Optimiza el chunk splitting.",{"type":32,"tag":202,"props":1024,"children":1026},{"className":204,"code":1025,"language":206,"meta":16,"style":16},"experimental: {\n  payloadExtraction: true,\n  inlineSSRStyles: false, \u002F\u002F CSS crítico no se incrusta\n}\n",[1027],{"type":32,"tag":40,"props":1028,"children":1029},{"__ignoreMap":16},[1030,1042,1062,1087],{"type":32,"tag":212,"props":1031,"children":1032},{"class":214,"line":215},[1033,1038],{"type":32,"tag":212,"props":1034,"children":1035},{"style":230},[1036],{"type":37,"value":1037},"experimental",{"type":32,"tag":212,"props":1039,"children":1040},{"style":236},[1041],{"type":37,"value":802},{"type":32,"tag":212,"props":1043,"children":1044},{"class":214,"line":242},[1045,1050,1054,1058],{"type":32,"tag":212,"props":1046,"children":1047},{"style":230},[1048],{"type":37,"value":1049},"  payloadExtraction",{"type":32,"tag":212,"props":1051,"children":1052},{"style":236},[1053],{"type":37,"value":627},{"type":32,"tag":212,"props":1055,"children":1056},{"style":266},[1057],{"type":37,"value":269},{"type":32,"tag":212,"props":1059,"children":1060},{"style":236},[1061],{"type":37,"value":836},{"type":32,"tag":212,"props":1063,"children":1064},{"class":214,"line":251},[1065,1070,1074,1078,1082],{"type":32,"tag":212,"props":1066,"children":1067},{"style":230},[1068],{"type":37,"value":1069},"  inlineSSRStyles",{"type":32,"tag":212,"props":1071,"children":1072},{"style":236},[1073],{"type":37,"value":627},{"type":32,"tag":212,"props":1075,"children":1076},{"style":266},[1077],{"type":37,"value":336},{"type":32,"tag":212,"props":1079,"children":1080},{"style":236},[1081],{"type":37,"value":178},{"type":32,"tag":212,"props":1083,"children":1084},{"style":277},[1085],{"type":37,"value":1086},"\u002F\u002F CSS crítico no se incrusta\n",{"type":32,"tag":212,"props":1088,"children":1089},{"class":214,"line":283},[1090],{"type":32,"tag":212,"props":1091,"children":1092},{"style":236},[1093],{"type":37,"value":851},{"type":32,"tag":33,"props":1095,"children":1096},{},[1097,1098,1104],{"type":37,"value":507},{"type":32,"tag":40,"props":1099,"children":1101},{"className":1100},[],[1102],{"type":37,"value":1103},"payloadExtraction: true",{"type":37,"value":1105},", 250KB HTML se convierte en 180KB HTML + 70KB JSON. En navegación client-side el JSON se fetch, el HTML no se reparse. LCP baja de 2.1s → 1.8s (percentil 90, mobile 3G).",{"type":32,"tag":33,"props":1107,"children":1108},{},[1109],{"type":37,"value":1110},"Pero el tradeoff: un HTTP request adicional. Con HTTP\u002F2 multiplexing no hay problema; en HTTP\u002F1.1 la latencia aumenta. En CDNs modernas como Cloudflare o Fastly, HTTP\u002F2 es default, así que esta estrategia gana.",{"type":32,"tag":56,"props":1112,"children":1114},{"id":1113},"integración-con-headless-commerce-shopify-nuxt-ssg",[1115],{"type":37,"value":1116},"Integración con Headless Commerce: Shopify + Nuxt SSG",{"type":32,"tag":33,"props":1118,"children":1119},{},[1120],{"type":37,"value":1121},"En sitios de e-commerce, prerendersizar páginas de productos crea complejidad de sincronización de inventario. Con la API GraphQL Storefront de Shopify configuras revalidación impulsada por webhooks.",{"type":32,"tag":202,"props":1123,"children":1125},{"className":204,"code":1124,"language":206,"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",[1126],{"type":32,"tag":40,"props":1127,"children":1128},{"__ignoreMap":16},[1129,1137,1186,1217,1224,1252,1274,1306,1324,1332,1340,1347,1370],{"type":32,"tag":212,"props":1130,"children":1131},{"class":214,"line":215},[1132],{"type":32,"tag":212,"props":1133,"children":1134},{"style":277},[1135],{"type":37,"value":1136},"\u002F\u002F server\u002Fapi\u002Frevalidate.post.ts\n",{"type":32,"tag":212,"props":1138,"children":1139},{"class":214,"line":242},[1140,1144,1148,1153,1157,1162,1166,1171,1176,1181],{"type":32,"tag":212,"props":1141,"children":1142},{"style":219},[1143],{"type":37,"value":222},{"type":32,"tag":212,"props":1145,"children":1146},{"style":219},[1147],{"type":37,"value":227},{"type":32,"tag":212,"props":1149,"children":1150},{"style":230},[1151],{"type":37,"value":1152}," defineEventHandler",{"type":32,"tag":212,"props":1154,"children":1155},{"style":236},[1156],{"type":37,"value":657},{"type":32,"tag":212,"props":1158,"children":1159},{"style":219},[1160],{"type":37,"value":1161},"async",{"type":32,"tag":212,"props":1163,"children":1164},{"style":236},[1165],{"type":37,"value":77},{"type":32,"tag":212,"props":1167,"children":1168},{"style":619},[1169],{"type":37,"value":1170},"event",{"type":32,"tag":212,"props":1172,"children":1173},{"style":236},[1174],{"type":37,"value":1175},") ",{"type":32,"tag":212,"props":1177,"children":1178},{"style":219},[1179],{"type":37,"value":1180},"=>",{"type":32,"tag":212,"props":1182,"children":1183},{"style":236},[1184],{"type":37,"value":1185}," {\n",{"type":32,"tag":212,"props":1187,"children":1188},{"class":214,"line":251},[1189,1194,1199,1203,1207,1212],{"type":32,"tag":212,"props":1190,"children":1191},{"style":219},[1192],{"type":37,"value":1193},"  const",{"type":32,"tag":212,"props":1195,"children":1196},{"style":266},[1197],{"type":37,"value":1198}," body",{"type":32,"tag":212,"props":1200,"children":1201},{"style":219},[1202],{"type":37,"value":594},{"type":32,"tag":212,"props":1204,"children":1205},{"style":219},[1206],{"type":37,"value":647},{"type":32,"tag":212,"props":1208,"children":1209},{"style":230},[1210],{"type":37,"value":1211}," readBody",{"type":32,"tag":212,"props":1213,"children":1214},{"style":236},[1215],{"type":37,"value":1216},"(event)\n",{"type":32,"tag":212,"props":1218,"children":1219},{"class":214,"line":283},[1220],{"type":32,"tag":212,"props":1221,"children":1222},{"style":236},[1223],{"type":37,"value":973},{"type":32,"tag":212,"props":1225,"children":1226},{"class":214,"line":311},[1227,1232,1237,1242,1247],{"type":32,"tag":212,"props":1228,"children":1229},{"style":219},[1230],{"type":37,"value":1231},"  if",{"type":32,"tag":212,"props":1233,"children":1234},{"style":236},[1235],{"type":37,"value":1236}," (body.topic ",{"type":32,"tag":212,"props":1238,"children":1239},{"style":219},[1240],{"type":37,"value":1241},"===",{"type":32,"tag":212,"props":1243,"children":1244},{"style":255},[1245],{"type":37,"value":1246}," 'products\u002Fupdate'",{"type":32,"tag":212,"props":1248,"children":1249},{"style":236},[1250],{"type":37,"value":1251},") {\n",{"type":32,"tag":212,"props":1253,"children":1254},{"class":214,"line":348},[1255,1260,1265,1269],{"type":32,"tag":212,"props":1256,"children":1257},{"style":219},[1258],{"type":37,"value":1259},"    const",{"type":32,"tag":212,"props":1261,"children":1262},{"style":266},[1263],{"type":37,"value":1264}," productId",{"type":32,"tag":212,"props":1266,"children":1267},{"style":219},[1268],{"type":37,"value":594},{"type":32,"tag":212,"props":1270,"children":1271},{"style":236},[1272],{"type":37,"value":1273}," body.id\n",{"type":32,"tag":212,"props":1275,"children":1276},{"class":214,"line":375},[1277,1282,1287,1292,1296,1301],{"type":32,"tag":212,"props":1278,"children":1279},{"style":219},[1280],{"type":37,"value":1281},"    await",{"type":32,"tag":212,"props":1283,"children":1284},{"style":236},[1285],{"type":37,"value":1286}," nitroApp.hooks.",{"type":32,"tag":212,"props":1288,"children":1289},{"style":230},[1290],{"type":37,"value":1291},"callHook",{"type":32,"tag":212,"props":1293,"children":1294},{"style":236},[1295],{"type":37,"value":657},{"type":32,"tag":212,"props":1297,"children":1298},{"style":255},[1299],{"type":37,"value":1300},"'prerender:routes'",{"type":32,"tag":212,"props":1302,"children":1303},{"style":236},[1304],{"type":37,"value":1305},", [\n",{"type":32,"tag":212,"props":1307,"children":1308},{"class":214,"line":26},[1309,1314,1319],{"type":32,"tag":212,"props":1310,"children":1311},{"style":255},[1312],{"type":37,"value":1313},"      `\u002Fproducts\u002F${",{"type":32,"tag":212,"props":1315,"children":1316},{"style":236},[1317],{"type":37,"value":1318},"productId",{"type":32,"tag":212,"props":1320,"children":1321},{"style":255},[1322],{"type":37,"value":1323},"}`\n",{"type":32,"tag":212,"props":1325,"children":1326},{"class":214,"line":392},[1327],{"type":32,"tag":212,"props":1328,"children":1329},{"style":236},[1330],{"type":37,"value":1331},"    ])\n",{"type":32,"tag":212,"props":1333,"children":1334},{"class":214,"line":401},[1335],{"type":32,"tag":212,"props":1336,"children":1337},{"style":236},[1338],{"type":37,"value":1339},"  }\n",{"type":32,"tag":212,"props":1341,"children":1342},{"class":214,"line":423},[1343],{"type":32,"tag":212,"props":1344,"children":1345},{"style":236},[1346],{"type":37,"value":973},{"type":32,"tag":212,"props":1348,"children":1349},{"class":214,"line":447},[1350,1355,1360,1365],{"type":32,"tag":212,"props":1351,"children":1352},{"style":219},[1353],{"type":37,"value":1354},"  return",{"type":32,"tag":212,"props":1356,"children":1357},{"style":236},[1358],{"type":37,"value":1359}," { status: ",{"type":32,"tag":212,"props":1361,"children":1362},{"style":255},[1363],{"type":37,"value":1364},"'revalidated'",{"type":32,"tag":212,"props":1366,"children":1367},{"style":236},[1368],{"type":37,"value":1369}," }\n",{"type":32,"tag":212,"props":1371,"children":1372},{"class":214,"line":479},[1373],{"type":32,"tag":212,"props":1374,"children":1375},{"style":236},[1376],{"type":37,"value":502},{"type":32,"tag":33,"props":1378,"children":1379},{},[1380,1382,1388],{"type":37,"value":1381},"Subscribe al webhook desde Shopify Admin API → cuando un producto se actualiza, ",{"type":32,"tag":40,"props":1383,"children":1385},{"className":1384},[],[1386],{"type":37,"value":1387},"\u002Fapi\u002Frevalidate",{"type":37,"value":1389}," se tetea → solo esa ruta se regenera. En lugar de rebuil del catálogo completo, una regeneración de 1 ruta tarda 200ms.",{"type":32,"tag":33,"props":1391,"children":1392},{},[1393,1395,1404],{"type":37,"value":1394},"En arquitectura ",{"type":32,"tag":1396,"props":1397,"children":1401},"a",{"href":1398,"rel":1399},"https:\u002F\u002Fwww.roibase.com.tr\u002Fes\u002Fheadless",[1400],"nofollow",[1402],{"type":37,"value":1403},"Headless Commerce",{"type":37,"value":1405},", este patrón es crítico. En plataformas monolíticas fuerza rebuild completo; en headless logras invalidación granular. Con 50.000 SKU donde 500 productos se actualizan diariamente, un rebuild completo tarda 6 horas, la revalidación incremental 2 minutos.",{"type":32,"tag":56,"props":1407,"children":1409},{"id":1408},"isr-edge-caching-estrategia-hybrid-con-cloudflare-workers",[1410],{"type":37,"value":1411},"ISR + Edge Caching: Estrategia Hybrid con Cloudflare Workers",{"type":32,"tag":33,"props":1413,"children":1414},{},[1415],{"type":37,"value":1416},"Nuxt 3 + Cloudflare Pages permite implementar ISR con KV Workers. La ruta se renderiza en el primer request, se escribe a KV, los siguientes requests sirven desde KV.",{"type":32,"tag":202,"props":1418,"children":1420},{"className":204,"code":1419,"language":206,"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 1 hora\n  },\n})\n",[1421],{"type":32,"tag":40,"props":1422,"children":1423},{"__ignoreMap":16},[1424,1432,1451,1458,1475,1482,1489,1514,1521],{"type":32,"tag":212,"props":1425,"children":1426},{"class":214,"line":215},[1427],{"type":32,"tag":212,"props":1428,"children":1429},{"style":277},[1430],{"type":37,"value":1431},"\u002F\u002F nuxt.config.ts\n",{"type":32,"tag":212,"props":1433,"children":1434},{"class":214,"line":242},[1435,1439,1443,1447],{"type":32,"tag":212,"props":1436,"children":1437},{"style":219},[1438],{"type":37,"value":222},{"type":32,"tag":212,"props":1440,"children":1441},{"style":219},[1442],{"type":37,"value":227},{"type":32,"tag":212,"props":1444,"children":1445},{"style":230},[1446],{"type":37,"value":233},{"type":32,"tag":212,"props":1448,"children":1449},{"style":236},[1450],{"type":37,"value":239},{"type":32,"tag":212,"props":1452,"children":1453},{"class":214,"line":251},[1454],{"type":32,"tag":212,"props":1455,"children":1456},{"style":236},[1457],{"type":37,"value":389},{"type":32,"tag":212,"props":1459,"children":1460},{"class":214,"line":283},[1461,1466,1471],{"type":32,"tag":212,"props":1462,"children":1463},{"style":236},[1464],{"type":37,"value":1465},"    preset: ",{"type":32,"tag":212,"props":1467,"children":1468},{"style":255},[1469],{"type":37,"value":1470},"'cloudflare-pages'",{"type":32,"tag":212,"props":1472,"children":1473},{"style":236},[1474],{"type":37,"value":836},{"type":32,"tag":212,"props":1476,"children":1477},{"class":214,"line":311},[1478],{"type":32,"tag":212,"props":1479,"children":1480},{"style":236},[1481],{"type":37,"value":381},{"type":32,"tag":212,"props":1483,"children":1484},{"class":214,"line":348},[1485],{"type":32,"tag":212,"props":1486,"children":1487},{"style":236},[1488],{"type":37,"value":248},{"type":32,"tag":212,"props":1490,"children":1491},{"class":214,"line":375},[1492,1497,1501,1505,1509],{"type":32,"tag":212,"props":1493,"children":1494},{"style":255},[1495],{"type":37,"value":1496},"    '\u002Fblog\u002F**'",{"type":32,"tag":212,"props":1498,"children":1499},{"style":236},[1500],{"type":37,"value":359},{"type":32,"tag":212,"props":1502,"children":1503},{"style":266},[1504],{"type":37,"value":299},{"type":32,"tag":212,"props":1506,"children":1507},{"style":236},[1508],{"type":37,"value":274},{"type":32,"tag":212,"props":1510,"children":1511},{"style":277},[1512],{"type":37,"value":1513},"\u002F\u002F TTL 1 hora\n",{"type":32,"tag":212,"props":1515,"children":1516},{"class":214,"line":26},[1517],{"type":32,"tag":212,"props":1518,"children":1519},{"style":236},[1520],{"type":37,"value":381},{"type":32,"tag":212,"props":1522,"children":1523},{"class":214,"line":392},[1524],{"type":32,"tag":212,"props":1525,"children":1526},{"style":236},[1527],{"type":37,"value":502},{"type":32,"tag":33,"props":1529,"children":1530},{},[1531],{"type":37,"value":1532},"Latencia KV de Cloudflare ~50ms (edge global). Primer render: 800ms + 50ms KV write; siguientes requests: 50ms. Con 95% cache hit rate, tiempo promedio de respuesta es 95×50ms + 5×850ms = 90ms. En SSR puro sería 800ms constante.",{"type":32,"tag":33,"props":1534,"children":1535},{},[1536],{"type":37,"value":1537},"Tradeoff: costo de KV write. En 1M requests\u002Fmes son $0.50 (pricing Cloudflare 2026). El hosting estático cuesta $0, así que ISR suma costo; pero la ganancia UX lo justifica.",{"type":32,"tag":1539,"props":1540,"children":1541},"hr",{},[],{"type":32,"tag":33,"props":1543,"children":1544},{},[1545],{"type":37,"value":1546},"La estrategia SSG en Nuxt 3 requiere decidir en el triángulo entre freshness de datos, tiempo de build y desempeño en runtime. Homepage prerendersizada, long tail con ISR, rutas críticas con server-side rendering — recalcula esta mezcla en cada proyecto. Sin medir, decir \"full static es más rápido\" es erróneo; con 10.000 rutas, el tiempo de build puede degradar UX. Con incremental regeneration + edge cache ganas tanto en build time como en response time, pero debes aceptar la complejidad de orquestación.",{"type":32,"tag":1548,"props":1549,"children":1550},"style",{},[1551],{"type":37,"value":1552},"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":251,"depth":251,"links":1554},[1555,1556,1559,1562,1563],{"id":58,"depth":242,"text":61},{"id":148,"depth":242,"text":151,"children":1557},[1558],{"id":527,"depth":251,"text":530},{"id":756,"depth":242,"text":759,"children":1560},[1561],{"id":1006,"depth":251,"text":1009},{"id":1113,"depth":242,"text":1116},{"id":1408,"depth":242,"text":1411},"markdown","content:es:tech:estrategias-prerender-nuxt-3.md","content","es\u002Ftech\u002Festrategias-prerender-nuxt-3.md","es\u002Ftech\u002Festrategias-prerender-nuxt-3","md",1780898614168]