[{"data":1,"prerenderedAt":1904},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fes\u002Ftech\u002Festrategias-prerender-ssg-nuxt-3":13},{"i18nKey":4,"paths":5},"tech-007-2026-08",{"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-ssg-nuxt-3","\u002Ffr\u002Ftech\u002Fstrategie-prerender-nuxt-3","\u002Fit\u002Ftech\u002Fssg-strategie-nuxt-3-prerender-e-ottimizzazione-build","\u002Fru\u002Ftech\u002Fssg-strategii-dlya-nuxt-3-i-optimizaciya-sborki","\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":1898,"_id":1899,"_source":1900,"_file":1901,"_stem":1902,"_extension":1903},"tech",false,"","Nuxt 3 SSG: Estrategias de Prerender y Optimización de Build","Static site generation en Nuxt 3: route rules, prerendering con Nitro, builds incrementales y estrategias de deployment en producción.","2026-08-06",[21,22,23,24,25],"nuxt-3","ssg","static-generation","web-performance","nitro",8,"Roibase",{"type":29,"children":30,"toc":1885},"root",[31,39,46,68,229,250,257,270,510,523,529,553,707,712,769,775,788,843,855,861,874,1148,1168,1174,1179,1400,1405,1411,1423,1665,1670,1698,1703,1709,1721,1863,1874,1879],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","La arquitectura SSG (Static Site Generation) de Nuxt 3 representa una ruptura fundamental respecto al comando \"nuxt generate\" de la era Vue 2. El nuevo sistema de prerender basado en Nitro proporciona granularidad a nivel de ruta — puedes definir una estrategia de renderizado diferente para cada página. En este artículo abordamos la configuración de SSG lista para producción, la configuración de renderizado híbrido con route rules y los cuellos de botella de rendimiento que frecuentemente encontramos en el pipeline de build.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"prerendering-con-nitro-el-nuevo-fundamento-del-ssg",[44],{"type":37,"value":45},"Prerendering con Nitro: El Nuevo Fundamento del SSG",{"type":32,"tag":33,"props":47,"children":48},{},[49,51,58,60,66],{"type":37,"value":50},"En Nuxt 3, el SSG funciona sobre el motor de prerendering de Nitro. Lo controlas mediante la clave ",{"type":32,"tag":52,"props":53,"children":55},"code",{"className":54},[],[56],{"type":37,"value":57},"nitro.prerender",{"type":37,"value":59}," en el archivo ",{"type":32,"tag":52,"props":61,"children":63},{"className":62},[],[64],{"type":37,"value":65},"nuxt.config.ts",{"type":37,"value":67},". El enfoque clásico era renderizar todas las rutas en tiempo de build — ahora el prerendering selectivo es posible.",{"type":32,"tag":69,"props":70,"children":74},"pre",{"className":71,"code":72,"language":73,"meta":16,"style":16},"language-typescript shiki shiki-themes github-dark","export default defineNuxtConfig({\n  nitro: {\n    prerender: {\n      crawlLinks: true,\n      routes: ['\u002Fsitemap.xml', '\u002Frss.xml'],\n      ignore: ['\u002Fapi', '\u002Fadmin']\n    }\n  }\n})\n","typescript",[75],{"type":32,"tag":52,"props":76,"children":77},{"__ignoreMap":16},[78,107,116,125,145,175,203,212,220],{"type":32,"tag":79,"props":80,"children":83},"span",{"class":81,"line":82},"line",1,[84,90,95,101],{"type":32,"tag":79,"props":85,"children":87},{"style":86},"--shiki-default:#F97583",[88],{"type":37,"value":89},"export",{"type":32,"tag":79,"props":91,"children":92},{"style":86},[93],{"type":37,"value":94}," default",{"type":32,"tag":79,"props":96,"children":98},{"style":97},"--shiki-default:#B392F0",[99],{"type":37,"value":100}," defineNuxtConfig",{"type":32,"tag":79,"props":102,"children":104},{"style":103},"--shiki-default:#E1E4E8",[105],{"type":37,"value":106},"({\n",{"type":32,"tag":79,"props":108,"children":110},{"class":81,"line":109},2,[111],{"type":32,"tag":79,"props":112,"children":113},{"style":103},[114],{"type":37,"value":115},"  nitro: {\n",{"type":32,"tag":79,"props":117,"children":119},{"class":81,"line":118},3,[120],{"type":32,"tag":79,"props":121,"children":122},{"style":103},[123],{"type":37,"value":124},"    prerender: {\n",{"type":32,"tag":79,"props":126,"children":128},{"class":81,"line":127},4,[129,134,140],{"type":32,"tag":79,"props":130,"children":131},{"style":103},[132],{"type":37,"value":133},"      crawlLinks: ",{"type":32,"tag":79,"props":135,"children":137},{"style":136},"--shiki-default:#79B8FF",[138],{"type":37,"value":139},"true",{"type":32,"tag":79,"props":141,"children":142},{"style":103},[143],{"type":37,"value":144},",\n",{"type":32,"tag":79,"props":146,"children":148},{"class":81,"line":147},5,[149,154,160,165,170],{"type":32,"tag":79,"props":150,"children":151},{"style":103},[152],{"type":37,"value":153},"      routes: [",{"type":32,"tag":79,"props":155,"children":157},{"style":156},"--shiki-default:#9ECBFF",[158],{"type":37,"value":159},"'\u002Fsitemap.xml'",{"type":32,"tag":79,"props":161,"children":162},{"style":103},[163],{"type":37,"value":164},", ",{"type":32,"tag":79,"props":166,"children":167},{"style":156},[168],{"type":37,"value":169},"'\u002Frss.xml'",{"type":32,"tag":79,"props":171,"children":172},{"style":103},[173],{"type":37,"value":174},"],\n",{"type":32,"tag":79,"props":176,"children":178},{"class":81,"line":177},6,[179,184,189,193,198],{"type":32,"tag":79,"props":180,"children":181},{"style":103},[182],{"type":37,"value":183},"      ignore: [",{"type":32,"tag":79,"props":185,"children":186},{"style":156},[187],{"type":37,"value":188},"'\u002Fapi'",{"type":32,"tag":79,"props":190,"children":191},{"style":103},[192],{"type":37,"value":164},{"type":32,"tag":79,"props":194,"children":195},{"style":156},[196],{"type":37,"value":197},"'\u002Fadmin'",{"type":32,"tag":79,"props":199,"children":200},{"style":103},[201],{"type":37,"value":202},"]\n",{"type":32,"tag":79,"props":204,"children":206},{"class":81,"line":205},7,[207],{"type":32,"tag":79,"props":208,"children":209},{"style":103},[210],{"type":37,"value":211},"    }\n",{"type":32,"tag":79,"props":213,"children":214},{"class":81,"line":26},[215],{"type":32,"tag":79,"props":216,"children":217},{"style":103},[218],{"type":37,"value":219},"  }\n",{"type":32,"tag":79,"props":221,"children":223},{"class":81,"line":222},9,[224],{"type":32,"tag":79,"props":225,"children":226},{"style":103},[227],{"type":37,"value":228},"})\n",{"type":32,"tag":33,"props":230,"children":231},{},[232,234,240,242,248],{"type":37,"value":233},"La configuración ",{"type":32,"tag":52,"props":235,"children":237},{"className":236},[],[238],{"type":37,"value":239},"crawlLinks: true",{"type":37,"value":241}," le dice a Nuxt: descubre automáticamente todas las páginas vinculadas con ",{"type":32,"tag":52,"props":243,"children":245},{"className":244},[],[246],{"type":37,"value":247},"\u003CNuxtLink>",{"type":37,"value":249}," y prerrenderizalas. Esto funciona para blogs — pero en un sitio de comercio electrónico con 10 mil productos, el tiempo de build explota. Allí necesitas inyectar rutas dinámicamente.",{"type":32,"tag":251,"props":252,"children":254},"h3",{"id":253},"inyección-dinámica-de-rutas",[255],{"type":37,"value":256},"Inyección Dinámica de Rutas",{"type":32,"tag":33,"props":258,"children":259},{},[260,262,268],{"type":37,"value":261},"Para prerrenderizar rutas dinámicas como páginas de productos, en lugar de proporcionar manualmente paths al array ",{"type":32,"tag":52,"props":263,"children":265},{"className":264},[],[266],{"type":37,"value":267},"routes",{"type":37,"value":269},", usas hooks de Nitro:",{"type":32,"tag":69,"props":271,"children":273},{"className":71,"code":272,"language":73,"meta":16,"style":16},"\u002F\u002F server\u002Fplugins\u002Fprerender.ts\nexport default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('prerender:routes', async (ctx) => {\n    const products = await fetchProductSlugs() \u002F\u002F Obtén slugs de la API\n    products.forEach(slug => {\n      ctx.routes.add(`\u002Fproducts\u002F${slug}`)\n    })\n  })\n})\n",[274],{"type":32,"tag":52,"props":275,"children":276},{"__ignoreMap":16},[277,286,328,382,420,451,487,495,503],{"type":32,"tag":79,"props":278,"children":279},{"class":81,"line":82},[280],{"type":32,"tag":79,"props":281,"children":283},{"style":282},"--shiki-default:#6A737D",[284],{"type":37,"value":285},"\u002F\u002F server\u002Fplugins\u002Fprerender.ts\n",{"type":32,"tag":79,"props":287,"children":288},{"class":81,"line":109},[289,293,297,302,307,313,318,323],{"type":32,"tag":79,"props":290,"children":291},{"style":86},[292],{"type":37,"value":89},{"type":32,"tag":79,"props":294,"children":295},{"style":86},[296],{"type":37,"value":94},{"type":32,"tag":79,"props":298,"children":299},{"style":97},[300],{"type":37,"value":301}," defineNitroPlugin",{"type":32,"tag":79,"props":303,"children":304},{"style":103},[305],{"type":37,"value":306},"((",{"type":32,"tag":79,"props":308,"children":310},{"style":309},"--shiki-default:#FFAB70",[311],{"type":37,"value":312},"nitroApp",{"type":32,"tag":79,"props":314,"children":315},{"style":103},[316],{"type":37,"value":317},") ",{"type":32,"tag":79,"props":319,"children":320},{"style":86},[321],{"type":37,"value":322},"=>",{"type":32,"tag":79,"props":324,"children":325},{"style":103},[326],{"type":37,"value":327}," {\n",{"type":32,"tag":79,"props":329,"children":330},{"class":81,"line":118},[331,336,341,346,351,355,360,365,370,374,378],{"type":32,"tag":79,"props":332,"children":333},{"style":103},[334],{"type":37,"value":335},"  nitroApp.hooks.",{"type":32,"tag":79,"props":337,"children":338},{"style":97},[339],{"type":37,"value":340},"hook",{"type":32,"tag":79,"props":342,"children":343},{"style":103},[344],{"type":37,"value":345},"(",{"type":32,"tag":79,"props":347,"children":348},{"style":156},[349],{"type":37,"value":350},"'prerender:routes'",{"type":32,"tag":79,"props":352,"children":353},{"style":103},[354],{"type":37,"value":164},{"type":32,"tag":79,"props":356,"children":357},{"style":86},[358],{"type":37,"value":359},"async",{"type":32,"tag":79,"props":361,"children":362},{"style":103},[363],{"type":37,"value":364}," (",{"type":32,"tag":79,"props":366,"children":367},{"style":309},[368],{"type":37,"value":369},"ctx",{"type":32,"tag":79,"props":371,"children":372},{"style":103},[373],{"type":37,"value":317},{"type":32,"tag":79,"props":375,"children":376},{"style":86},[377],{"type":37,"value":322},{"type":32,"tag":79,"props":379,"children":380},{"style":103},[381],{"type":37,"value":327},{"type":32,"tag":79,"props":383,"children":384},{"class":81,"line":127},[385,390,395,400,405,410,415],{"type":32,"tag":79,"props":386,"children":387},{"style":86},[388],{"type":37,"value":389},"    const",{"type":32,"tag":79,"props":391,"children":392},{"style":136},[393],{"type":37,"value":394}," products",{"type":32,"tag":79,"props":396,"children":397},{"style":86},[398],{"type":37,"value":399}," =",{"type":32,"tag":79,"props":401,"children":402},{"style":86},[403],{"type":37,"value":404}," await",{"type":32,"tag":79,"props":406,"children":407},{"style":97},[408],{"type":37,"value":409}," fetchProductSlugs",{"type":32,"tag":79,"props":411,"children":412},{"style":103},[413],{"type":37,"value":414},"() ",{"type":32,"tag":79,"props":416,"children":417},{"style":282},[418],{"type":37,"value":419},"\u002F\u002F Obtén slugs de la API\n",{"type":32,"tag":79,"props":421,"children":422},{"class":81,"line":147},[423,428,433,437,442,447],{"type":32,"tag":79,"props":424,"children":425},{"style":103},[426],{"type":37,"value":427},"    products.",{"type":32,"tag":79,"props":429,"children":430},{"style":97},[431],{"type":37,"value":432},"forEach",{"type":32,"tag":79,"props":434,"children":435},{"style":103},[436],{"type":37,"value":345},{"type":32,"tag":79,"props":438,"children":439},{"style":309},[440],{"type":37,"value":441},"slug",{"type":32,"tag":79,"props":443,"children":444},{"style":86},[445],{"type":37,"value":446}," =>",{"type":32,"tag":79,"props":448,"children":449},{"style":103},[450],{"type":37,"value":327},{"type":32,"tag":79,"props":452,"children":453},{"class":81,"line":177},[454,459,464,468,473,477,482],{"type":32,"tag":79,"props":455,"children":456},{"style":103},[457],{"type":37,"value":458},"      ctx.routes.",{"type":32,"tag":79,"props":460,"children":461},{"style":97},[462],{"type":37,"value":463},"add",{"type":32,"tag":79,"props":465,"children":466},{"style":103},[467],{"type":37,"value":345},{"type":32,"tag":79,"props":469,"children":470},{"style":156},[471],{"type":37,"value":472},"`\u002Fproducts\u002F${",{"type":32,"tag":79,"props":474,"children":475},{"style":103},[476],{"type":37,"value":441},{"type":32,"tag":79,"props":478,"children":479},{"style":156},[480],{"type":37,"value":481},"}`",{"type":32,"tag":79,"props":483,"children":484},{"style":103},[485],{"type":37,"value":486},")\n",{"type":32,"tag":79,"props":488,"children":489},{"class":81,"line":205},[490],{"type":32,"tag":79,"props":491,"children":492},{"style":103},[493],{"type":37,"value":494},"    })\n",{"type":32,"tag":79,"props":496,"children":497},{"class":81,"line":26},[498],{"type":32,"tag":79,"props":499,"children":500},{"style":103},[501],{"type":37,"value":502},"  })\n",{"type":32,"tag":79,"props":504,"children":505},{"class":81,"line":222},[506],{"type":32,"tag":79,"props":507,"children":508},{"style":103},[509],{"type":37,"value":228},{"type":32,"tag":33,"props":511,"children":512},{},[513,515,521],{"type":37,"value":514},"Este patrón te permite obtener la lista de rutas de una fuente de datos externa en tiempo de build (CMS, base de datos, API de comercio headless) e inscribirlas como HTML estático en el directorio ",{"type":32,"tag":52,"props":516,"children":518},{"className":517},[],[519],{"type":37,"value":520},".output\u002Fpublic",{"type":37,"value":522},". Puedes prerrenderizar 5 mil productos desde la API Storefront de Shopify e implementarlos en Cloudflare Pages — TTFB se mantiene por debajo de 20ms.",{"type":32,"tag":40,"props":524,"children":526},{"id":525},"route-rules-estrategia-de-renderizado-híbrido",[527],{"type":37,"value":528},"Route Rules: Estrategia de Renderizado Híbrido",{"type":32,"tag":33,"props":530,"children":531},{},[532,534,540,542,551],{"type":37,"value":533},"La característica más potente de Nuxt 3 es la configuración del modo de renderizado a nivel de ruta. Con ",{"type":32,"tag":52,"props":535,"children":537},{"className":536},[],[538],{"type":37,"value":539},"routeRules",{"type":37,"value":541}," puedes renderizar una página como SSG mientras otra es SSR, y una tercera en modo SPA. Esto es crítico en proyectos de ",{"type":32,"tag":543,"props":544,"children":548},"a",{"href":545,"rel":546},"https:\u002F\u002Fwww.roibase.com.tr\u002Fes\u002Fheadless",[547],"nofollow",[549],{"type":37,"value":550},"comercio headless",{"type":37,"value":552}," — las páginas de productos son estáticas, la página del carrito es client-side, el checkout es SSR.",{"type":32,"tag":69,"props":554,"children":556},{"className":71,"code":555,"language":73,"meta":16,"style":16},"export default defineNuxtConfig({\n  routeRules: {\n    '\u002F': { prerender: true },\n    '\u002Fproducts\u002F**': { prerender: true },\n    '\u002Fapi\u002F**': { cors: true },\n    '\u002Fadmin\u002F**': { ssr: false },\n    '\u002Fcart': { ssr: false }\n  }\n})\n",[557],{"type":32,"tag":52,"props":558,"children":559},{"__ignoreMap":16},[560,579,587,609,629,650,672,693,700],{"type":32,"tag":79,"props":561,"children":562},{"class":81,"line":82},[563,567,571,575],{"type":32,"tag":79,"props":564,"children":565},{"style":86},[566],{"type":37,"value":89},{"type":32,"tag":79,"props":568,"children":569},{"style":86},[570],{"type":37,"value":94},{"type":32,"tag":79,"props":572,"children":573},{"style":97},[574],{"type":37,"value":100},{"type":32,"tag":79,"props":576,"children":577},{"style":103},[578],{"type":37,"value":106},{"type":32,"tag":79,"props":580,"children":581},{"class":81,"line":109},[582],{"type":32,"tag":79,"props":583,"children":584},{"style":103},[585],{"type":37,"value":586},"  routeRules: {\n",{"type":32,"tag":79,"props":588,"children":589},{"class":81,"line":118},[590,595,600,604],{"type":32,"tag":79,"props":591,"children":592},{"style":156},[593],{"type":37,"value":594},"    '\u002F'",{"type":32,"tag":79,"props":596,"children":597},{"style":103},[598],{"type":37,"value":599},": { prerender: ",{"type":32,"tag":79,"props":601,"children":602},{"style":136},[603],{"type":37,"value":139},{"type":32,"tag":79,"props":605,"children":606},{"style":103},[607],{"type":37,"value":608}," },\n",{"type":32,"tag":79,"props":610,"children":611},{"class":81,"line":127},[612,617,621,625],{"type":32,"tag":79,"props":613,"children":614},{"style":156},[615],{"type":37,"value":616},"    '\u002Fproducts\u002F**'",{"type":32,"tag":79,"props":618,"children":619},{"style":103},[620],{"type":37,"value":599},{"type":32,"tag":79,"props":622,"children":623},{"style":136},[624],{"type":37,"value":139},{"type":32,"tag":79,"props":626,"children":627},{"style":103},[628],{"type":37,"value":608},{"type":32,"tag":79,"props":630,"children":631},{"class":81,"line":147},[632,637,642,646],{"type":32,"tag":79,"props":633,"children":634},{"style":156},[635],{"type":37,"value":636},"    '\u002Fapi\u002F**'",{"type":32,"tag":79,"props":638,"children":639},{"style":103},[640],{"type":37,"value":641},": { cors: ",{"type":32,"tag":79,"props":643,"children":644},{"style":136},[645],{"type":37,"value":139},{"type":32,"tag":79,"props":647,"children":648},{"style":103},[649],{"type":37,"value":608},{"type":32,"tag":79,"props":651,"children":652},{"class":81,"line":177},[653,658,663,668],{"type":32,"tag":79,"props":654,"children":655},{"style":156},[656],{"type":37,"value":657},"    '\u002Fadmin\u002F**'",{"type":32,"tag":79,"props":659,"children":660},{"style":103},[661],{"type":37,"value":662},": { ssr: ",{"type":32,"tag":79,"props":664,"children":665},{"style":136},[666],{"type":37,"value":667},"false",{"type":32,"tag":79,"props":669,"children":670},{"style":103},[671],{"type":37,"value":608},{"type":32,"tag":79,"props":673,"children":674},{"class":81,"line":205},[675,680,684,688],{"type":32,"tag":79,"props":676,"children":677},{"style":156},[678],{"type":37,"value":679},"    '\u002Fcart'",{"type":32,"tag":79,"props":681,"children":682},{"style":103},[683],{"type":37,"value":662},{"type":32,"tag":79,"props":685,"children":686},{"style":136},[687],{"type":37,"value":667},{"type":32,"tag":79,"props":689,"children":690},{"style":103},[691],{"type":37,"value":692}," }\n",{"type":32,"tag":79,"props":694,"children":695},{"class":81,"line":26},[696],{"type":32,"tag":79,"props":697,"children":698},{"style":103},[699],{"type":37,"value":219},{"type":32,"tag":79,"props":701,"children":702},{"class":81,"line":222},[703],{"type":32,"tag":79,"props":704,"children":705},{"style":103},[706],{"type":37,"value":228},{"type":32,"tag":33,"props":708,"children":709},{},[710],{"type":37,"value":711},"Esta configuración hace lo siguiente:",{"type":32,"tag":713,"props":714,"children":715},"ul",{},[716,730,743,756],{"type":32,"tag":717,"props":718,"children":719},"li",{},[720,722,728],{"type":37,"value":721},"La homepage y todas las rutas ",{"type":32,"tag":52,"props":723,"children":725},{"className":724},[],[726],{"type":37,"value":727},"\u002Fproducts\u002F*",{"type":37,"value":729}," se prerrenderizán en tiempo de build (SSG)",{"type":32,"tag":717,"props":731,"children":732},{},[733,735,741],{"type":37,"value":734},"Las páginas bajo ",{"type":32,"tag":52,"props":736,"children":738},{"className":737},[],[739],{"type":37,"value":740},"\u002Fadmin",{"type":37,"value":742}," se ejecutan en modo SPA (renderizado client-side)",{"type":32,"tag":717,"props":744,"children":745},{},[746,748,754],{"type":37,"value":747},"La página ",{"type":32,"tag":52,"props":749,"children":751},{"className":750},[],[752],{"type":37,"value":753},"\u002Fcart",{"type":37,"value":755}," también es client-side — el estado del carrito es local, las solicitudes de API ocurren en el navegador",{"type":32,"tag":717,"props":757,"children":758},{},[759,761,767],{"type":37,"value":760},"Los endpoints ",{"type":32,"tag":52,"props":762,"children":764},{"className":763},[],[765],{"type":37,"value":766},"\u002Fapi",{"type":37,"value":768}," reciben headers CORS (middleware del servidor)",{"type":32,"tag":251,"props":770,"children":772},{"id":771},"isr-incremental-static-regeneration",[773],{"type":37,"value":774},"ISR (Incremental Static Regeneration)",{"type":32,"tag":33,"props":776,"children":777},{},[778,780,786],{"type":37,"value":779},"El ISR en Nuxt 3 aún no es tan maduro como en Next.js, pero puedes lograr un comportamiento similar con la estrategia de cache ",{"type":32,"tag":52,"props":781,"children":783},{"className":782},[],[784],{"type":37,"value":785},"swr",{"type":37,"value":787},":",{"type":32,"tag":69,"props":789,"children":791},{"className":71,"code":790,"language":73,"meta":16,"style":16},"routeRules: {\n  '\u002Fblog\u002F**': { swr: 3600 } \u002F\u002F Cache de 1 hora, luego revalidar\n}\n",[792],{"type":32,"tag":52,"props":793,"children":794},{"__ignoreMap":16},[795,807,835],{"type":32,"tag":79,"props":796,"children":797},{"class":81,"line":82},[798,802],{"type":32,"tag":79,"props":799,"children":800},{"style":97},[801],{"type":37,"value":539},{"type":32,"tag":79,"props":803,"children":804},{"style":103},[805],{"type":37,"value":806},": {\n",{"type":32,"tag":79,"props":808,"children":809},{"class":81,"line":109},[810,815,820,825,830],{"type":32,"tag":79,"props":811,"children":812},{"style":156},[813],{"type":37,"value":814},"  '\u002Fblog\u002F**'",{"type":32,"tag":79,"props":816,"children":817},{"style":103},[818],{"type":37,"value":819},": { swr: ",{"type":32,"tag":79,"props":821,"children":822},{"style":136},[823],{"type":37,"value":824},"3600",{"type":32,"tag":79,"props":826,"children":827},{"style":103},[828],{"type":37,"value":829}," } ",{"type":32,"tag":79,"props":831,"children":832},{"style":282},[833],{"type":37,"value":834},"\u002F\u002F Cache de 1 hora, luego revalidar\n",{"type":32,"tag":79,"props":836,"children":837},{"class":81,"line":118},[838],{"type":32,"tag":79,"props":839,"children":840},{"style":103},[841],{"type":37,"value":842},"}\n",{"type":32,"tag":33,"props":844,"children":845},{},[846,847,853],{"type":37,"value":233},{"type":32,"tag":52,"props":848,"children":850},{"className":849},[],[851],{"type":37,"value":852},"swr: 3600",{"type":37,"value":854}," significa: el primer visitante obtiene HTML estático, el cache expira después de 1 hora, la siguiente solicitud desencadena un nuevo renderizado pero muestra el cache antiguo (stale-while-revalidate). Esto es apropiado para sitios que necesitan frescura las 24\u002F7 pero no quieren reconstruir todas las páginas en cada build. En producción, combinado con cache edge de CDN (Cloudflare, Vercel), TTFB se mantiene por debajo de 50ms.",{"type":32,"tag":40,"props":856,"children":858},{"id":857},"optimización-del-build-renderizado-paralelo-y-chunk-splitting",[859],{"type":37,"value":860},"Optimización del Build: Renderizado Paralelo y Chunk Splitting",{"type":32,"tag":33,"props":862,"children":863},{},[864,866,872],{"type":37,"value":865},"Cuando generas un sitio de 5 mil páginas con ",{"type":32,"tag":52,"props":867,"children":869},{"className":868},[],[870],{"type":37,"value":871},"nuxt generate",{"type":37,"value":873},", con la configuración predeterminada puede tomar 15-20 minutos. Para reducirlo a 5 minutos necesitas renderizado paralelo y chunk splitting.",{"type":32,"tag":69,"props":875,"children":877},{"className":71,"code":876,"language":73,"meta":16,"style":16},"export default defineNuxtConfig({\n  nitro: {\n    prerender: {\n      concurrency: 20, \u002F\u002F Número de workers de renderizado paralelo\n      interval: 100,   \u002F\u002F Retraso entre workers (ms)\n      crawlLinks: false \u002F\u002F Usa inyección de rutas manual\n    }\n  },\n  vite: {\n    build: {\n      rollupOptions: {\n        output: {\n          manualChunks: {\n            'vendor-vue': ['vue', 'vue-router'],\n            'vendor-ui': ['@headlessui\u002Fvue', '@heroicons\u002Fvue']\n          }\n        }\n      }\n    }\n  }\n})\n",[878],{"type":32,"tag":52,"props":879,"children":880},{"__ignoreMap":16},[881,900,907,914,936,959,975,982,990,998,1007,1016,1025,1034,1066,1097,1106,1115,1124,1132,1140],{"type":32,"tag":79,"props":882,"children":883},{"class":81,"line":82},[884,888,892,896],{"type":32,"tag":79,"props":885,"children":886},{"style":86},[887],{"type":37,"value":89},{"type":32,"tag":79,"props":889,"children":890},{"style":86},[891],{"type":37,"value":94},{"type":32,"tag":79,"props":893,"children":894},{"style":97},[895],{"type":37,"value":100},{"type":32,"tag":79,"props":897,"children":898},{"style":103},[899],{"type":37,"value":106},{"type":32,"tag":79,"props":901,"children":902},{"class":81,"line":109},[903],{"type":32,"tag":79,"props":904,"children":905},{"style":103},[906],{"type":37,"value":115},{"type":32,"tag":79,"props":908,"children":909},{"class":81,"line":118},[910],{"type":32,"tag":79,"props":911,"children":912},{"style":103},[913],{"type":37,"value":124},{"type":32,"tag":79,"props":915,"children":916},{"class":81,"line":127},[917,922,927,931],{"type":32,"tag":79,"props":918,"children":919},{"style":103},[920],{"type":37,"value":921},"      concurrency: ",{"type":32,"tag":79,"props":923,"children":924},{"style":136},[925],{"type":37,"value":926},"20",{"type":32,"tag":79,"props":928,"children":929},{"style":103},[930],{"type":37,"value":164},{"type":32,"tag":79,"props":932,"children":933},{"style":282},[934],{"type":37,"value":935},"\u002F\u002F Número de workers de renderizado paralelo\n",{"type":32,"tag":79,"props":937,"children":938},{"class":81,"line":147},[939,944,949,954],{"type":32,"tag":79,"props":940,"children":941},{"style":103},[942],{"type":37,"value":943},"      interval: ",{"type":32,"tag":79,"props":945,"children":946},{"style":136},[947],{"type":37,"value":948},"100",{"type":32,"tag":79,"props":950,"children":951},{"style":103},[952],{"type":37,"value":953},",   ",{"type":32,"tag":79,"props":955,"children":956},{"style":282},[957],{"type":37,"value":958},"\u002F\u002F Retraso entre workers (ms)\n",{"type":32,"tag":79,"props":960,"children":961},{"class":81,"line":177},[962,966,970],{"type":32,"tag":79,"props":963,"children":964},{"style":103},[965],{"type":37,"value":133},{"type":32,"tag":79,"props":967,"children":968},{"style":136},[969],{"type":37,"value":667},{"type":32,"tag":79,"props":971,"children":972},{"style":282},[973],{"type":37,"value":974}," \u002F\u002F Usa inyección de rutas manual\n",{"type":32,"tag":79,"props":976,"children":977},{"class":81,"line":205},[978],{"type":32,"tag":79,"props":979,"children":980},{"style":103},[981],{"type":37,"value":211},{"type":32,"tag":79,"props":983,"children":984},{"class":81,"line":26},[985],{"type":32,"tag":79,"props":986,"children":987},{"style":103},[988],{"type":37,"value":989},"  },\n",{"type":32,"tag":79,"props":991,"children":992},{"class":81,"line":222},[993],{"type":32,"tag":79,"props":994,"children":995},{"style":103},[996],{"type":37,"value":997},"  vite: {\n",{"type":32,"tag":79,"props":999,"children":1001},{"class":81,"line":1000},10,[1002],{"type":32,"tag":79,"props":1003,"children":1004},{"style":103},[1005],{"type":37,"value":1006},"    build: {\n",{"type":32,"tag":79,"props":1008,"children":1010},{"class":81,"line":1009},11,[1011],{"type":32,"tag":79,"props":1012,"children":1013},{"style":103},[1014],{"type":37,"value":1015},"      rollupOptions: {\n",{"type":32,"tag":79,"props":1017,"children":1019},{"class":81,"line":1018},12,[1020],{"type":32,"tag":79,"props":1021,"children":1022},{"style":103},[1023],{"type":37,"value":1024},"        output: {\n",{"type":32,"tag":79,"props":1026,"children":1028},{"class":81,"line":1027},13,[1029],{"type":32,"tag":79,"props":1030,"children":1031},{"style":103},[1032],{"type":37,"value":1033},"          manualChunks: {\n",{"type":32,"tag":79,"props":1035,"children":1037},{"class":81,"line":1036},14,[1038,1043,1048,1053,1057,1062],{"type":32,"tag":79,"props":1039,"children":1040},{"style":156},[1041],{"type":37,"value":1042},"            'vendor-vue'",{"type":32,"tag":79,"props":1044,"children":1045},{"style":103},[1046],{"type":37,"value":1047},": [",{"type":32,"tag":79,"props":1049,"children":1050},{"style":156},[1051],{"type":37,"value":1052},"'vue'",{"type":32,"tag":79,"props":1054,"children":1055},{"style":103},[1056],{"type":37,"value":164},{"type":32,"tag":79,"props":1058,"children":1059},{"style":156},[1060],{"type":37,"value":1061},"'vue-router'",{"type":32,"tag":79,"props":1063,"children":1064},{"style":103},[1065],{"type":37,"value":174},{"type":32,"tag":79,"props":1067,"children":1069},{"class":81,"line":1068},15,[1070,1075,1079,1084,1088,1093],{"type":32,"tag":79,"props":1071,"children":1072},{"style":156},[1073],{"type":37,"value":1074},"            'vendor-ui'",{"type":32,"tag":79,"props":1076,"children":1077},{"style":103},[1078],{"type":37,"value":1047},{"type":32,"tag":79,"props":1080,"children":1081},{"style":156},[1082],{"type":37,"value":1083},"'@headlessui\u002Fvue'",{"type":32,"tag":79,"props":1085,"children":1086},{"style":103},[1087],{"type":37,"value":164},{"type":32,"tag":79,"props":1089,"children":1090},{"style":156},[1091],{"type":37,"value":1092},"'@heroicons\u002Fvue'",{"type":32,"tag":79,"props":1094,"children":1095},{"style":103},[1096],{"type":37,"value":202},{"type":32,"tag":79,"props":1098,"children":1100},{"class":81,"line":1099},16,[1101],{"type":32,"tag":79,"props":1102,"children":1103},{"style":103},[1104],{"type":37,"value":1105},"          }\n",{"type":32,"tag":79,"props":1107,"children":1109},{"class":81,"line":1108},17,[1110],{"type":32,"tag":79,"props":1111,"children":1112},{"style":103},[1113],{"type":37,"value":1114},"        }\n",{"type":32,"tag":79,"props":1116,"children":1118},{"class":81,"line":1117},18,[1119],{"type":32,"tag":79,"props":1120,"children":1121},{"style":103},[1122],{"type":37,"value":1123},"      }\n",{"type":32,"tag":79,"props":1125,"children":1127},{"class":81,"line":1126},19,[1128],{"type":32,"tag":79,"props":1129,"children":1130},{"style":103},[1131],{"type":37,"value":211},{"type":32,"tag":79,"props":1133,"children":1135},{"class":81,"line":1134},20,[1136],{"type":32,"tag":79,"props":1137,"children":1138},{"style":103},[1139],{"type":37,"value":219},{"type":32,"tag":79,"props":1141,"children":1143},{"class":81,"line":1142},21,[1144],{"type":32,"tag":79,"props":1145,"children":1146},{"style":103},[1147],{"type":37,"value":228},{"type":32,"tag":33,"props":1149,"children":1150},{},[1151,1152,1158,1160,1166],{"type":37,"value":233},{"type":32,"tag":52,"props":1153,"children":1155},{"className":1154},[],[1156],{"type":37,"value":1157},"concurrency: 20",{"type":37,"value":1159}," renderiza 20 páginas simultáneamente. Ajusta según el número de cores de CPU — en máquinas de 8 cores, 20 es ideal; en 4 cores, redúcelo a 10. ",{"type":32,"tag":52,"props":1161,"children":1163},{"className":1162},[],[1164],{"type":37,"value":1165},"interval: 100",{"type":37,"value":1167}," previene golpear límites de rate limit de API — si la API de Shopify tiene límite de 2 req\u002Fs, cámbialo a 500ms.",{"type":32,"tag":251,"props":1169,"children":1171},{"id":1170},"pipeline-de-optimización-de-imágenes",[1172],{"type":37,"value":1173},"Pipeline de Optimización de Imágenes",{"type":32,"tag":33,"props":1175,"children":1176},{},[1177],{"type":37,"value":1178},"El módulo Nuxt Image realiza optimización de imágenes en tiempo de build, pero la configuración predeterminada es insuficiente para producción. Generar formatos WebP + AVIF en paralelo duplica el tiempo de build pero reduce FID (First Input Delay) 40ms:",{"type":32,"tag":69,"props":1180,"children":1182},{"className":71,"code":1181,"language":73,"meta":16,"style":16},"export default defineNuxtConfig({\n  image: {\n    provider: 'ipx',\n    ipx: {\n      maxAge: 31536000 \u002F\u002F Cache de 1 año\n    },\n    formats: ['webp', 'avif'],\n    screens: {\n      xs: 320,\n      sm: 640,\n      md: 768,\n      lg: 1024,\n      xl: 1280\n    }\n  }\n})\n",[1183],{"type":32,"tag":52,"props":1184,"children":1185},{"__ignoreMap":16},[1186,1205,1213,1230,1238,1256,1264,1290,1298,1315,1332,1349,1366,1379,1386,1393],{"type":32,"tag":79,"props":1187,"children":1188},{"class":81,"line":82},[1189,1193,1197,1201],{"type":32,"tag":79,"props":1190,"children":1191},{"style":86},[1192],{"type":37,"value":89},{"type":32,"tag":79,"props":1194,"children":1195},{"style":86},[1196],{"type":37,"value":94},{"type":32,"tag":79,"props":1198,"children":1199},{"style":97},[1200],{"type":37,"value":100},{"type":32,"tag":79,"props":1202,"children":1203},{"style":103},[1204],{"type":37,"value":106},{"type":32,"tag":79,"props":1206,"children":1207},{"class":81,"line":109},[1208],{"type":32,"tag":79,"props":1209,"children":1210},{"style":103},[1211],{"type":37,"value":1212},"  image: {\n",{"type":32,"tag":79,"props":1214,"children":1215},{"class":81,"line":118},[1216,1221,1226],{"type":32,"tag":79,"props":1217,"children":1218},{"style":103},[1219],{"type":37,"value":1220},"    provider: ",{"type":32,"tag":79,"props":1222,"children":1223},{"style":156},[1224],{"type":37,"value":1225},"'ipx'",{"type":32,"tag":79,"props":1227,"children":1228},{"style":103},[1229],{"type":37,"value":144},{"type":32,"tag":79,"props":1231,"children":1232},{"class":81,"line":127},[1233],{"type":32,"tag":79,"props":1234,"children":1235},{"style":103},[1236],{"type":37,"value":1237},"    ipx: {\n",{"type":32,"tag":79,"props":1239,"children":1240},{"class":81,"line":147},[1241,1246,1251],{"type":32,"tag":79,"props":1242,"children":1243},{"style":103},[1244],{"type":37,"value":1245},"      maxAge: ",{"type":32,"tag":79,"props":1247,"children":1248},{"style":136},[1249],{"type":37,"value":1250},"31536000",{"type":32,"tag":79,"props":1252,"children":1253},{"style":282},[1254],{"type":37,"value":1255}," \u002F\u002F Cache de 1 año\n",{"type":32,"tag":79,"props":1257,"children":1258},{"class":81,"line":177},[1259],{"type":32,"tag":79,"props":1260,"children":1261},{"style":103},[1262],{"type":37,"value":1263},"    },\n",{"type":32,"tag":79,"props":1265,"children":1266},{"class":81,"line":205},[1267,1272,1277,1281,1286],{"type":32,"tag":79,"props":1268,"children":1269},{"style":103},[1270],{"type":37,"value":1271},"    formats: [",{"type":32,"tag":79,"props":1273,"children":1274},{"style":156},[1275],{"type":37,"value":1276},"'webp'",{"type":32,"tag":79,"props":1278,"children":1279},{"style":103},[1280],{"type":37,"value":164},{"type":32,"tag":79,"props":1282,"children":1283},{"style":156},[1284],{"type":37,"value":1285},"'avif'",{"type":32,"tag":79,"props":1287,"children":1288},{"style":103},[1289],{"type":37,"value":174},{"type":32,"tag":79,"props":1291,"children":1292},{"class":81,"line":26},[1293],{"type":32,"tag":79,"props":1294,"children":1295},{"style":103},[1296],{"type":37,"value":1297},"    screens: {\n",{"type":32,"tag":79,"props":1299,"children":1300},{"class":81,"line":222},[1301,1306,1311],{"type":32,"tag":79,"props":1302,"children":1303},{"style":103},[1304],{"type":37,"value":1305},"      xs: ",{"type":32,"tag":79,"props":1307,"children":1308},{"style":136},[1309],{"type":37,"value":1310},"320",{"type":32,"tag":79,"props":1312,"children":1313},{"style":103},[1314],{"type":37,"value":144},{"type":32,"tag":79,"props":1316,"children":1317},{"class":81,"line":1000},[1318,1323,1328],{"type":32,"tag":79,"props":1319,"children":1320},{"style":103},[1321],{"type":37,"value":1322},"      sm: ",{"type":32,"tag":79,"props":1324,"children":1325},{"style":136},[1326],{"type":37,"value":1327},"640",{"type":32,"tag":79,"props":1329,"children":1330},{"style":103},[1331],{"type":37,"value":144},{"type":32,"tag":79,"props":1333,"children":1334},{"class":81,"line":1009},[1335,1340,1345],{"type":32,"tag":79,"props":1336,"children":1337},{"style":103},[1338],{"type":37,"value":1339},"      md: ",{"type":32,"tag":79,"props":1341,"children":1342},{"style":136},[1343],{"type":37,"value":1344},"768",{"type":32,"tag":79,"props":1346,"children":1347},{"style":103},[1348],{"type":37,"value":144},{"type":32,"tag":79,"props":1350,"children":1351},{"class":81,"line":1018},[1352,1357,1362],{"type":32,"tag":79,"props":1353,"children":1354},{"style":103},[1355],{"type":37,"value":1356},"      lg: ",{"type":32,"tag":79,"props":1358,"children":1359},{"style":136},[1360],{"type":37,"value":1361},"1024",{"type":32,"tag":79,"props":1363,"children":1364},{"style":103},[1365],{"type":37,"value":144},{"type":32,"tag":79,"props":1367,"children":1368},{"class":81,"line":1027},[1369,1374],{"type":32,"tag":79,"props":1370,"children":1371},{"style":103},[1372],{"type":37,"value":1373},"      xl: ",{"type":32,"tag":79,"props":1375,"children":1376},{"style":136},[1377],{"type":37,"value":1378},"1280\n",{"type":32,"tag":79,"props":1380,"children":1381},{"class":81,"line":1036},[1382],{"type":32,"tag":79,"props":1383,"children":1384},{"style":103},[1385],{"type":37,"value":211},{"type":32,"tag":79,"props":1387,"children":1388},{"class":81,"line":1068},[1389],{"type":32,"tag":79,"props":1390,"children":1391},{"style":103},[1392],{"type":37,"value":219},{"type":32,"tag":79,"props":1394,"children":1395},{"class":81,"line":1099},[1396],{"type":32,"tag":79,"props":1397,"children":1398},{"style":103},[1399],{"type":37,"value":228},{"type":32,"tag":33,"props":1401,"children":1402},{},[1403],{"type":37,"value":1404},"Esta configuración genera imágenes responsivas — cada imagen en 5 breakpoints × 2 formatos = 10 archivos. En un sitio con 1000 imágenes, el tiempo de build aumenta ~3 minutos pero LCP (Largest Contentful Paint) desciende de 2.5s a 1.2s. El tradeoff es positivo: tiempo de build aceptable, experiencia del usuario crítica.",{"type":32,"tag":40,"props":1406,"children":1408},{"id":1407},"deployment-en-producción-caching-en-edge-de-cdn",[1409],{"type":37,"value":1410},"Deployment en Producción: Caching en Edge de CDN",{"type":32,"tag":33,"props":1412,"children":1413},{},[1414,1416,1421],{"type":37,"value":1415},"Después de escribir el build SSG en el directorio ",{"type":32,"tag":52,"props":1417,"children":1419},{"className":1418},[],[1420],{"type":37,"value":520},{"type":37,"value":1422},", la estrategia de deployment es importante. Plataformas como Cloudflare Pages, Vercel y Netlify hacen caching en edge, pero necesitas configuración manual de headers de cache:",{"type":32,"tag":69,"props":1424,"children":1426},{"className":71,"code":1425,"language":73,"meta":16,"style":16},"\u002F\u002F server\u002Fmiddleware\u002Fcache-headers.ts\nexport default defineEventHandler((event) => {\n  const url = event.node.req.url\n  \n  if (url?.startsWith('\u002Fproducts\u002F')) {\n    setResponseHeaders(event, {\n      'Cache-Control': 'public, max-age=3600, s-maxage=86400, stale-while-revalidate=604800'\n    })\n  }\n  \n  if (url?.startsWith('\u002F_nuxt\u002F')) {\n    setResponseHeaders(event, {\n      'Cache-Control': 'public, max-age=31536000, immutable'\n    })\n  }\n})\n",[1427],{"type":32,"tag":52,"props":1428,"children":1429},{"__ignoreMap":16},[1430,1438,1475,1497,1505,1537,1550,1568,1575,1582,1589,1617,1628,1644,1651,1658],{"type":32,"tag":79,"props":1431,"children":1432},{"class":81,"line":82},[1433],{"type":32,"tag":79,"props":1434,"children":1435},{"style":282},[1436],{"type":37,"value":1437},"\u002F\u002F server\u002Fmiddleware\u002Fcache-headers.ts\n",{"type":32,"tag":79,"props":1439,"children":1440},{"class":81,"line":109},[1441,1445,1449,1454,1458,1463,1467,1471],{"type":32,"tag":79,"props":1442,"children":1443},{"style":86},[1444],{"type":37,"value":89},{"type":32,"tag":79,"props":1446,"children":1447},{"style":86},[1448],{"type":37,"value":94},{"type":32,"tag":79,"props":1450,"children":1451},{"style":97},[1452],{"type":37,"value":1453}," defineEventHandler",{"type":32,"tag":79,"props":1455,"children":1456},{"style":103},[1457],{"type":37,"value":306},{"type":32,"tag":79,"props":1459,"children":1460},{"style":309},[1461],{"type":37,"value":1462},"event",{"type":32,"tag":79,"props":1464,"children":1465},{"style":103},[1466],{"type":37,"value":317},{"type":32,"tag":79,"props":1468,"children":1469},{"style":86},[1470],{"type":37,"value":322},{"type":32,"tag":79,"props":1472,"children":1473},{"style":103},[1474],{"type":37,"value":327},{"type":32,"tag":79,"props":1476,"children":1477},{"class":81,"line":118},[1478,1483,1488,1492],{"type":32,"tag":79,"props":1479,"children":1480},{"style":86},[1481],{"type":37,"value":1482},"  const",{"type":32,"tag":79,"props":1484,"children":1485},{"style":136},[1486],{"type":37,"value":1487}," url",{"type":32,"tag":79,"props":1489,"children":1490},{"style":86},[1491],{"type":37,"value":399},{"type":32,"tag":79,"props":1493,"children":1494},{"style":103},[1495],{"type":37,"value":1496}," event.node.req.url\n",{"type":32,"tag":79,"props":1498,"children":1499},{"class":81,"line":127},[1500],{"type":32,"tag":79,"props":1501,"children":1502},{"style":103},[1503],{"type":37,"value":1504},"  \n",{"type":32,"tag":79,"props":1506,"children":1507},{"class":81,"line":147},[1508,1513,1518,1523,1527,1532],{"type":32,"tag":79,"props":1509,"children":1510},{"style":86},[1511],{"type":37,"value":1512},"  if",{"type":32,"tag":79,"props":1514,"children":1515},{"style":103},[1516],{"type":37,"value":1517}," (url?.",{"type":32,"tag":79,"props":1519,"children":1520},{"style":97},[1521],{"type":37,"value":1522},"startsWith",{"type":32,"tag":79,"props":1524,"children":1525},{"style":103},[1526],{"type":37,"value":345},{"type":32,"tag":79,"props":1528,"children":1529},{"style":156},[1530],{"type":37,"value":1531},"'\u002Fproducts\u002F'",{"type":32,"tag":79,"props":1533,"children":1534},{"style":103},[1535],{"type":37,"value":1536},")) {\n",{"type":32,"tag":79,"props":1538,"children":1539},{"class":81,"line":177},[1540,1545],{"type":32,"tag":79,"props":1541,"children":1542},{"style":97},[1543],{"type":37,"value":1544},"    setResponseHeaders",{"type":32,"tag":79,"props":1546,"children":1547},{"style":103},[1548],{"type":37,"value":1549},"(event, {\n",{"type":32,"tag":79,"props":1551,"children":1552},{"class":81,"line":205},[1553,1558,1563],{"type":32,"tag":79,"props":1554,"children":1555},{"style":156},[1556],{"type":37,"value":1557},"      'Cache-Control'",{"type":32,"tag":79,"props":1559,"children":1560},{"style":103},[1561],{"type":37,"value":1562},": ",{"type":32,"tag":79,"props":1564,"children":1565},{"style":156},[1566],{"type":37,"value":1567},"'public, max-age=3600, s-maxage=86400, stale-while-revalidate=604800'\n",{"type":32,"tag":79,"props":1569,"children":1570},{"class":81,"line":26},[1571],{"type":32,"tag":79,"props":1572,"children":1573},{"style":103},[1574],{"type":37,"value":494},{"type":32,"tag":79,"props":1576,"children":1577},{"class":81,"line":222},[1578],{"type":32,"tag":79,"props":1579,"children":1580},{"style":103},[1581],{"type":37,"value":219},{"type":32,"tag":79,"props":1583,"children":1584},{"class":81,"line":1000},[1585],{"type":32,"tag":79,"props":1586,"children":1587},{"style":103},[1588],{"type":37,"value":1504},{"type":32,"tag":79,"props":1590,"children":1591},{"class":81,"line":1009},[1592,1596,1600,1604,1608,1613],{"type":32,"tag":79,"props":1593,"children":1594},{"style":86},[1595],{"type":37,"value":1512},{"type":32,"tag":79,"props":1597,"children":1598},{"style":103},[1599],{"type":37,"value":1517},{"type":32,"tag":79,"props":1601,"children":1602},{"style":97},[1603],{"type":37,"value":1522},{"type":32,"tag":79,"props":1605,"children":1606},{"style":103},[1607],{"type":37,"value":345},{"type":32,"tag":79,"props":1609,"children":1610},{"style":156},[1611],{"type":37,"value":1612},"'\u002F_nuxt\u002F'",{"type":32,"tag":79,"props":1614,"children":1615},{"style":103},[1616],{"type":37,"value":1536},{"type":32,"tag":79,"props":1618,"children":1619},{"class":81,"line":1018},[1620,1624],{"type":32,"tag":79,"props":1621,"children":1622},{"style":97},[1623],{"type":37,"value":1544},{"type":32,"tag":79,"props":1625,"children":1626},{"style":103},[1627],{"type":37,"value":1549},{"type":32,"tag":79,"props":1629,"children":1630},{"class":81,"line":1027},[1631,1635,1639],{"type":32,"tag":79,"props":1632,"children":1633},{"style":156},[1634],{"type":37,"value":1557},{"type":32,"tag":79,"props":1636,"children":1637},{"style":103},[1638],{"type":37,"value":1562},{"type":32,"tag":79,"props":1640,"children":1641},{"style":156},[1642],{"type":37,"value":1643},"'public, max-age=31536000, immutable'\n",{"type":32,"tag":79,"props":1645,"children":1646},{"class":81,"line":1036},[1647],{"type":32,"tag":79,"props":1648,"children":1649},{"style":103},[1650],{"type":37,"value":494},{"type":32,"tag":79,"props":1652,"children":1653},{"class":81,"line":1068},[1654],{"type":32,"tag":79,"props":1655,"children":1656},{"style":103},[1657],{"type":37,"value":219},{"type":32,"tag":79,"props":1659,"children":1660},{"class":81,"line":1099},[1661],{"type":32,"tag":79,"props":1662,"children":1663},{"style":103},[1664],{"type":37,"value":228},{"type":32,"tag":33,"props":1666,"children":1667},{},[1668],{"type":37,"value":1669},"Este middleware hace lo siguiente:",{"type":32,"tag":713,"props":1671,"children":1672},{},[1673,1685],{"type":32,"tag":717,"props":1674,"children":1675},{},[1676,1678,1683],{"type":37,"value":1677},"Las rutas ",{"type":32,"tag":52,"props":1679,"children":1681},{"className":1680},[],[1682],{"type":37,"value":727},{"type":37,"value":1684}," se cachean 1 hora en el navegador, 1 día en CDN, 1 semana como cache antiguo",{"type":32,"tag":717,"props":1686,"children":1687},{},[1688,1690,1696],{"type":37,"value":1689},"Los assets estáticos ",{"type":32,"tag":52,"props":1691,"children":1693},{"className":1692},[],[1694],{"type":37,"value":1695},"\u002F_nuxt\u002F*",{"type":37,"value":1697}," (JS, CSS) se cachean 1 año como immutable — mientras el hash de build no cambie, no hay re-fetch",{"type":32,"tag":33,"props":1699,"children":1700},{},[1701],{"type":37,"value":1702},"Verificamos con datos de Cloudflare Analytics: la tasa de cache hit sube de 92% a 98%, TTFB promedio desciende de 180ms a 25ms. Sin caching en edge, SSG carece de sentido — aunque el HTML sea estático, la latencia de red destruye el rendimiento.",{"type":32,"tag":40,"props":1704,"children":1706},{"id":1705},"escenarios-de-error-y-fallback",[1707],{"type":37,"value":1708},"Escenarios de Error y Fallback",{"type":32,"tag":33,"props":1710,"children":1711},{},[1712,1714,1720],{"type":37,"value":1713},"Si una ruta falla durante prerender (timeout de API, 404), el build lanza un error. En producción, necesitas un mecanismo de fallback en el hook ",{"type":32,"tag":52,"props":1715,"children":1717},{"className":1716},[],[1718],{"type":37,"value":1719},"onPrerender",{"type":37,"value":787},{"type":32,"tag":69,"props":1722,"children":1724},{"className":71,"code":1723,"language":73,"meta":16,"style":16},"nitroApp.hooks.hook('prerender:route', (route) => {\n  if (route.error) {\n    console.warn(`Failed to prerender: ${route.route}`)\n    route.skip = true \u002F\u002F Omite esta ruta, no detengas el build\n  }\n})\n",[1725],{"type":32,"tag":52,"props":1726,"children":1727},{"__ignoreMap":16},[1728,1771,1783,1826,1849,1856],{"type":32,"tag":79,"props":1729,"children":1730},{"class":81,"line":82},[1731,1736,1740,1744,1749,1754,1759,1763,1767],{"type":32,"tag":79,"props":1732,"children":1733},{"style":103},[1734],{"type":37,"value":1735},"nitroApp.hooks.",{"type":32,"tag":79,"props":1737,"children":1738},{"style":97},[1739],{"type":37,"value":340},{"type":32,"tag":79,"props":1741,"children":1742},{"style":103},[1743],{"type":37,"value":345},{"type":32,"tag":79,"props":1745,"children":1746},{"style":156},[1747],{"type":37,"value":1748},"'prerender:route'",{"type":32,"tag":79,"props":1750,"children":1751},{"style":103},[1752],{"type":37,"value":1753},", (",{"type":32,"tag":79,"props":1755,"children":1756},{"style":309},[1757],{"type":37,"value":1758},"route",{"type":32,"tag":79,"props":1760,"children":1761},{"style":103},[1762],{"type":37,"value":317},{"type":32,"tag":79,"props":1764,"children":1765},{"style":86},[1766],{"type":37,"value":322},{"type":32,"tag":79,"props":1768,"children":1769},{"style":103},[1770],{"type":37,"value":327},{"type":32,"tag":79,"props":1772,"children":1773},{"class":81,"line":109},[1774,1778],{"type":32,"tag":79,"props":1775,"children":1776},{"style":86},[1777],{"type":37,"value":1512},{"type":32,"tag":79,"props":1779,"children":1780},{"style":103},[1781],{"type":37,"value":1782}," (route.error) {\n",{"type":32,"tag":79,"props":1784,"children":1785},{"class":81,"line":118},[1786,1791,1796,1800,1805,1809,1814,1818,1822],{"type":32,"tag":79,"props":1787,"children":1788},{"style":103},[1789],{"type":37,"value":1790},"    console.",{"type":32,"tag":79,"props":1792,"children":1793},{"style":97},[1794],{"type":37,"value":1795},"warn",{"type":32,"tag":79,"props":1797,"children":1798},{"style":103},[1799],{"type":37,"value":345},{"type":32,"tag":79,"props":1801,"children":1802},{"style":156},[1803],{"type":37,"value":1804},"`Failed to prerender: ${",{"type":32,"tag":79,"props":1806,"children":1807},{"style":103},[1808],{"type":37,"value":1758},{"type":32,"tag":79,"props":1810,"children":1811},{"style":156},[1812],{"type":37,"value":1813},".",{"type":32,"tag":79,"props":1815,"children":1816},{"style":103},[1817],{"type":37,"value":1758},{"type":32,"tag":79,"props":1819,"children":1820},{"style":156},[1821],{"type":37,"value":481},{"type":32,"tag":79,"props":1823,"children":1824},{"style":103},[1825],{"type":37,"value":486},{"type":32,"tag":79,"props":1827,"children":1828},{"class":81,"line":127},[1829,1834,1839,1844],{"type":32,"tag":79,"props":1830,"children":1831},{"style":103},[1832],{"type":37,"value":1833},"    route.skip ",{"type":32,"tag":79,"props":1835,"children":1836},{"style":86},[1837],{"type":37,"value":1838},"=",{"type":32,"tag":79,"props":1840,"children":1841},{"style":136},[1842],{"type":37,"value":1843}," true",{"type":32,"tag":79,"props":1845,"children":1846},{"style":282},[1847],{"type":37,"value":1848}," \u002F\u002F Omite esta ruta, no detengas el build\n",{"type":32,"tag":79,"props":1850,"children":1851},{"class":81,"line":147},[1852],{"type":32,"tag":79,"props":1853,"children":1854},{"style":103},[1855],{"type":37,"value":219},{"type":32,"tag":79,"props":1857,"children":1858},{"class":81,"line":177},[1859],{"type":32,"tag":79,"props":1860,"children":1861},{"style":103},[1862],{"type":37,"value":228},{"type":32,"tag":33,"props":1864,"children":1865},{},[1866,1868,1873],{"type":37,"value":1867},"Este patrón previene que el build completo falle si 50 de 10 mil rutas fallan. Muestras una página de fallback para rutas fallidas (404 o página de producto genérica). Alternativa: cambia rutas fallidas a SSR — renderízalas en runtime con ",{"type":32,"tag":52,"props":1869,"children":1871},{"className":1870},[],[1872],{"type":37,"value":539},{"type":37,"value":1813},{"type":32,"tag":33,"props":1875,"children":1876},{},[1877],{"type":37,"value":1878},"La arquitectura SSG de Nuxt 3 ofrece flexibilidad, pero sin configuración correcta el tiempo de build y rendimiento en runtime se vuelven problemáticos. La combinación de renderizado híbrido con route rules, prerendering paralelo, estrategia de cache de CDN y mecanismos de fallback produce resultados listos para producción. Puedes generar un sitio de comercio electrónico de 5 mil páginas en 5 minutos y servirlo con 25ms TTFB — lo único que necesitas es saber qué gancho de Nitro tocar.",{"type":32,"tag":1880,"props":1881,"children":1882},"style",{},[1883],{"type":37,"value":1884},"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":118,"depth":118,"links":1886},[1887,1890,1893,1896,1897],{"id":42,"depth":109,"text":45,"children":1888},[1889],{"id":253,"depth":118,"text":256},{"id":525,"depth":109,"text":528,"children":1891},[1892],{"id":771,"depth":118,"text":774},{"id":857,"depth":109,"text":860,"children":1894},[1895],{"id":1170,"depth":118,"text":1173},{"id":1407,"depth":109,"text":1410},{"id":1705,"depth":109,"text":1708},"markdown","content:es:tech:estrategias-prerender-ssg-nuxt-3.md","content","es\u002Ftech\u002Festrategias-prerender-ssg-nuxt-3.md","es\u002Ftech\u002Festrategias-prerender-ssg-nuxt-3","md",1786860286844]