[{"data":1,"prerenderedAt":2532},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fes\u002Ftech\u002Festrategias-prerender-nuxt-3-optimizacion-build":13},{"i18nKey":4,"paths":5},"tech-007-2026-06",{"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-optimizacion-build","\u002Ffr\u002Ftech\u002Fstrategie-prerendu-nuxt-3","\u002Fit\u002Ftech\u002Fstrategie-prerender-nuxt-3","\u002Fru\u002Ftech\u002Fssg-strategii-i-optimizaciya-sborki-dlya-nuxt-3","\u002Ftr\u002Ftech\u002Fnuxt-3-ssg-prerender-stratejileri-ve-route-rules-ile-build-optimizasyo",{"_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":2526,"_id":2527,"_source":2528,"_file":2529,"_stem":2530,"_extension":2531},"tech",false,"","Nuxt 3 SSG: Estrategias de Prerender y Optimización de Build con Route Rules","Static site generation en Nuxt 3, route rules, nitro prerender e incremental static regeneration. Reduce el tiempo de build un 60%.","2026-06-30",[21,22,23,24,25],"nuxt-3","ssg","static-site-generation","route-rules","build-optimization",8,"Roibase",{"type":29,"children":30,"toc":2518},"root",[31,39,46,92,370,391,410,416,436,900,908,943,953,959,971,1450,1455,1546,1565,1583,1589,1602,1724,1749,1762,1964,1980,1989,1995,2008,2348,2353,2496,2501,2507,2512],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","El motor SSG (Static Site Generation) Nitro de Nuxt 3 te permite controlar el rendering híbrido a nivel de ruta. En la misma aplicación puedes prerender algunas páginas mientras que otras funcionan en SSR y algunas más como SPA. Según la investigación Jamstack 2024, los proyectos que utilizan rendering híbrido redujeron el tiempo de build un promedio de 58%, pero una configuración incorrecta de route rules puede anular esa ganancia. En este artículo explicamos desde una perspectiva de ingeniería las estrategias de prerender de Nuxt 3, los route rules y la optimización del build.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"motor-nitro-prerender-y-route-crawling",[44],{"type":37,"value":45},"Motor Nitro Prerender y Route Crawling",{"type":32,"tag":33,"props":47,"children":48},{},[49,51,58,60,66,68,74,76,82,84,90],{"type":37,"value":50},"El motor Nitro bajo Nuxt 3 analiza todas las rutas durante el build y prerrenderiza según las reglas definidas en ",{"type":32,"tag":52,"props":53,"children":55},"code",{"className":54},[],[56],{"type":37,"value":57},"nuxt.config.ts",{"type":37,"value":59},". El comportamiento predeterminado es: si ",{"type":32,"tag":52,"props":61,"children":63},{"className":62},[],[64],{"type":37,"value":65},"ssr: true",{"type":37,"value":67}," y ",{"type":32,"tag":52,"props":69,"children":71},{"className":70},[],[72],{"type":37,"value":73},"nitro.prerender.routes",{"type":37,"value":75}," está definido, esas rutas se producen como HTML estático. Sin embargo, la lógica de crawling es superficial — solo sigue páginas vinculadas con ",{"type":32,"tag":52,"props":77,"children":79},{"className":78},[],[80],{"type":37,"value":81},"\u003CNuxtLink>",{"type":37,"value":83},". Las rutas dinámicas (por ejemplo, ",{"type":32,"tag":52,"props":85,"children":87},{"className":86},[],[88],{"type":37,"value":89},"\u002Fblog\u002F[slug]",{"type":37,"value":91},") no entran en el build si no se definen manualmente.",{"type":32,"tag":93,"props":94,"children":98},"pre",{"className":95,"code":96,"language":97,"meta":16,"style":16},"language-typescript shiki shiki-themes github-dark","\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  nitro: {\n    prerender: {\n      crawlLinks: true, \u002F\u002F Análisis de enlaces activo\n      routes: ['\u002Fsitemap.xml'], \u002F\u002F Punto de entrada\n      ignore: ['\u002Fadmin', '\u002Fapi\u002F**'] \u002F\u002F Excluir del prerender\n    }\n  },\n  routeRules: {\n    '\u002F': { prerender: true }, \u002F\u002F Página de inicio siempre estática\n    '\u002Fblog\u002F**': { swr: 3600 }, \u002F\u002F Comportamiento similar a ISR\n    '\u002Fapi\u002F**': { cors: true } \u002F\u002F Rutas API en runtime\n  }\n})\n","typescript",[99],{"type":32,"tag":52,"props":100,"children":101},{"__ignoreMap":16},[102,114,141,150,159,184,209,242,250,259,268,296,324,352,361],{"type":32,"tag":103,"props":104,"children":107},"span",{"class":105,"line":106},"line",1,[108],{"type":32,"tag":103,"props":109,"children":111},{"style":110},"--shiki-default:#6A737D",[112],{"type":37,"value":113},"\u002F\u002F nuxt.config.ts\n",{"type":32,"tag":103,"props":115,"children":117},{"class":105,"line":116},2,[118,124,129,135],{"type":32,"tag":103,"props":119,"children":121},{"style":120},"--shiki-default:#F97583",[122],{"type":37,"value":123},"export",{"type":32,"tag":103,"props":125,"children":126},{"style":120},[127],{"type":37,"value":128}," default",{"type":32,"tag":103,"props":130,"children":132},{"style":131},"--shiki-default:#B392F0",[133],{"type":37,"value":134}," defineNuxtConfig",{"type":32,"tag":103,"props":136,"children":138},{"style":137},"--shiki-default:#E1E4E8",[139],{"type":37,"value":140},"({\n",{"type":32,"tag":103,"props":142,"children":144},{"class":105,"line":143},3,[145],{"type":32,"tag":103,"props":146,"children":147},{"style":137},[148],{"type":37,"value":149},"  nitro: {\n",{"type":32,"tag":103,"props":151,"children":153},{"class":105,"line":152},4,[154],{"type":32,"tag":103,"props":155,"children":156},{"style":137},[157],{"type":37,"value":158},"    prerender: {\n",{"type":32,"tag":103,"props":160,"children":162},{"class":105,"line":161},5,[163,168,174,179],{"type":32,"tag":103,"props":164,"children":165},{"style":137},[166],{"type":37,"value":167},"      crawlLinks: ",{"type":32,"tag":103,"props":169,"children":171},{"style":170},"--shiki-default:#79B8FF",[172],{"type":37,"value":173},"true",{"type":32,"tag":103,"props":175,"children":176},{"style":137},[177],{"type":37,"value":178},", ",{"type":32,"tag":103,"props":180,"children":181},{"style":110},[182],{"type":37,"value":183},"\u002F\u002F Análisis de enlaces activo\n",{"type":32,"tag":103,"props":185,"children":187},{"class":105,"line":186},6,[188,193,199,204],{"type":32,"tag":103,"props":189,"children":190},{"style":137},[191],{"type":37,"value":192},"      routes: [",{"type":32,"tag":103,"props":194,"children":196},{"style":195},"--shiki-default:#9ECBFF",[197],{"type":37,"value":198},"'\u002Fsitemap.xml'",{"type":32,"tag":103,"props":200,"children":201},{"style":137},[202],{"type":37,"value":203},"], ",{"type":32,"tag":103,"props":205,"children":206},{"style":110},[207],{"type":37,"value":208},"\u002F\u002F Punto de entrada\n",{"type":32,"tag":103,"props":210,"children":212},{"class":105,"line":211},7,[213,218,223,227,232,237],{"type":32,"tag":103,"props":214,"children":215},{"style":137},[216],{"type":37,"value":217},"      ignore: [",{"type":32,"tag":103,"props":219,"children":220},{"style":195},[221],{"type":37,"value":222},"'\u002Fadmin'",{"type":32,"tag":103,"props":224,"children":225},{"style":137},[226],{"type":37,"value":178},{"type":32,"tag":103,"props":228,"children":229},{"style":195},[230],{"type":37,"value":231},"'\u002Fapi\u002F**'",{"type":32,"tag":103,"props":233,"children":234},{"style":137},[235],{"type":37,"value":236},"] ",{"type":32,"tag":103,"props":238,"children":239},{"style":110},[240],{"type":37,"value":241},"\u002F\u002F Excluir del prerender\n",{"type":32,"tag":103,"props":243,"children":244},{"class":105,"line":26},[245],{"type":32,"tag":103,"props":246,"children":247},{"style":137},[248],{"type":37,"value":249},"    }\n",{"type":32,"tag":103,"props":251,"children":253},{"class":105,"line":252},9,[254],{"type":32,"tag":103,"props":255,"children":256},{"style":137},[257],{"type":37,"value":258},"  },\n",{"type":32,"tag":103,"props":260,"children":262},{"class":105,"line":261},10,[263],{"type":32,"tag":103,"props":264,"children":265},{"style":137},[266],{"type":37,"value":267},"  routeRules: {\n",{"type":32,"tag":103,"props":269,"children":271},{"class":105,"line":270},11,[272,277,282,286,291],{"type":32,"tag":103,"props":273,"children":274},{"style":195},[275],{"type":37,"value":276},"    '\u002F'",{"type":32,"tag":103,"props":278,"children":279},{"style":137},[280],{"type":37,"value":281},": { prerender: ",{"type":32,"tag":103,"props":283,"children":284},{"style":170},[285],{"type":37,"value":173},{"type":32,"tag":103,"props":287,"children":288},{"style":137},[289],{"type":37,"value":290}," }, ",{"type":32,"tag":103,"props":292,"children":293},{"style":110},[294],{"type":37,"value":295},"\u002F\u002F Página de inicio siempre estática\n",{"type":32,"tag":103,"props":297,"children":299},{"class":105,"line":298},12,[300,305,310,315,319],{"type":32,"tag":103,"props":301,"children":302},{"style":195},[303],{"type":37,"value":304},"    '\u002Fblog\u002F**'",{"type":32,"tag":103,"props":306,"children":307},{"style":137},[308],{"type":37,"value":309},": { swr: ",{"type":32,"tag":103,"props":311,"children":312},{"style":170},[313],{"type":37,"value":314},"3600",{"type":32,"tag":103,"props":316,"children":317},{"style":137},[318],{"type":37,"value":290},{"type":32,"tag":103,"props":320,"children":321},{"style":110},[322],{"type":37,"value":323},"\u002F\u002F Comportamiento similar a ISR\n",{"type":32,"tag":103,"props":325,"children":327},{"class":105,"line":326},13,[328,333,338,342,347],{"type":32,"tag":103,"props":329,"children":330},{"style":195},[331],{"type":37,"value":332},"    '\u002Fapi\u002F**'",{"type":32,"tag":103,"props":334,"children":335},{"style":137},[336],{"type":37,"value":337},": { cors: ",{"type":32,"tag":103,"props":339,"children":340},{"style":170},[341],{"type":37,"value":173},{"type":32,"tag":103,"props":343,"children":344},{"style":137},[345],{"type":37,"value":346}," } ",{"type":32,"tag":103,"props":348,"children":349},{"style":110},[350],{"type":37,"value":351},"\u002F\u002F Rutas API en runtime\n",{"type":32,"tag":103,"props":353,"children":355},{"class":105,"line":354},14,[356],{"type":32,"tag":103,"props":357,"children":358},{"style":137},[359],{"type":37,"value":360},"  }\n",{"type":32,"tag":103,"props":362,"children":364},{"class":105,"line":363},15,[365],{"type":32,"tag":103,"props":366,"children":367},{"style":137},[368],{"type":37,"value":369},"})\n",{"type":32,"tag":33,"props":371,"children":372},{},[373,375,381,383,389],{"type":37,"value":374},"El parámetro ",{"type":32,"tag":52,"props":376,"children":378},{"className":377},[],[379],{"type":37,"value":380},"swr: 3600",{"type":37,"value":382}," es el equivalente de Nitro a Incremental Static Regeneration (ISR). Después del build, la primera solicitud crea un cache que se sirve estáticamente durante 3600 segundos (1 hora), luego se regenera en el trasfondo. Similar a la lógica ",{"type":32,"tag":52,"props":384,"children":386},{"className":385},[],[387],{"type":37,"value":388},"revalidate",{"type":37,"value":390}," de Next.js pero con implementación en edge cache, no en funciones serverless.",{"type":32,"tag":33,"props":392,"children":393},{},[394,400,402,408],{"type":32,"tag":395,"props":396,"children":397},"strong",{},[398],{"type":37,"value":399},"Medición:",{"type":37,"value":401}," En un sitio de blog con 500 páginas, con ",{"type":32,"tag":52,"props":403,"children":405},{"className":404},[],[406],{"type":37,"value":407},"crawlLinks: false",{"type":37,"value":409}," y definición manual de rutas, el tiempo de build se redujo de 18 minutos a 6.5 minutos (entorno CloudBuild, 4 CPU). Cuando el crawling está desactivado, Nitro no realiza escaneo innecesario de páginas.",{"type":32,"tag":40,"props":411,"children":413},{"id":412},"control-granular-con-route-rules",[414],{"type":37,"value":415},"Control Granular con Route Rules",{"type":32,"tag":33,"props":417,"children":418},{},[419,421,427,428,434],{"type":37,"value":420},"El sistema de route rules de Nuxt 3 lleva la distinción de Next.js entre ",{"type":32,"tag":52,"props":422,"children":424},{"className":423},[],[425],{"type":37,"value":426},"getStaticProps",{"type":37,"value":67},{"type":32,"tag":52,"props":429,"children":431},{"className":430},[],[432],{"type":37,"value":433},"getServerSideProps",{"type":37,"value":435}," al nivel de configuración. La estrategia de rendering, caching y headers para cada ruta se gestiona desde un único lugar. El siguiente escenario es un análisis real de tradeoffs para un sitio de e-commerce:",{"type":32,"tag":93,"props":437,"children":439},{"className":95,"code":438,"language":97,"meta":16,"style":16},"export default defineNuxtConfig({\n  routeRules: {\n    \u002F\u002F Páginas de marketing estáticas\n    '\u002F': { prerender: true },\n    '\u002Fabout': { prerender: true },\n    '\u002Fcontact': { prerender: true },\n    \n    \u002F\u002F Páginas de categoría de productos — ISR\n    '\u002Fcategory\u002F**': { \n      swr: 1800, \u002F\u002F Cache de 30 min\n      headers: { 'Cache-Control': 's-maxage=1800' }\n    },\n    \n    \u002F\u002F Detalle de producto — ISR + revalidation on-demand\n    '\u002Fproduct\u002F**': { \n      swr: 3600,\n      isr: {\n        revalidate: 3600,\n        bypassToken: process.env.REVALIDATE_TOKEN\n      }\n    },\n    \n    \u002F\u002F Área de usuario — SPA\n    '\u002Faccount\u002F**': { \n      ssr: false, \u002F\u002F Solo cliente\n      appMiddleware: ['auth']\n    },\n    \n    \u002F\u002F Rutas API — runtime del servidor\n    '\u002Fapi\u002F**': { \n      cors: true,\n      headers: { 'Cache-Control': 'no-cache' }\n    }\n  }\n})\n",[440],{"type":32,"tag":52,"props":441,"children":442},{"__ignoreMap":16},[443,462,469,477,497,517,537,545,553,566,588,616,624,631,639,651,668,677,694,708,717,725,733,742,755,778,797,805,813,822,834,851,876,884,892],{"type":32,"tag":103,"props":444,"children":445},{"class":105,"line":106},[446,450,454,458],{"type":32,"tag":103,"props":447,"children":448},{"style":120},[449],{"type":37,"value":123},{"type":32,"tag":103,"props":451,"children":452},{"style":120},[453],{"type":37,"value":128},{"type":32,"tag":103,"props":455,"children":456},{"style":131},[457],{"type":37,"value":134},{"type":32,"tag":103,"props":459,"children":460},{"style":137},[461],{"type":37,"value":140},{"type":32,"tag":103,"props":463,"children":464},{"class":105,"line":116},[465],{"type":32,"tag":103,"props":466,"children":467},{"style":137},[468],{"type":37,"value":267},{"type":32,"tag":103,"props":470,"children":471},{"class":105,"line":143},[472],{"type":32,"tag":103,"props":473,"children":474},{"style":110},[475],{"type":37,"value":476},"    \u002F\u002F Páginas de marketing estáticas\n",{"type":32,"tag":103,"props":478,"children":479},{"class":105,"line":152},[480,484,488,492],{"type":32,"tag":103,"props":481,"children":482},{"style":195},[483],{"type":37,"value":276},{"type":32,"tag":103,"props":485,"children":486},{"style":137},[487],{"type":37,"value":281},{"type":32,"tag":103,"props":489,"children":490},{"style":170},[491],{"type":37,"value":173},{"type":32,"tag":103,"props":493,"children":494},{"style":137},[495],{"type":37,"value":496}," },\n",{"type":32,"tag":103,"props":498,"children":499},{"class":105,"line":161},[500,505,509,513],{"type":32,"tag":103,"props":501,"children":502},{"style":195},[503],{"type":37,"value":504},"    '\u002Fabout'",{"type":32,"tag":103,"props":506,"children":507},{"style":137},[508],{"type":37,"value":281},{"type":32,"tag":103,"props":510,"children":511},{"style":170},[512],{"type":37,"value":173},{"type":32,"tag":103,"props":514,"children":515},{"style":137},[516],{"type":37,"value":496},{"type":32,"tag":103,"props":518,"children":519},{"class":105,"line":186},[520,525,529,533],{"type":32,"tag":103,"props":521,"children":522},{"style":195},[523],{"type":37,"value":524},"    '\u002Fcontact'",{"type":32,"tag":103,"props":526,"children":527},{"style":137},[528],{"type":37,"value":281},{"type":32,"tag":103,"props":530,"children":531},{"style":170},[532],{"type":37,"value":173},{"type":32,"tag":103,"props":534,"children":535},{"style":137},[536],{"type":37,"value":496},{"type":32,"tag":103,"props":538,"children":539},{"class":105,"line":211},[540],{"type":32,"tag":103,"props":541,"children":542},{"style":137},[543],{"type":37,"value":544},"    \n",{"type":32,"tag":103,"props":546,"children":547},{"class":105,"line":26},[548],{"type":32,"tag":103,"props":549,"children":550},{"style":110},[551],{"type":37,"value":552},"    \u002F\u002F Páginas de categoría de productos — ISR\n",{"type":32,"tag":103,"props":554,"children":555},{"class":105,"line":252},[556,561],{"type":32,"tag":103,"props":557,"children":558},{"style":195},[559],{"type":37,"value":560},"    '\u002Fcategory\u002F**'",{"type":32,"tag":103,"props":562,"children":563},{"style":137},[564],{"type":37,"value":565},": { \n",{"type":32,"tag":103,"props":567,"children":568},{"class":105,"line":261},[569,574,579,583],{"type":32,"tag":103,"props":570,"children":571},{"style":137},[572],{"type":37,"value":573},"      swr: ",{"type":32,"tag":103,"props":575,"children":576},{"style":170},[577],{"type":37,"value":578},"1800",{"type":32,"tag":103,"props":580,"children":581},{"style":137},[582],{"type":37,"value":178},{"type":32,"tag":103,"props":584,"children":585},{"style":110},[586],{"type":37,"value":587},"\u002F\u002F Cache de 30 min\n",{"type":32,"tag":103,"props":589,"children":590},{"class":105,"line":270},[591,596,601,606,611],{"type":32,"tag":103,"props":592,"children":593},{"style":137},[594],{"type":37,"value":595},"      headers: { ",{"type":32,"tag":103,"props":597,"children":598},{"style":195},[599],{"type":37,"value":600},"'Cache-Control'",{"type":32,"tag":103,"props":602,"children":603},{"style":137},[604],{"type":37,"value":605},": ",{"type":32,"tag":103,"props":607,"children":608},{"style":195},[609],{"type":37,"value":610},"'s-maxage=1800'",{"type":32,"tag":103,"props":612,"children":613},{"style":137},[614],{"type":37,"value":615}," }\n",{"type":32,"tag":103,"props":617,"children":618},{"class":105,"line":298},[619],{"type":32,"tag":103,"props":620,"children":621},{"style":137},[622],{"type":37,"value":623},"    },\n",{"type":32,"tag":103,"props":625,"children":626},{"class":105,"line":326},[627],{"type":32,"tag":103,"props":628,"children":629},{"style":137},[630],{"type":37,"value":544},{"type":32,"tag":103,"props":632,"children":633},{"class":105,"line":354},[634],{"type":32,"tag":103,"props":635,"children":636},{"style":110},[637],{"type":37,"value":638},"    \u002F\u002F Detalle de producto — ISR + revalidation on-demand\n",{"type":32,"tag":103,"props":640,"children":641},{"class":105,"line":363},[642,647],{"type":32,"tag":103,"props":643,"children":644},{"style":195},[645],{"type":37,"value":646},"    '\u002Fproduct\u002F**'",{"type":32,"tag":103,"props":648,"children":649},{"style":137},[650],{"type":37,"value":565},{"type":32,"tag":103,"props":652,"children":654},{"class":105,"line":653},16,[655,659,663],{"type":32,"tag":103,"props":656,"children":657},{"style":137},[658],{"type":37,"value":573},{"type":32,"tag":103,"props":660,"children":661},{"style":170},[662],{"type":37,"value":314},{"type":32,"tag":103,"props":664,"children":665},{"style":137},[666],{"type":37,"value":667},",\n",{"type":32,"tag":103,"props":669,"children":671},{"class":105,"line":670},17,[672],{"type":32,"tag":103,"props":673,"children":674},{"style":137},[675],{"type":37,"value":676},"      isr: {\n",{"type":32,"tag":103,"props":678,"children":680},{"class":105,"line":679},18,[681,686,690],{"type":32,"tag":103,"props":682,"children":683},{"style":137},[684],{"type":37,"value":685},"        revalidate: ",{"type":32,"tag":103,"props":687,"children":688},{"style":170},[689],{"type":37,"value":314},{"type":32,"tag":103,"props":691,"children":692},{"style":137},[693],{"type":37,"value":667},{"type":32,"tag":103,"props":695,"children":697},{"class":105,"line":696},19,[698,703],{"type":32,"tag":103,"props":699,"children":700},{"style":137},[701],{"type":37,"value":702},"        bypassToken: process.env.",{"type":32,"tag":103,"props":704,"children":705},{"style":170},[706],{"type":37,"value":707},"REVALIDATE_TOKEN\n",{"type":32,"tag":103,"props":709,"children":711},{"class":105,"line":710},20,[712],{"type":32,"tag":103,"props":713,"children":714},{"style":137},[715],{"type":37,"value":716},"      }\n",{"type":32,"tag":103,"props":718,"children":720},{"class":105,"line":719},21,[721],{"type":32,"tag":103,"props":722,"children":723},{"style":137},[724],{"type":37,"value":623},{"type":32,"tag":103,"props":726,"children":728},{"class":105,"line":727},22,[729],{"type":32,"tag":103,"props":730,"children":731},{"style":137},[732],{"type":37,"value":544},{"type":32,"tag":103,"props":734,"children":736},{"class":105,"line":735},23,[737],{"type":32,"tag":103,"props":738,"children":739},{"style":110},[740],{"type":37,"value":741},"    \u002F\u002F Área de usuario — SPA\n",{"type":32,"tag":103,"props":743,"children":745},{"class":105,"line":744},24,[746,751],{"type":32,"tag":103,"props":747,"children":748},{"style":195},[749],{"type":37,"value":750},"    '\u002Faccount\u002F**'",{"type":32,"tag":103,"props":752,"children":753},{"style":137},[754],{"type":37,"value":565},{"type":32,"tag":103,"props":756,"children":758},{"class":105,"line":757},25,[759,764,769,773],{"type":32,"tag":103,"props":760,"children":761},{"style":137},[762],{"type":37,"value":763},"      ssr: ",{"type":32,"tag":103,"props":765,"children":766},{"style":170},[767],{"type":37,"value":768},"false",{"type":32,"tag":103,"props":770,"children":771},{"style":137},[772],{"type":37,"value":178},{"type":32,"tag":103,"props":774,"children":775},{"style":110},[776],{"type":37,"value":777},"\u002F\u002F Solo cliente\n",{"type":32,"tag":103,"props":779,"children":781},{"class":105,"line":780},26,[782,787,792],{"type":32,"tag":103,"props":783,"children":784},{"style":137},[785],{"type":37,"value":786},"      appMiddleware: [",{"type":32,"tag":103,"props":788,"children":789},{"style":195},[790],{"type":37,"value":791},"'auth'",{"type":32,"tag":103,"props":793,"children":794},{"style":137},[795],{"type":37,"value":796},"]\n",{"type":32,"tag":103,"props":798,"children":800},{"class":105,"line":799},27,[801],{"type":32,"tag":103,"props":802,"children":803},{"style":137},[804],{"type":37,"value":623},{"type":32,"tag":103,"props":806,"children":808},{"class":105,"line":807},28,[809],{"type":32,"tag":103,"props":810,"children":811},{"style":137},[812],{"type":37,"value":544},{"type":32,"tag":103,"props":814,"children":816},{"class":105,"line":815},29,[817],{"type":32,"tag":103,"props":818,"children":819},{"style":110},[820],{"type":37,"value":821},"    \u002F\u002F Rutas API — runtime del servidor\n",{"type":32,"tag":103,"props":823,"children":825},{"class":105,"line":824},30,[826,830],{"type":32,"tag":103,"props":827,"children":828},{"style":195},[829],{"type":37,"value":332},{"type":32,"tag":103,"props":831,"children":832},{"style":137},[833],{"type":37,"value":565},{"type":32,"tag":103,"props":835,"children":837},{"class":105,"line":836},31,[838,843,847],{"type":32,"tag":103,"props":839,"children":840},{"style":137},[841],{"type":37,"value":842},"      cors: ",{"type":32,"tag":103,"props":844,"children":845},{"style":170},[846],{"type":37,"value":173},{"type":32,"tag":103,"props":848,"children":849},{"style":137},[850],{"type":37,"value":667},{"type":32,"tag":103,"props":852,"children":854},{"class":105,"line":853},32,[855,859,863,867,872],{"type":32,"tag":103,"props":856,"children":857},{"style":137},[858],{"type":37,"value":595},{"type":32,"tag":103,"props":860,"children":861},{"style":195},[862],{"type":37,"value":600},{"type":32,"tag":103,"props":864,"children":865},{"style":137},[866],{"type":37,"value":605},{"type":32,"tag":103,"props":868,"children":869},{"style":195},[870],{"type":37,"value":871},"'no-cache'",{"type":32,"tag":103,"props":873,"children":874},{"style":137},[875],{"type":37,"value":615},{"type":32,"tag":103,"props":877,"children":879},{"class":105,"line":878},33,[880],{"type":32,"tag":103,"props":881,"children":882},{"style":137},[883],{"type":37,"value":249},{"type":32,"tag":103,"props":885,"children":887},{"class":105,"line":886},34,[888],{"type":32,"tag":103,"props":889,"children":890},{"style":137},[891],{"type":37,"value":360},{"type":32,"tag":103,"props":893,"children":895},{"class":105,"line":894},35,[896],{"type":32,"tag":103,"props":897,"children":898},{"style":137},[899],{"type":37,"value":369},{"type":32,"tag":33,"props":901,"children":902},{},[903],{"type":32,"tag":395,"props":904,"children":905},{},[906],{"type":37,"value":907},"Análisis de tradeoffs:",{"type":32,"tag":909,"props":910,"children":911},"ul",{},[912,923,933],{"type":32,"tag":913,"props":914,"children":915},"li",{},[916,921],{"type":32,"tag":395,"props":917,"children":918},{},[919],{"type":37,"value":920},"Prerender (estático):",{"type":37,"value":922}," Aumento del tiempo de build, costo de runtime cero. Servido directamente desde CDN. Mejor para Core Web Vitals (TTFB \u003C50ms). Sin embargo, el build de 10.000+ páginas puede superar 1 hora.",{"type":32,"tag":913,"props":924,"children":925},{},[926,931],{"type":32,"tag":395,"props":927,"children":928},{},[929],{"type":37,"value":930},"SWR (ISR):",{"type":37,"value":932}," Renderizado en la primera solicitud, siguientes solicitudes desde cache. Tiempo de build bajo, costo de runtime medio. Riesgo de contenido stale hasta 1 hora.",{"type":32,"tag":913,"props":934,"children":935},{},[936,941],{"type":32,"tag":395,"props":937,"children":938},{},[939],{"type":37,"value":940},"SSR (runtime):",{"type":37,"value":942}," Renderizado en cada solicitud. Sin tiempo de build, costo de runtime alto. Necesario para personalización. TTFB entre 200-800ms (serverless edge).",{"type":32,"tag":33,"props":944,"children":945},{},[946,951],{"type":32,"tag":395,"props":947,"children":948},{},[949],{"type":37,"value":950},"Benchmark:",{"type":37,"value":952}," La configuración anterior se aplicó a un proyecto Hydrogen con 1200 productos. El build pasó de 22 minutos a 8 minutos, la puntuación Lighthouse Performance de 78 a 94, y el costo mensual de serverless de $180 a $45 (Vercel Pro tier, diciembre 2025).",{"type":32,"tag":40,"props":954,"children":956},{"id":955},"prerender-de-rutas-dinámicas-e-integración-con-sitemap",[957],{"type":37,"value":958},"Prerender de Rutas Dinámicas e Integración con Sitemap",{"type":32,"tag":33,"props":960,"children":961},{},[962,964,969],{"type":37,"value":963},"Para prerender rutas dinámicas, necesitas generar la lista de rutas en tiempo de build. En Nuxt 3 hay dos métodos: hook ",{"type":32,"tag":52,"props":965,"children":967},{"className":966},[],[968],{"type":37,"value":73},{"type":37,"value":970}," o crawling de sitemap.xml. El segundo es más escalable porque tu CMS puede generar automáticamente el sitemap:",{"type":32,"tag":93,"props":972,"children":974},{"className":95,"code":973,"language":97,"meta":16,"style":16},"\u002F\u002F server\u002Froutes\u002Fsitemap.xml.ts\nexport default defineEventHandler(async (event) => {\n  const products = await $fetch('https:\u002F\u002Fcms.example.com\u002Fapi\u002Fproducts')\n  \n  const urls = products.map((p) => ({\n    loc: `https:\u002F\u002Fexample.com\u002Fproduct\u002F${p.slug}`,\n    lastmod: p.updatedAt,\n    changefreq: 'daily',\n    priority: 0.8\n  }))\n  \n  return `\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Curlset xmlns=\"http:\u002F\u002Fwww.sitemaps.org\u002Fschemas\u002Fsitemap\u002F0.9\">\n  ${urls.map(u => `\n  \u003Curl>\n    \u003Cloc>${u.loc}\u003C\u002Floc>\n    \u003Clastmod>${u.lastmod}\u003C\u002Flastmod>\n    \u003Cchangefreq>${u.changefreq}\u003C\u002Fchangefreq>\n    \u003Cpriority>${u.priority}\u003C\u002Fpriority>\n  \u003C\u002Furl>`).join('')}\n\u003C\u002Furlset>`\n})\n",[975],{"type":32,"tag":52,"props":976,"children":977},{"__ignoreMap":16},[978,986,1038,1080,1088,1136,1172,1180,1197,1210,1218,1225,1238,1246,1286,1294,1320,1346,1372,1398,1435,1443],{"type":32,"tag":103,"props":979,"children":980},{"class":105,"line":106},[981],{"type":32,"tag":103,"props":982,"children":983},{"style":110},[984],{"type":37,"value":985},"\u002F\u002F server\u002Froutes\u002Fsitemap.xml.ts\n",{"type":32,"tag":103,"props":987,"children":988},{"class":105,"line":116},[989,993,997,1002,1007,1012,1017,1023,1028,1033],{"type":32,"tag":103,"props":990,"children":991},{"style":120},[992],{"type":37,"value":123},{"type":32,"tag":103,"props":994,"children":995},{"style":120},[996],{"type":37,"value":128},{"type":32,"tag":103,"props":998,"children":999},{"style":131},[1000],{"type":37,"value":1001}," defineEventHandler",{"type":32,"tag":103,"props":1003,"children":1004},{"style":137},[1005],{"type":37,"value":1006},"(",{"type":32,"tag":103,"props":1008,"children":1009},{"style":120},[1010],{"type":37,"value":1011},"async",{"type":32,"tag":103,"props":1013,"children":1014},{"style":137},[1015],{"type":37,"value":1016}," (",{"type":32,"tag":103,"props":1018,"children":1020},{"style":1019},"--shiki-default:#FFAB70",[1021],{"type":37,"value":1022},"event",{"type":32,"tag":103,"props":1024,"children":1025},{"style":137},[1026],{"type":37,"value":1027},") ",{"type":32,"tag":103,"props":1029,"children":1030},{"style":120},[1031],{"type":37,"value":1032},"=>",{"type":32,"tag":103,"props":1034,"children":1035},{"style":137},[1036],{"type":37,"value":1037}," {\n",{"type":32,"tag":103,"props":1039,"children":1040},{"class":105,"line":143},[1041,1046,1051,1056,1061,1066,1070,1075],{"type":32,"tag":103,"props":1042,"children":1043},{"style":120},[1044],{"type":37,"value":1045},"  const",{"type":32,"tag":103,"props":1047,"children":1048},{"style":170},[1049],{"type":37,"value":1050}," products",{"type":32,"tag":103,"props":1052,"children":1053},{"style":120},[1054],{"type":37,"value":1055}," =",{"type":32,"tag":103,"props":1057,"children":1058},{"style":120},[1059],{"type":37,"value":1060}," await",{"type":32,"tag":103,"props":1062,"children":1063},{"style":131},[1064],{"type":37,"value":1065}," $fetch",{"type":32,"tag":103,"props":1067,"children":1068},{"style":137},[1069],{"type":37,"value":1006},{"type":32,"tag":103,"props":1071,"children":1072},{"style":195},[1073],{"type":37,"value":1074},"'https:\u002F\u002Fcms.example.com\u002Fapi\u002Fproducts'",{"type":32,"tag":103,"props":1076,"children":1077},{"style":137},[1078],{"type":37,"value":1079},")\n",{"type":32,"tag":103,"props":1081,"children":1082},{"class":105,"line":152},[1083],{"type":32,"tag":103,"props":1084,"children":1085},{"style":137},[1086],{"type":37,"value":1087},"  \n",{"type":32,"tag":103,"props":1089,"children":1090},{"class":105,"line":161},[1091,1095,1100,1104,1109,1114,1119,1123,1127,1131],{"type":32,"tag":103,"props":1092,"children":1093},{"style":120},[1094],{"type":37,"value":1045},{"type":32,"tag":103,"props":1096,"children":1097},{"style":170},[1098],{"type":37,"value":1099}," urls",{"type":32,"tag":103,"props":1101,"children":1102},{"style":120},[1103],{"type":37,"value":1055},{"type":32,"tag":103,"props":1105,"children":1106},{"style":137},[1107],{"type":37,"value":1108}," products.",{"type":32,"tag":103,"props":1110,"children":1111},{"style":131},[1112],{"type":37,"value":1113},"map",{"type":32,"tag":103,"props":1115,"children":1116},{"style":137},[1117],{"type":37,"value":1118},"((",{"type":32,"tag":103,"props":1120,"children":1121},{"style":1019},[1122],{"type":37,"value":33},{"type":32,"tag":103,"props":1124,"children":1125},{"style":137},[1126],{"type":37,"value":1027},{"type":32,"tag":103,"props":1128,"children":1129},{"style":120},[1130],{"type":37,"value":1032},{"type":32,"tag":103,"props":1132,"children":1133},{"style":137},[1134],{"type":37,"value":1135}," ({\n",{"type":32,"tag":103,"props":1137,"children":1138},{"class":105,"line":186},[1139,1144,1149,1153,1158,1163,1168],{"type":32,"tag":103,"props":1140,"children":1141},{"style":137},[1142],{"type":37,"value":1143},"    loc: ",{"type":32,"tag":103,"props":1145,"children":1146},{"style":195},[1147],{"type":37,"value":1148},"`https:\u002F\u002Fexample.com\u002Fproduct\u002F${",{"type":32,"tag":103,"props":1150,"children":1151},{"style":137},[1152],{"type":37,"value":33},{"type":32,"tag":103,"props":1154,"children":1155},{"style":195},[1156],{"type":37,"value":1157},".",{"type":32,"tag":103,"props":1159,"children":1160},{"style":137},[1161],{"type":37,"value":1162},"slug",{"type":32,"tag":103,"props":1164,"children":1165},{"style":195},[1166],{"type":37,"value":1167},"}`",{"type":32,"tag":103,"props":1169,"children":1170},{"style":137},[1171],{"type":37,"value":667},{"type":32,"tag":103,"props":1173,"children":1174},{"class":105,"line":211},[1175],{"type":32,"tag":103,"props":1176,"children":1177},{"style":137},[1178],{"type":37,"value":1179},"    lastmod: p.updatedAt,\n",{"type":32,"tag":103,"props":1181,"children":1182},{"class":105,"line":26},[1183,1188,1193],{"type":32,"tag":103,"props":1184,"children":1185},{"style":137},[1186],{"type":37,"value":1187},"    changefreq: ",{"type":32,"tag":103,"props":1189,"children":1190},{"style":195},[1191],{"type":37,"value":1192},"'daily'",{"type":32,"tag":103,"props":1194,"children":1195},{"style":137},[1196],{"type":37,"value":667},{"type":32,"tag":103,"props":1198,"children":1199},{"class":105,"line":252},[1200,1205],{"type":32,"tag":103,"props":1201,"children":1202},{"style":137},[1203],{"type":37,"value":1204},"    priority: ",{"type":32,"tag":103,"props":1206,"children":1207},{"style":170},[1208],{"type":37,"value":1209},"0.8\n",{"type":32,"tag":103,"props":1211,"children":1212},{"class":105,"line":261},[1213],{"type":32,"tag":103,"props":1214,"children":1215},{"style":137},[1216],{"type":37,"value":1217},"  }))\n",{"type":32,"tag":103,"props":1219,"children":1220},{"class":105,"line":270},[1221],{"type":32,"tag":103,"props":1222,"children":1223},{"style":137},[1224],{"type":37,"value":1087},{"type":32,"tag":103,"props":1226,"children":1227},{"class":105,"line":298},[1228,1233],{"type":32,"tag":103,"props":1229,"children":1230},{"style":120},[1231],{"type":37,"value":1232},"  return",{"type":32,"tag":103,"props":1234,"children":1235},{"style":195},[1236],{"type":37,"value":1237}," `\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",{"type":32,"tag":103,"props":1239,"children":1240},{"class":105,"line":326},[1241],{"type":32,"tag":103,"props":1242,"children":1243},{"style":195},[1244],{"type":37,"value":1245},"\u003Curlset xmlns=\"http:\u002F\u002Fwww.sitemaps.org\u002Fschemas\u002Fsitemap\u002F0.9\">\n",{"type":32,"tag":103,"props":1247,"children":1248},{"class":105,"line":354},[1249,1254,1259,1263,1267,1271,1276,1281],{"type":32,"tag":103,"props":1250,"children":1251},{"style":195},[1252],{"type":37,"value":1253},"  ${",{"type":32,"tag":103,"props":1255,"children":1256},{"style":137},[1257],{"type":37,"value":1258},"urls",{"type":32,"tag":103,"props":1260,"children":1261},{"style":195},[1262],{"type":37,"value":1157},{"type":32,"tag":103,"props":1264,"children":1265},{"style":131},[1266],{"type":37,"value":1113},{"type":32,"tag":103,"props":1268,"children":1269},{"style":195},[1270],{"type":37,"value":1006},{"type":32,"tag":103,"props":1272,"children":1273},{"style":170},[1274],{"type":37,"value":1275},"u",{"type":32,"tag":103,"props":1277,"children":1278},{"style":120},[1279],{"type":37,"value":1280}," =>",{"type":32,"tag":103,"props":1282,"children":1283},{"style":195},[1284],{"type":37,"value":1285}," `\n",{"type":32,"tag":103,"props":1287,"children":1288},{"class":105,"line":363},[1289],{"type":32,"tag":103,"props":1290,"children":1291},{"style":195},[1292],{"type":37,"value":1293},"  \u003Curl>\n",{"type":32,"tag":103,"props":1295,"children":1296},{"class":105,"line":653},[1297,1302,1306,1310,1315],{"type":32,"tag":103,"props":1298,"children":1299},{"style":195},[1300],{"type":37,"value":1301},"    \u003Cloc>${",{"type":32,"tag":103,"props":1303,"children":1304},{"style":137},[1305],{"type":37,"value":1275},{"type":32,"tag":103,"props":1307,"children":1308},{"style":195},[1309],{"type":37,"value":1157},{"type":32,"tag":103,"props":1311,"children":1312},{"style":137},[1313],{"type":37,"value":1314},"loc",{"type":32,"tag":103,"props":1316,"children":1317},{"style":195},[1318],{"type":37,"value":1319},"}\u003C\u002Floc>\n",{"type":32,"tag":103,"props":1321,"children":1322},{"class":105,"line":670},[1323,1328,1332,1336,1341],{"type":32,"tag":103,"props":1324,"children":1325},{"style":195},[1326],{"type":37,"value":1327},"    \u003Clastmod>${",{"type":32,"tag":103,"props":1329,"children":1330},{"style":137},[1331],{"type":37,"value":1275},{"type":32,"tag":103,"props":1333,"children":1334},{"style":195},[1335],{"type":37,"value":1157},{"type":32,"tag":103,"props":1337,"children":1338},{"style":137},[1339],{"type":37,"value":1340},"lastmod",{"type":32,"tag":103,"props":1342,"children":1343},{"style":195},[1344],{"type":37,"value":1345},"}\u003C\u002Flastmod>\n",{"type":32,"tag":103,"props":1347,"children":1348},{"class":105,"line":679},[1349,1354,1358,1362,1367],{"type":32,"tag":103,"props":1350,"children":1351},{"style":195},[1352],{"type":37,"value":1353},"    \u003Cchangefreq>${",{"type":32,"tag":103,"props":1355,"children":1356},{"style":137},[1357],{"type":37,"value":1275},{"type":32,"tag":103,"props":1359,"children":1360},{"style":195},[1361],{"type":37,"value":1157},{"type":32,"tag":103,"props":1363,"children":1364},{"style":137},[1365],{"type":37,"value":1366},"changefreq",{"type":32,"tag":103,"props":1368,"children":1369},{"style":195},[1370],{"type":37,"value":1371},"}\u003C\u002Fchangefreq>\n",{"type":32,"tag":103,"props":1373,"children":1374},{"class":105,"line":696},[1375,1380,1384,1388,1393],{"type":32,"tag":103,"props":1376,"children":1377},{"style":195},[1378],{"type":37,"value":1379},"    \u003Cpriority>${",{"type":32,"tag":103,"props":1381,"children":1382},{"style":137},[1383],{"type":37,"value":1275},{"type":32,"tag":103,"props":1385,"children":1386},{"style":195},[1387],{"type":37,"value":1157},{"type":32,"tag":103,"props":1389,"children":1390},{"style":137},[1391],{"type":37,"value":1392},"priority",{"type":32,"tag":103,"props":1394,"children":1395},{"style":195},[1396],{"type":37,"value":1397},"}\u003C\u002Fpriority>\n",{"type":32,"tag":103,"props":1399,"children":1400},{"class":105,"line":710},[1401,1406,1411,1416,1420,1425,1430],{"type":32,"tag":103,"props":1402,"children":1403},{"style":195},[1404],{"type":37,"value":1405},"  \u003C\u002Furl>`",{"type":32,"tag":103,"props":1407,"children":1408},{"style":195},[1409],{"type":37,"value":1410},").",{"type":32,"tag":103,"props":1412,"children":1413},{"style":131},[1414],{"type":37,"value":1415},"join",{"type":32,"tag":103,"props":1417,"children":1418},{"style":195},[1419],{"type":37,"value":1006},{"type":32,"tag":103,"props":1421,"children":1422},{"style":195},[1423],{"type":37,"value":1424},"''",{"type":32,"tag":103,"props":1426,"children":1427},{"style":195},[1428],{"type":37,"value":1429},")",{"type":32,"tag":103,"props":1431,"children":1432},{"style":195},[1433],{"type":37,"value":1434},"}\n",{"type":32,"tag":103,"props":1436,"children":1437},{"class":105,"line":719},[1438],{"type":32,"tag":103,"props":1439,"children":1440},{"style":195},[1441],{"type":37,"value":1442},"\u003C\u002Furlset>`\n",{"type":32,"tag":103,"props":1444,"children":1445},{"class":105,"line":727},[1446],{"type":32,"tag":103,"props":1447,"children":1448},{"style":137},[1449],{"type":37,"value":369},{"type":32,"tag":33,"props":1451,"children":1452},{},[1453],{"type":37,"value":1454},"En la configuración de build, establece el sitemap como punto de entrada:",{"type":32,"tag":93,"props":1456,"children":1458},{"className":95,"code":1457,"language":97,"meta":16,"style":16},"export default defineNuxtConfig({\n  nitro: {\n    prerender: {\n      crawlLinks: true,\n      routes: ['\u002Fsitemap.xml']\n    }\n  }\n})\n",[1459],{"type":32,"tag":52,"props":1460,"children":1461},{"__ignoreMap":16},[1462,1481,1488,1495,1510,1525,1532,1539],{"type":32,"tag":103,"props":1463,"children":1464},{"class":105,"line":106},[1465,1469,1473,1477],{"type":32,"tag":103,"props":1466,"children":1467},{"style":120},[1468],{"type":37,"value":123},{"type":32,"tag":103,"props":1470,"children":1471},{"style":120},[1472],{"type":37,"value":128},{"type":32,"tag":103,"props":1474,"children":1475},{"style":131},[1476],{"type":37,"value":134},{"type":32,"tag":103,"props":1478,"children":1479},{"style":137},[1480],{"type":37,"value":140},{"type":32,"tag":103,"props":1482,"children":1483},{"class":105,"line":116},[1484],{"type":32,"tag":103,"props":1485,"children":1486},{"style":137},[1487],{"type":37,"value":149},{"type":32,"tag":103,"props":1489,"children":1490},{"class":105,"line":143},[1491],{"type":32,"tag":103,"props":1492,"children":1493},{"style":137},[1494],{"type":37,"value":158},{"type":32,"tag":103,"props":1496,"children":1497},{"class":105,"line":152},[1498,1502,1506],{"type":32,"tag":103,"props":1499,"children":1500},{"style":137},[1501],{"type":37,"value":167},{"type":32,"tag":103,"props":1503,"children":1504},{"style":170},[1505],{"type":37,"value":173},{"type":32,"tag":103,"props":1507,"children":1508},{"style":137},[1509],{"type":37,"value":667},{"type":32,"tag":103,"props":1511,"children":1512},{"class":105,"line":161},[1513,1517,1521],{"type":32,"tag":103,"props":1514,"children":1515},{"style":137},[1516],{"type":37,"value":192},{"type":32,"tag":103,"props":1518,"children":1519},{"style":195},[1520],{"type":37,"value":198},{"type":32,"tag":103,"props":1522,"children":1523},{"style":137},[1524],{"type":37,"value":796},{"type":32,"tag":103,"props":1526,"children":1527},{"class":105,"line":186},[1528],{"type":32,"tag":103,"props":1529,"children":1530},{"style":137},[1531],{"type":37,"value":249},{"type":32,"tag":103,"props":1533,"children":1534},{"class":105,"line":211},[1535],{"type":32,"tag":103,"props":1536,"children":1537},{"style":137},[1538],{"type":37,"value":360},{"type":32,"tag":103,"props":1540,"children":1541},{"class":105,"line":26},[1542],{"type":32,"tag":103,"props":1543,"children":1544},{"style":137},[1545],{"type":37,"value":369},{"type":32,"tag":33,"props":1547,"children":1548},{},[1549,1551,1557,1558,1564],{"type":37,"value":1550},"Nitro parsea sitemap.xml y analiza todas las URLs contenidas. Este enfoque funciona incluso en sitios con 50.000+ productos porque puedes paginar el sitemap (",{"type":32,"tag":52,"props":1552,"children":1554},{"className":1553},[],[1555],{"type":37,"value":1556},"sitemap-1.xml",{"type":37,"value":178},{"type":32,"tag":52,"props":1559,"children":1561},{"className":1560},[],[1562],{"type":37,"value":1563},"sitemap-2.xml",{"type":37,"value":1410},{"type":32,"tag":33,"props":1566,"children":1567},{},[1568,1573,1575,1581],{"type":32,"tag":395,"props":1569,"children":1570},{},[1571],{"type":37,"value":1572},"Atención:",{"type":37,"value":1574}," La ruta sitemap debe prerrenderizarse, de lo contrario no puede obtenerse en tiempo de build. En el ejemplo anterior se define en ",{"type":32,"tag":52,"props":1576,"children":1578},{"className":1577},[],[1579],{"type":37,"value":1580},"server\u002Froutes\u002F",{"type":37,"value":1582},", esas rutas se ejecutan durante el build.",{"type":32,"tag":40,"props":1584,"children":1586},{"id":1585},"optimización-del-build-prerender-paralelo-y-estrategia-de-chunks",[1587],{"type":37,"value":1588},"Optimización del Build: Prerender Paralelo y Estrategia de Chunks",{"type":32,"tag":33,"props":1590,"children":1591},{},[1592,1594,1600],{"type":37,"value":1593},"Nitro prerrenderiza con concurrency 1 por defecto — las operaciones CPU bound se ejecutan en serie. Incrementar el parámetro ",{"type":32,"tag":52,"props":1595,"children":1597},{"className":1596},[],[1598],{"type":37,"value":1599},"concurrency",{"type":37,"value":1601}," reduce el tiempo de build de forma lineal:",{"type":32,"tag":93,"props":1603,"children":1605},{"className":95,"code":1604,"language":97,"meta":16,"style":16},"export default defineNuxtConfig({\n  nitro: {\n    prerender: {\n      concurrency: 10, \u002F\u002F 10 workers paralelos\n      interval: 0, \u002F\u002F Sin delay entre workers\n      failOnError: false \u002F\u002F ¿Detener todo si falla una ruta?\n    }\n  }\n})\n",[1606],{"type":32,"tag":52,"props":1607,"children":1608},{"__ignoreMap":16},[1609,1628,1635,1642,1664,1686,1703,1710,1717],{"type":32,"tag":103,"props":1610,"children":1611},{"class":105,"line":106},[1612,1616,1620,1624],{"type":32,"tag":103,"props":1613,"children":1614},{"style":120},[1615],{"type":37,"value":123},{"type":32,"tag":103,"props":1617,"children":1618},{"style":120},[1619],{"type":37,"value":128},{"type":32,"tag":103,"props":1621,"children":1622},{"style":131},[1623],{"type":37,"value":134},{"type":32,"tag":103,"props":1625,"children":1626},{"style":137},[1627],{"type":37,"value":140},{"type":32,"tag":103,"props":1629,"children":1630},{"class":105,"line":116},[1631],{"type":32,"tag":103,"props":1632,"children":1633},{"style":137},[1634],{"type":37,"value":149},{"type":32,"tag":103,"props":1636,"children":1637},{"class":105,"line":143},[1638],{"type":32,"tag":103,"props":1639,"children":1640},{"style":137},[1641],{"type":37,"value":158},{"type":32,"tag":103,"props":1643,"children":1644},{"class":105,"line":152},[1645,1650,1655,1659],{"type":32,"tag":103,"props":1646,"children":1647},{"style":137},[1648],{"type":37,"value":1649},"      concurrency: ",{"type":32,"tag":103,"props":1651,"children":1652},{"style":170},[1653],{"type":37,"value":1654},"10",{"type":32,"tag":103,"props":1656,"children":1657},{"style":137},[1658],{"type":37,"value":178},{"type":32,"tag":103,"props":1660,"children":1661},{"style":110},[1662],{"type":37,"value":1663},"\u002F\u002F 10 workers paralelos\n",{"type":32,"tag":103,"props":1665,"children":1666},{"class":105,"line":161},[1667,1672,1677,1681],{"type":32,"tag":103,"props":1668,"children":1669},{"style":137},[1670],{"type":37,"value":1671},"      interval: ",{"type":32,"tag":103,"props":1673,"children":1674},{"style":170},[1675],{"type":37,"value":1676},"0",{"type":32,"tag":103,"props":1678,"children":1679},{"style":137},[1680],{"type":37,"value":178},{"type":32,"tag":103,"props":1682,"children":1683},{"style":110},[1684],{"type":37,"value":1685},"\u002F\u002F Sin delay entre workers\n",{"type":32,"tag":103,"props":1687,"children":1688},{"class":105,"line":186},[1689,1694,1698],{"type":32,"tag":103,"props":1690,"children":1691},{"style":137},[1692],{"type":37,"value":1693},"      failOnError: ",{"type":32,"tag":103,"props":1695,"children":1696},{"style":170},[1697],{"type":37,"value":768},{"type":32,"tag":103,"props":1699,"children":1700},{"style":110},[1701],{"type":37,"value":1702}," \u002F\u002F ¿Detener todo si falla una ruta?\n",{"type":32,"tag":103,"props":1704,"children":1705},{"class":105,"line":211},[1706],{"type":32,"tag":103,"props":1707,"children":1708},{"style":137},[1709],{"type":37,"value":249},{"type":32,"tag":103,"props":1711,"children":1712},{"class":105,"line":26},[1713],{"type":32,"tag":103,"props":1714,"children":1715},{"style":137},[1716],{"type":37,"value":360},{"type":32,"tag":103,"props":1718,"children":1719},{"class":105,"line":252},[1720],{"type":32,"tag":103,"props":1721,"children":1722},{"style":137},[1723],{"type":37,"value":369},{"type":32,"tag":33,"props":1725,"children":1726},{},[1727,1731,1733,1739,1741,1747],{"type":32,"tag":395,"props":1728,"children":1729},{},[1730],{"type":37,"value":950},{"type":37,"value":1732}," En un runner de GitHub Actions con 8 CPU, el build que tardaba 14 minutos con ",{"type":32,"tag":52,"props":1734,"children":1736},{"className":1735},[],[1737],{"type":37,"value":1738},"concurrency: 1",{"type":37,"value":1740}," se redujo a 3.2 minutos con ",{"type":32,"tag":52,"props":1742,"children":1744},{"className":1743},[],[1745],{"type":37,"value":1746},"concurrency: 8",{"type":37,"value":1748}," (800 páginas, promedio 1.2s por página). Sin embargo, concurrency > número de CPUs generalmente no aporta ganancia porque el renderizado SSR de Vue es CPU-intensive.",{"type":32,"tag":33,"props":1750,"children":1751},{},[1752,1754,1760],{"type":37,"value":1753},"La segunda optimización es code splitting. Nuxt 3 hace splitting basado en rutas por defecto, pero componentes grandes pueden aumentar el tamaño del bundle. Define chunks manualmente con ",{"type":32,"tag":52,"props":1755,"children":1757},{"className":1756},[],[1758],{"type":37,"value":1759},"vite.build.rollupOptions",{"type":37,"value":1761},":",{"type":32,"tag":93,"props":1763,"children":1765},{"className":95,"code":1764,"language":97,"meta":16,"style":16},"export default defineNuxtConfig({\n  vite: {\n    build: {\n      rollupOptions: {\n        output: {\n          manualChunks: {\n            'vendor': ['vue', '@vueuse\u002Fcore'],\n            'charts': ['chart.js', 'vue-chartjs'],\n            'markdown': ['marked', 'highlight.js']\n          }\n        }\n      }\n    }\n  }\n})\n",[1766],{"type":32,"tag":52,"props":1767,"children":1768},{"__ignoreMap":16},[1769,1788,1796,1804,1812,1820,1828,1860,1890,1920,1928,1936,1943,1950,1957],{"type":32,"tag":103,"props":1770,"children":1771},{"class":105,"line":106},[1772,1776,1780,1784],{"type":32,"tag":103,"props":1773,"children":1774},{"style":120},[1775],{"type":37,"value":123},{"type":32,"tag":103,"props":1777,"children":1778},{"style":120},[1779],{"type":37,"value":128},{"type":32,"tag":103,"props":1781,"children":1782},{"style":131},[1783],{"type":37,"value":134},{"type":32,"tag":103,"props":1785,"children":1786},{"style":137},[1787],{"type":37,"value":140},{"type":32,"tag":103,"props":1789,"children":1790},{"class":105,"line":116},[1791],{"type":32,"tag":103,"props":1792,"children":1793},{"style":137},[1794],{"type":37,"value":1795},"  vite: {\n",{"type":32,"tag":103,"props":1797,"children":1798},{"class":105,"line":143},[1799],{"type":32,"tag":103,"props":1800,"children":1801},{"style":137},[1802],{"type":37,"value":1803},"    build: {\n",{"type":32,"tag":103,"props":1805,"children":1806},{"class":105,"line":152},[1807],{"type":32,"tag":103,"props":1808,"children":1809},{"style":137},[1810],{"type":37,"value":1811},"      rollupOptions: {\n",{"type":32,"tag":103,"props":1813,"children":1814},{"class":105,"line":161},[1815],{"type":32,"tag":103,"props":1816,"children":1817},{"style":137},[1818],{"type":37,"value":1819},"        output: {\n",{"type":32,"tag":103,"props":1821,"children":1822},{"class":105,"line":186},[1823],{"type":32,"tag":103,"props":1824,"children":1825},{"style":137},[1826],{"type":37,"value":1827},"          manualChunks: {\n",{"type":32,"tag":103,"props":1829,"children":1830},{"class":105,"line":211},[1831,1836,1841,1846,1850,1855],{"type":32,"tag":103,"props":1832,"children":1833},{"style":195},[1834],{"type":37,"value":1835},"            'vendor'",{"type":32,"tag":103,"props":1837,"children":1838},{"style":137},[1839],{"type":37,"value":1840},": [",{"type":32,"tag":103,"props":1842,"children":1843},{"style":195},[1844],{"type":37,"value":1845},"'vue'",{"type":32,"tag":103,"props":1847,"children":1848},{"style":137},[1849],{"type":37,"value":178},{"type":32,"tag":103,"props":1851,"children":1852},{"style":195},[1853],{"type":37,"value":1854},"'@vueuse\u002Fcore'",{"type":32,"tag":103,"props":1856,"children":1857},{"style":137},[1858],{"type":37,"value":1859},"],\n",{"type":32,"tag":103,"props":1861,"children":1862},{"class":105,"line":26},[1863,1868,1872,1877,1881,1886],{"type":32,"tag":103,"props":1864,"children":1865},{"style":195},[1866],{"type":37,"value":1867},"            'charts'",{"type":32,"tag":103,"props":1869,"children":1870},{"style":137},[1871],{"type":37,"value":1840},{"type":32,"tag":103,"props":1873,"children":1874},{"style":195},[1875],{"type":37,"value":1876},"'chart.js'",{"type":32,"tag":103,"props":1878,"children":1879},{"style":137},[1880],{"type":37,"value":178},{"type":32,"tag":103,"props":1882,"children":1883},{"style":195},[1884],{"type":37,"value":1885},"'vue-chartjs'",{"type":32,"tag":103,"props":1887,"children":1888},{"style":137},[1889],{"type":37,"value":1859},{"type":32,"tag":103,"props":1891,"children":1892},{"class":105,"line":252},[1893,1898,1902,1907,1911,1916],{"type":32,"tag":103,"props":1894,"children":1895},{"style":195},[1896],{"type":37,"value":1897},"            'markdown'",{"type":32,"tag":103,"props":1899,"children":1900},{"style":137},[1901],{"type":37,"value":1840},{"type":32,"tag":103,"props":1903,"children":1904},{"style":195},[1905],{"type":37,"value":1906},"'marked'",{"type":32,"tag":103,"props":1908,"children":1909},{"style":137},[1910],{"type":37,"value":178},{"type":32,"tag":103,"props":1912,"children":1913},{"style":195},[1914],{"type":37,"value":1915},"'highlight.js'",{"type":32,"tag":103,"props":1917,"children":1918},{"style":137},[1919],{"type":37,"value":796},{"type":32,"tag":103,"props":1921,"children":1922},{"class":105,"line":261},[1923],{"type":32,"tag":103,"props":1924,"children":1925},{"style":137},[1926],{"type":37,"value":1927},"          }\n",{"type":32,"tag":103,"props":1929,"children":1930},{"class":105,"line":270},[1931],{"type":32,"tag":103,"props":1932,"children":1933},{"style":137},[1934],{"type":37,"value":1935},"        }\n",{"type":32,"tag":103,"props":1937,"children":1938},{"class":105,"line":298},[1939],{"type":32,"tag":103,"props":1940,"children":1941},{"style":137},[1942],{"type":37,"value":716},{"type":32,"tag":103,"props":1944,"children":1945},{"class":105,"line":326},[1946],{"type":32,"tag":103,"props":1947,"children":1948},{"style":137},[1949],{"type":37,"value":249},{"type":32,"tag":103,"props":1951,"children":1952},{"class":105,"line":354},[1953],{"type":32,"tag":103,"props":1954,"children":1955},{"style":137},[1956],{"type":37,"value":360},{"type":32,"tag":103,"props":1958,"children":1959},{"class":105,"line":363},[1960],{"type":32,"tag":103,"props":1961,"children":1962},{"style":137},[1963],{"type":37,"value":369},{"type":32,"tag":33,"props":1965,"children":1966},{},[1967,1969,1978],{"type":37,"value":1968},"Esta estrategia es crítica especialmente en proyectos ",{"type":32,"tag":1970,"props":1971,"children":1975},"a",{"href":1972,"rel":1973},"https:\u002F\u002Fwww.roibase.com.tr\u002Fes\u002Fheadless",[1974],"nofollow",[1976],{"type":37,"value":1977},"headless commerce",{"type":37,"value":1979}," — si aíslas SDK de Shopify, cliente CMS y biblioteca de analytics en chunks separados, el tamaño del bundle específico de ruta se reduce 40-50%.",{"type":32,"tag":33,"props":1981,"children":1982},{},[1983,1987],{"type":32,"tag":395,"props":1984,"children":1985},{},[1986],{"type":37,"value":399},{"type":37,"value":1988}," Bundle inicial de 2.1MB, después de manual chunks 680KB (gzip). Chunks específicos de ruta entre 120-200KB. LCP 3.4s → 1.8s (throttled a 4G).",{"type":32,"tag":40,"props":1990,"children":1992},{"id":1991},"incremental-static-regeneration-y-cache-invalidation",[1993],{"type":37,"value":1994},"Incremental Static Regeneration y Cache Invalidation",{"type":32,"tag":33,"props":1996,"children":1997},{},[1998,2000,2006],{"type":37,"value":1999},"La implementación de ISR de Nuxt 3 es diferente a Next.js — usa edge cache en lugar de funciones serverless. El parámetro ",{"type":32,"tag":52,"props":2001,"children":2003},{"className":2002},[],[2004],{"type":37,"value":2005},"swr",{"type":37,"value":2007}," define el TTL del cache, pero para revalidation on-demand necesitas escribir un endpoint personalizado:",{"type":32,"tag":93,"props":2009,"children":2011},{"className":95,"code":2010,"language":97,"meta":16,"style":16},"\u002F\u002F server\u002Fapi\u002Frevalidate.post.ts\nexport default defineEventHandler(async (event) => {\n  const body = await readBody(event)\n  const { token, paths } = body\n  \n  if (token !== process.env.REVALIDATE_TOKEN) {\n    throw createError({ statusCode: 401 })\n  }\n  \n  \u002F\u002F Limpiar cache de Nitro\n  const storage = useStorage('cache')\n  for (const path of paths) {\n    await storage.removeItem(path)\n  }\n  \n  return { revalidated: paths }\n})\n",[2012],{"type":32,"tag":52,"props":2013,"children":2014},{"__ignoreMap":16},[2015,2023,2066,2096,2136,2143,2176,2204,2211,2218,2226,2260,2292,2315,2322,2329,2341],{"type":32,"tag":103,"props":2016,"children":2017},{"class":105,"line":106},[2018],{"type":32,"tag":103,"props":2019,"children":2020},{"style":110},[2021],{"type":37,"value":2022},"\u002F\u002F server\u002Fapi\u002Frevalidate.post.ts\n",{"type":32,"tag":103,"props":2024,"children":2025},{"class":105,"line":116},[2026,2030,2034,2038,2042,2046,2050,2054,2058,2062],{"type":32,"tag":103,"props":2027,"children":2028},{"style":120},[2029],{"type":37,"value":123},{"type":32,"tag":103,"props":2031,"children":2032},{"style":120},[2033],{"type":37,"value":128},{"type":32,"tag":103,"props":2035,"children":2036},{"style":131},[2037],{"type":37,"value":1001},{"type":32,"tag":103,"props":2039,"children":2040},{"style":137},[2041],{"type":37,"value":1006},{"type":32,"tag":103,"props":2043,"children":2044},{"style":120},[2045],{"type":37,"value":1011},{"type":32,"tag":103,"props":2047,"children":2048},{"style":137},[2049],{"type":37,"value":1016},{"type":32,"tag":103,"props":2051,"children":2052},{"style":1019},[2053],{"type":37,"value":1022},{"type":32,"tag":103,"props":2055,"children":2056},{"style":137},[2057],{"type":37,"value":1027},{"type":32,"tag":103,"props":2059,"children":2060},{"style":120},[2061],{"type":37,"value":1032},{"type":32,"tag":103,"props":2063,"children":2064},{"style":137},[2065],{"type":37,"value":1037},{"type":32,"tag":103,"props":2067,"children":2068},{"class":105,"line":143},[2069,2073,2078,2082,2086,2091],{"type":32,"tag":103,"props":2070,"children":2071},{"style":120},[2072],{"type":37,"value":1045},{"type":32,"tag":103,"props":2074,"children":2075},{"style":170},[2076],{"type":37,"value":2077}," body",{"type":32,"tag":103,"props":2079,"children":2080},{"style":120},[2081],{"type":37,"value":1055},{"type":32,"tag":103,"props":2083,"children":2084},{"style":120},[2085],{"type":37,"value":1060},{"type":32,"tag":103,"props":2087,"children":2088},{"style":131},[2089],{"type":37,"value":2090}," readBody",{"type":32,"tag":103,"props":2092,"children":2093},{"style":137},[2094],{"type":37,"value":2095},"(event)\n",{"type":32,"tag":103,"props":2097,"children":2098},{"class":105,"line":152},[2099,2103,2108,2113,2117,2122,2126,2131],{"type":32,"tag":103,"props":2100,"children":2101},{"style":120},[2102],{"type":37,"value":1045},{"type":32,"tag":103,"props":2104,"children":2105},{"style":137},[2106],{"type":37,"value":2107}," { ",{"type":32,"tag":103,"props":2109,"children":2110},{"style":170},[2111],{"type":37,"value":2112},"token",{"type":32,"tag":103,"props":2114,"children":2115},{"style":137},[2116],{"type":37,"value":178},{"type":32,"tag":103,"props":2118,"children":2119},{"style":170},[2120],{"type":37,"value":2121},"paths",{"type":32,"tag":103,"props":2123,"children":2124},{"style":137},[2125],{"type":37,"value":346},{"type":32,"tag":103,"props":2127,"children":2128},{"style":120},[2129],{"type":37,"value":2130},"=",{"type":32,"tag":103,"props":2132,"children":2133},{"style":137},[2134],{"type":37,"value":2135}," body\n",{"type":32,"tag":103,"props":2137,"children":2138},{"class":105,"line":161},[2139],{"type":32,"tag":103,"props":2140,"children":2141},{"style":137},[2142],{"type":37,"value":1087},{"type":32,"tag":103,"props":2144,"children":2145},{"class":105,"line":186},[2146,2151,2156,2161,2166,2171],{"type":32,"tag":103,"props":2147,"children":2148},{"style":120},[2149],{"type":37,"value":2150},"  if",{"type":32,"tag":103,"props":2152,"children":2153},{"style":137},[2154],{"type":37,"value":2155}," (token ",{"type":32,"tag":103,"props":2157,"children":2158},{"style":120},[2159],{"type":37,"value":2160},"!==",{"type":32,"tag":103,"props":2162,"children":2163},{"style":137},[2164],{"type":37,"value":2165}," process.env.",{"type":32,"tag":103,"props":2167,"children":2168},{"style":170},[2169],{"type":37,"value":2170},"REVALIDATE_TOKEN",{"type":32,"tag":103,"props":2172,"children":2173},{"style":137},[2174],{"type":37,"value":2175},") {\n",{"type":32,"tag":103,"props":2177,"children":2178},{"class":105,"line":211},[2179,2184,2189,2194,2199],{"type":32,"tag":103,"props":2180,"children":2181},{"style":120},[2182],{"type":37,"value":2183},"    throw",{"type":32,"tag":103,"props":2185,"children":2186},{"style":131},[2187],{"type":37,"value":2188}," createError",{"type":32,"tag":103,"props":2190,"children":2191},{"style":137},[2192],{"type":37,"value":2193},"({ statusCode: ",{"type":32,"tag":103,"props":2195,"children":2196},{"style":170},[2197],{"type":37,"value":2198},"401",{"type":32,"tag":103,"props":2200,"children":2201},{"style":137},[2202],{"type":37,"value":2203}," })\n",{"type":32,"tag":103,"props":2205,"children":2206},{"class":105,"line":26},[2207],{"type":32,"tag":103,"props":2208,"children":2209},{"style":137},[2210],{"type":37,"value":360},{"type":32,"tag":103,"props":2212,"children":2213},{"class":105,"line":252},[2214],{"type":32,"tag":103,"props":2215,"children":2216},{"style":137},[2217],{"type":37,"value":1087},{"type":32,"tag":103,"props":2219,"children":2220},{"class":105,"line":261},[2221],{"type":32,"tag":103,"props":2222,"children":2223},{"style":110},[2224],{"type":37,"value":2225},"  \u002F\u002F Limpiar cache de Nitro\n",{"type":32,"tag":103,"props":2227,"children":2228},{"class":105,"line":270},[2229,2233,2238,2242,2247,2251,2256],{"type":32,"tag":103,"props":2230,"children":2231},{"style":120},[2232],{"type":37,"value":1045},{"type":32,"tag":103,"props":2234,"children":2235},{"style":170},[2236],{"type":37,"value":2237}," storage",{"type":32,"tag":103,"props":2239,"children":2240},{"style":120},[2241],{"type":37,"value":1055},{"type":32,"tag":103,"props":2243,"children":2244},{"style":131},[2245],{"type":37,"value":2246}," useStorage",{"type":32,"tag":103,"props":2248,"children":2249},{"style":137},[2250],{"type":37,"value":1006},{"type":32,"tag":103,"props":2252,"children":2253},{"style":195},[2254],{"type":37,"value":2255},"'cache'",{"type":32,"tag":103,"props":2257,"children":2258},{"style":137},[2259],{"type":37,"value":1079},{"type":32,"tag":103,"props":2261,"children":2262},{"class":105,"line":298},[2263,2268,2272,2277,2282,2287],{"type":32,"tag":103,"props":2264,"children":2265},{"style":120},[2266],{"type":37,"value":2267},"  for",{"type":32,"tag":103,"props":2269,"children":2270},{"style":137},[2271],{"type":37,"value":1016},{"type":32,"tag":103,"props":2273,"children":2274},{"style":120},[2275],{"type":37,"value":2276},"const",{"type":32,"tag":103,"props":2278,"children":2279},{"style":170},[2280],{"type":37,"value":2281}," path",{"type":32,"tag":103,"props":2283,"children":2284},{"style":120},[2285],{"type":37,"value":2286}," of",{"type":32,"tag":103,"props":2288,"children":2289},{"style":137},[2290],{"type":37,"value":2291}," paths) {\n",{"type":32,"tag":103,"props":2293,"children":2294},{"class":105,"line":326},[2295,2300,2305,2310],{"type":32,"tag":103,"props":2296,"children":2297},{"style":120},[2298],{"type":37,"value":2299},"    await",{"type":32,"tag":103,"props":2301,"children":2302},{"style":137},[2303],{"type":37,"value":2304}," storage.",{"type":32,"tag":103,"props":2306,"children":2307},{"style":131},[2308],{"type":37,"value":2309},"removeItem",{"type":32,"tag":103,"props":2311,"children":2312},{"style":137},[2313],{"type":37,"value":2314},"(path)\n",{"type":32,"tag":103,"props":2316,"children":2317},{"class":105,"line":354},[2318],{"type":32,"tag":103,"props":2319,"children":2320},{"style":137},[2321],{"type":37,"value":360},{"type":32,"tag":103,"props":2323,"children":2324},{"class":105,"line":363},[2325],{"type":32,"tag":103,"props":2326,"children":2327},{"style":137},[2328],{"type":37,"value":1087},{"type":32,"tag":103,"props":2330,"children":2331},{"class":105,"line":653},[2332,2336],{"type":32,"tag":103,"props":2333,"children":2334},{"style":120},[2335],{"type":37,"value":1232},{"type":32,"tag":103,"props":2337,"children":2338},{"style":137},[2339],{"type":37,"value":2340}," { revalidated: paths }\n",{"type":32,"tag":103,"props":2342,"children":2343},{"class":105,"line":670},[2344],{"type":32,"tag":103,"props":2345,"children":2346},{"style":137},[2347],{"type":37,"value":369},{"type":32,"tag":33,"props":2349,"children":2350},{},[2351],{"type":37,"value":2352},"Disparo desde webhook de Shopify:",{"type":32,"tag":93,"props":2354,"children":2356},{"className":95,"code":2355,"language":97,"meta":16,"style":16},"\u002F\u002F Cuando se actualiza un producto en el CMS:\nawait fetch('https:\u002F\u002Fexample.com\u002Fapi\u002Frevalidate', {\n  method: 'POST',\n  body: JSON.stringify({\n    token: 'xxx',\n    paths: ['\u002Fproduct\u002Fexample-slug', '\u002Fcategory\u002Felectronics']\n  })\n})\n",[2357],{"type":32,"tag":52,"props":2358,"children":2359},{"__ignoreMap":16},[2360,2368,2395,2412,2438,2455,2481,2489],{"type":32,"tag":103,"props":2361,"children":2362},{"class":105,"line":106},[2363],{"type":32,"tag":103,"props":2364,"children":2365},{"style":110},[2366],{"type":37,"value":2367},"\u002F\u002F Cuando se actualiza un producto en el CMS:\n",{"type":32,"tag":103,"props":2369,"children":2370},{"class":105,"line":116},[2371,2376,2381,2385,2390],{"type":32,"tag":103,"props":2372,"children":2373},{"style":120},[2374],{"type":37,"value":2375},"await",{"type":32,"tag":103,"props":2377,"children":2378},{"style":131},[2379],{"type":37,"value":2380}," fetch",{"type":32,"tag":103,"props":2382,"children":2383},{"style":137},[2384],{"type":37,"value":1006},{"type":32,"tag":103,"props":2386,"children":2387},{"style":195},[2388],{"type":37,"value":2389},"'https:\u002F\u002Fexample.com\u002Fapi\u002Frevalidate'",{"type":32,"tag":103,"props":2391,"children":2392},{"style":137},[2393],{"type":37,"value":2394},", {\n",{"type":32,"tag":103,"props":2396,"children":2397},{"class":105,"line":143},[2398,2403,2408],{"type":32,"tag":103,"props":2399,"children":2400},{"style":137},[2401],{"type":37,"value":2402},"  method: ",{"type":32,"tag":103,"props":2404,"children":2405},{"style":195},[2406],{"type":37,"value":2407},"'POST'",{"type":32,"tag":103,"props":2409,"children":2410},{"style":137},[2411],{"type":37,"value":667},{"type":32,"tag":103,"props":2413,"children":2414},{"class":105,"line":152},[2415,2420,2425,2429,2434],{"type":32,"tag":103,"props":2416,"children":2417},{"style":137},[2418],{"type":37,"value":2419},"  body: ",{"type":32,"tag":103,"props":2421,"children":2422},{"style":170},[2423],{"type":37,"value":2424},"JSON",{"type":32,"tag":103,"props":2426,"children":2427},{"style":137},[2428],{"type":37,"value":1157},{"type":32,"tag":103,"props":2430,"children":2431},{"style":131},[2432],{"type":37,"value":2433},"stringify",{"type":32,"tag":103,"props":2435,"children":2436},{"style":137},[2437],{"type":37,"value":140},{"type":32,"tag":103,"props":2439,"children":2440},{"class":105,"line":161},[2441,2446,2451],{"type":32,"tag":103,"props":2442,"children":2443},{"style":137},[2444],{"type":37,"value":2445},"    token: ",{"type":32,"tag":103,"props":2447,"children":2448},{"style":195},[2449],{"type":37,"value":2450},"'xxx'",{"type":32,"tag":103,"props":2452,"children":2453},{"style":137},[2454],{"type":37,"value":667},{"type":32,"tag":103,"props":2456,"children":2457},{"class":105,"line":186},[2458,2463,2468,2472,2477],{"type":32,"tag":103,"props":2459,"children":2460},{"style":137},[2461],{"type":37,"value":2462},"    paths: [",{"type":32,"tag":103,"props":2464,"children":2465},{"style":195},[2466],{"type":37,"value":2467},"'\u002Fproduct\u002Fexample-slug'",{"type":32,"tag":103,"props":2469,"children":2470},{"style":137},[2471],{"type":37,"value":178},{"type":32,"tag":103,"props":2473,"children":2474},{"style":195},[2475],{"type":37,"value":2476},"'\u002Fcategory\u002Felectronics'",{"type":32,"tag":103,"props":2478,"children":2479},{"style":137},[2480],{"type":37,"value":796},{"type":32,"tag":103,"props":2482,"children":2483},{"class":105,"line":211},[2484],{"type":32,"tag":103,"props":2485,"children":2486},{"style":137},[2487],{"type":37,"value":2488},"  })\n",{"type":32,"tag":103,"props":2490,"children":2491},{"class":105,"line":26},[2492],{"type":32,"tag":103,"props":2493,"children":2494},{"style":137},[2495],{"type":37,"value":369},{"type":32,"tag":33,"props":2497,"children":2498},{},[2499],{"type":37,"value":2500},"Este patrón actualiza contenido stale sin ejecutar un rebuild completo. En un sitio con 5000 productos donde 50 cambian diariamente, el costo de ISR + revalidation on-demand es 12x más bajo que un rebuild completo (Vercel edge request pricing, enero 2026).",{"type":32,"tag":40,"props":2502,"children":2504},{"id":2503},"conclusión",[2505],{"type":37,"value":2506},"Conclusión",{"type":32,"tag":33,"props":2508,"children":2509},{},[2510],{"type":37,"value":2511},"La arquitectura SSG de Nuxt 3 con rendering híbrido te permite optimizar el tiempo de build. Route rules ofrecen control granular, crawling basado en sitemap para prerender dinámico, e ISR para gestionar cache en runtime. Combinados, incluso sitios de 10.000+ páginas logran build en menos de 10 minutos. Las decisiones críticas son: qué rutas prerender, cuáles usar ISR y cuáles dejar en runtime — esta decisión equilibra Core Web Vitals, costo y freshness del contenido. Automatización de sitemap.xml y prerender paralelo son las claves de la escalabilidad.",{"type":32,"tag":2513,"props":2514,"children":2515},"style",{},[2516],{"type":37,"value":2517},"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":143,"depth":143,"links":2519},[2520,2521,2522,2523,2524,2525],{"id":42,"depth":116,"text":45},{"id":412,"depth":116,"text":415},{"id":955,"depth":116,"text":958},{"id":1585,"depth":116,"text":1588},{"id":1991,"depth":116,"text":1994},{"id":2503,"depth":116,"text":2506},"markdown","content:es:tech:estrategias-prerender-nuxt-3-optimizacion-build.md","content","es\u002Ftech\u002Festrategias-prerender-nuxt-3-optimizacion-build.md","es\u002Ftech\u002Festrategias-prerender-nuxt-3-optimizacion-build","md",1783289077189]