{"componentChunkName":"component---src-templates-blog-post-blog-post-js","path":"/metodos-de-renderizado/","result":{"data":{"site":{"siteMetadata":{"title":"girgetto.it","siteUrl":"https://girgetto.it","author":{"name":"Girgetto"}}},"markdownRemark":{"id":"59e596a5-eb08-5936-9cf4-6018d73d3d8d","excerpt":"Los frameworks modernos de frontend ofrecen varias estrategias para entregar contenido al navegador. Elegir la correcta puede afectar drásticamente el…","html":"<p>Los frameworks modernos de frontend ofrecen varias estrategias para entregar contenido al navegador. Elegir la correcta puede afectar drásticamente el rendimiento, el SEO y la experiencia del usuario. Este artículo cubre los cuatro métodos de renderizado más importantes — <strong>CSR</strong>, <strong>SSR</strong>, <strong>SSG</strong> e <strong>Hidratación</strong> — con un diagrama para cada uno.</p>\n<hr>\n<h2 id=\"client-side-rendering-csr\" style=\"position:relative;\"><a href=\"#client-side-rendering-csr\" aria-label=\"client side rendering csr permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Client-Side Rendering (CSR)</h2>\n<p>En CSR el navegador descarga una carcasa HTML mínima y un bundle de JavaScript. El JS se ejecuta en el navegador, obtiene los datos y construye la página completa en el cliente.</p>\n<p><strong>Frameworks:</strong> React (CRA / Vite SPA), Vue (Vite SPA), Angular</p>\n<div class=\"mermaid\">\nsequenceDiagram\n    participant B as 🌐 Navegador\n    participant S as 🖥️ Servidor\n\n    B->>S: GET /index.html\n    S-->>B: HTML vacío ⟨div id=\"root\"⟩⟨/div⟩\n    B->>S: GET /bundle.js\n    S-->>B: bundle.js (~500 KB)\n    Note over B: El JS se ejecuta — construye el DOM\n    B->>S: fetch('/api/datos')\n    S-->>B: Datos JSON\n    Note over B: UI completamente renderizada ✅\n</div>\n<h3 id=\"cómo-funciona-el-csr-paso-a-paso\" style=\"position:relative;\"><a href=\"#c%C3%B3mo-funciona-el-csr-paso-a-paso\" aria-label=\"cómo funciona el csr paso a paso permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Cómo funciona el CSR paso a paso</h3>\n<ol>\n<li>El navegador solicita la página → el servidor devuelve un archivo HTML casi vacío</li>\n<li>El navegador descarga el bundle de JavaScript</li>\n<li>El JS se ejecuta en el navegador y construye el DOM</li>\n<li>Se obtienen datos de las APIs y se renderiza la interfaz</li>\n</ol>\n<blockquote>\n<p><strong>⚠️ La página está completamente en blanco hasta que el bundle de JS se ha descargado y ejecutado.</strong> Esto perjudica tanto el rendimiento percibido como los crawlers de SEO que no ejecutan JS.</p>\n</blockquote>\n<h3 id=\"ventajas-y-desventajas\" style=\"position:relative;\"><a href=\"#ventajas-y-desventajas\" aria-label=\"ventajas y desventajas permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Ventajas y desventajas</h3>\n<table>\n<thead>\n<tr>\n<th>✅ Ventajas</th>\n<th>❌ Desventajas</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Interacciones ricas, tipo aplicación</td>\n<td>Carga inicial lenta (pantalla en blanco)</td>\n</tr>\n<tr>\n<td>Baja carga en el servidor</td>\n<td>SEO deficiente por defecto</td>\n</tr>\n<tr>\n<td>Despliegue sencillo (hosting estático)</td>\n<td>Bundles de JS grandes</td>\n</tr>\n<tr>\n<td>Navegación rápida tras la primera carga</td>\n<td>Requiere JS habilitado</td>\n</tr>\n</tbody>\n</table>\n<blockquote>\n<p><strong>Ideal para:</strong> Dashboards, paneles de administración, apps detrás de un login, herramientas en tiempo real.</p>\n</blockquote>\n<hr>\n<h2 id=\"server-side-rendering-ssr\" style=\"position:relative;\"><a href=\"#server-side-rendering-ssr\" aria-label=\"server side rendering ssr permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Server-Side Rendering (SSR)</h2>\n<p>Con SSR el servidor genera el HTML completo en cada solicitud. El navegador recibe una página completa y legible de inmediato. Después el JavaScript se ejecuta para hacer la página interactiva.</p>\n<p><strong>Frameworks:</strong> Next.js (<code>getServerSideProps</code>), Nuxt.js, SvelteKit, Remix</p>\n<div class=\"mermaid\">\nsequenceDiagram\n    participant B as 🌐 Navegador\n    participant S as 🖥️ Servidor\n    participant D as 🗄️ Base de datos / API\n\n    B->>S: GET /pagina\n    S->>D: Consulta de datos\n    D-->>S: Respuesta con datos\n    Note over S: Renderiza el HTML completo en el servidor\n    S-->>B: Página HTML completa ✅\n    Note over B: Contenido visible de inmediato (FCP rápido)\n    B->>S: GET /bundle.js\n    S-->>B: Bundle JS\n    Note over B: Hidratación — la página se vuelve interactiva ✅\n</div>\n<h3 id=\"cómo-funciona-el-ssr-paso-a-paso\" style=\"position:relative;\"><a href=\"#c%C3%B3mo-funciona-el-ssr-paso-a-paso\" aria-label=\"cómo funciona el ssr paso a paso permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Cómo funciona el SSR paso a paso</h3>\n<ol>\n<li>El navegador envía una solicitud para una página</li>\n<li>El servidor obtiene datos de la base de datos o API</li>\n<li>El servidor renderiza el HTML completo y lo envía al navegador</li>\n<li>El navegador muestra el HTML de inmediato (First Contentful Paint rápido)</li>\n<li>El navegador descarga el JS e <strong>hidrata</strong> la página para agregar interactividad</li>\n</ol>\n<blockquote>\n<p><strong>⚠️ Todo este ciclo se ejecuta en cada solicitud.</strong> El servidor debe estar disponible, ser rápido y escalar horizontalmente.</p>\n</blockquote>\n<h3 id=\"ventajas-y-desventajas-1\" style=\"position:relative;\"><a href=\"#ventajas-y-desventajas-1\" aria-label=\"ventajas y desventajas 1 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Ventajas y desventajas</h3>\n<table>\n<thead>\n<tr>\n<th>✅ Ventajas</th>\n<th>❌ Desventajas</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Excelente SEO</td>\n<td>Mayor carga en el servidor por solicitud</td>\n</tr>\n<tr>\n<td>Pintura inicial rápida (contenido visible)</td>\n<td>Infraestructura más compleja</td>\n</tr>\n<tr>\n<td>Datos dinámicos y siempre frescos</td>\n<td>Retrasos de arranque en frío (serverless)</td>\n</tr>\n<tr>\n<td>Funciona sin JS</td>\n<td>Más lento que servir archivos estáticos</td>\n</tr>\n</tbody>\n</table>\n<blockquote>\n<p><strong>Ideal para:</strong> Páginas de productos en e-commerce, artículos de noticias, páginas que necesitan datos frescos en cada visita.</p>\n</blockquote>\n<hr>\n<h2 id=\"static-site-generation-ssg\" style=\"position:relative;\"><a href=\"#static-site-generation-ssg\" aria-label=\"static site generation ssg permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Static Site Generation (SSG)</h2>\n<p>SSG pre-renderiza todas las páginas en <strong>tiempo de compilación</strong>. El resultado es un conjunto de archivos HTML estáticos desplegados en una CDN. No se necesita servidor en tiempo de solicitud.</p>\n<p><strong>Frameworks:</strong> Next.js (<code>getStaticProps</code>), Gatsby, Astro, Hugo, Eleventy</p>\n<div class=\"mermaid\">\nflowchart TD\n    subgraph Build[\"🔨 Tiempo de Compilación — se ejecuta una vez\"]\n        C[\"📁 Contenido\\nMD / JSON / CMS\"] --> BT[\"⚙️ Herramienta de Build\\nNext.js / Gatsby\"]\n        BT --> H[\"📄 Archivos HTML Estáticos\"]\n        H --> D[\"🚀 Despliegue a CDN\\nVercel / Netlify / S3\"]\n    end\n\n    subgraph Runtime[\"🌍 Tiempo de Solicitud — instantáneo\"]\n        Browser[\"🌐 Navegador\"] -->|\"GET /pagina\"| Edge[\"☁️ Nodo CDN Edge\\ncaché global\"]\n        Edge -->|\"HTML pre-construido ⚡\"| Browser\n    end\n\n    D --> Edge\n</div>\n<h3 id=\"cómo-funciona-el-ssg-paso-a-paso\" style=\"position:relative;\"><a href=\"#c%C3%B3mo-funciona-el-ssg-paso-a-paso\" aria-label=\"cómo funciona el ssg paso a paso permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Cómo funciona el SSG paso a paso</h3>\n<ol>\n<li>En <strong>tiempo de compilación</strong>, el framework obtiene todos los datos y renderiza cada página a HTML</li>\n<li>Los archivos HTML se suben a una CDN</li>\n<li>En <strong>tiempo de solicitud</strong>, el navegador obtiene el HTML pre-construido del nodo CDN más cercano — sin ejecución en el servidor</li>\n</ol>\n<blockquote>\n<p><strong>⚠️ Los datos pueden quedar desactualizados entre compilaciones.</strong> Se requiere un nuevo despliegue para cambios de contenido, a menos que se use ISR (Incremental Static Regeneration).</p>\n</blockquote>\n<h3 id=\"ventajas-y-desventajas-2\" style=\"position:relative;\"><a href=\"#ventajas-y-desventajas-2\" aria-label=\"ventajas y desventajas 2 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Ventajas y desventajas</h3>\n<table>\n<thead>\n<tr>\n<th>✅ Ventajas</th>\n<th>❌ Desventajas</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Extremadamente rápido (archivos desde CDN)</td>\n<td>Los datos pueden quedar desactualizados</td>\n</tr>\n<tr>\n<td>Excelente SEO</td>\n<td>Se requiere recompilar para cambios de contenido</td>\n</tr>\n<tr>\n<td>Altamente escalable (sin servidor)</td>\n<td>Tiempos de build largos en sitios grandes</td>\n</tr>\n<tr>\n<td>Muy seguro</td>\n<td>No apto para páginas personalizadas por usuario</td>\n</tr>\n</tbody>\n</table>\n<blockquote>\n<p><strong>Ideal para:</strong> Blogs, sitios de documentación, páginas de marketing, portfolios.</p>\n</blockquote>\n<hr>\n<h2 id=\"hidratación\" style=\"position:relative;\"><a href=\"#hidrataci%C3%B3n\" aria-label=\"hidratación permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Hidratación</h2>\n<p>La hidratación es el proceso que hace <strong>interactiva</strong> una página renderizada en el servidor o generada estáticamente. El navegador recibe el HTML completo (pintura rápida), luego se carga el JS y se \"conecta\" al DOM existente — adjuntando event listeners y estado sin volver a renderizar.</p>\n<div class=\"mermaid\">\nflowchart TD\n    A[\"① HTML del Servidor\\n📄 HTML completo enviado\\nVisible ✅\\nNo Interactivo ❌\"]\n    B[\"② Bundle JS Cargando\\n⬇️ Descargando...\\nVisible ✅\\nNo Interactivo ❌\"]\n    C[\"③ Hidratando\\n💧 Adjuntando eventos\\nVisible ✅\\nParcial ⚠️\"]\n    D[\"④ Interactivo\\n✅ El framework controla el DOM\\nVisible ✅\\nInteractivo ✅\"]\n\n    A -->|El navegador recibe| B\n    B -->|JS se ejecuta| C\n    C -->|Completo| D\n\n    style A fill:#f1f5f9,stroke:#94a3b8,color:#334155\n    style B fill:#dbeafe,stroke:#3b82f6,color:#1e40af\n    style C fill:#fef9c3,stroke:#eab308,color:#713f12\n    style D fill:#dcfce7,stroke:#22c55e,color:#166534\n</div>\n<h3 id=\"el-problema-de-la-hidratación\" style=\"position:relative;\"><a href=\"#el-problema-de-la-hidrataci%C3%B3n\" aria-label=\"el problema de la hidratación permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>El problema de la Hidratación</h3>\n<p>La hidratación introduce el concepto de <strong>Time To Interactive (TTI)</strong>: la página <em>parece</em> lista pero <strong>no es clicable</strong> hasta que el JS termina de hidratarse. En redes lentas o bundles de JS grandes, esta brecha frustra a los usuarios.</p>\n<deckgo-highlight-code   >\n          <code slot=\"code\">FCP ─────────────────────────────────► TTI\n(página visible)                      (página usable)\n     │◄─── JS descarga + hidrata ────►│</code>\n        </deckgo-highlight-code>\n<h3 id=\"soluciones-modernas\" style=\"position:relative;\"><a href=\"#soluciones-modernas\" aria-label=\"soluciones modernas permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Soluciones modernas</h3>\n<ul>\n<li><strong>Hidratación Parcial</strong> — solo hidratar componentes interactivos (Astro Islands)</li>\n<li><strong>Hidratación Progresiva</strong> — hidratar a medida que los componentes entran en el viewport</li>\n<li><strong>Resumability</strong> — saltar la hidratación completamente serializando el estado (Qwik)</li>\n</ul>\n<hr>\n<h2 id=\"comparación-de-todos-los-métodos\" style=\"position:relative;\"><a href=\"#comparaci%C3%B3n-de-todos-los-m%C3%A9todos\" aria-label=\"comparación de todos los métodos permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Comparación de todos los métodos</h2>\n<div class=\"mermaid\">\nquadrantChart\n    title Velocidad vs SEO — Dónde se sitúa cada método\n    x-axis \"Carga inicial lenta\" --> \"Carga inicial rápida\"\n    y-axis \"SEO deficiente\" --> \"SEO excelente\"\n    quadrant-1 Ideal\n    quadrant-2 Bueno para contenido\n    quadrant-3 Uso limitado\n    quadrant-4 Orientado a apps\n    CSR: [0.40, 0.15]\n    SSR: [0.58, 0.88]\n    SSG: [0.92, 0.92]\n    Hybrid SSR+SSG: [0.75, 0.88]\n</div>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>CSR</th>\n<th>SSR</th>\n<th>SSG</th>\n<th>Híbrido (SSR+SSG)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Velocidad de carga inicial</strong></td>\n<td>🔴 Lenta</td>\n<td>🟡 Media</td>\n<td>🟢 Rápida</td>\n<td>🟢 Rápida</td>\n</tr>\n<tr>\n<td><strong>SEO</strong></td>\n<td>🔴 Deficiente</td>\n<td>🟢 Excelente</td>\n<td>🟢 Excelente</td>\n<td>🟢 Excelente</td>\n</tr>\n<tr>\n<td><strong>Frescura de datos</strong></td>\n<td>🟢 Tiempo real</td>\n<td>🟢 Por solicitud</td>\n<td>🔴 Tiempo de build</td>\n<td>🟡 Configurable</td>\n</tr>\n<tr>\n<td><strong>Coste de servidor</strong></td>\n<td>🟢 Bajo</td>\n<td>🔴 Alto</td>\n<td>🟢 Ninguno</td>\n<td>🟡 Medio</td>\n</tr>\n<tr>\n<td><strong>Escalabilidad</strong></td>\n<td>🟡 Media</td>\n<td>🔴 Más difícil</td>\n<td>🟢 Excelente</td>\n<td>🟢 Buena</td>\n</tr>\n<tr>\n<td><strong>Interactividad</strong></td>\n<td>🟢 Rica</td>\n<td>🟡 Tras hidratación</td>\n<td>🟡 Tras hidratación</td>\n<td>🟡 Tras hidratación</td>\n</tr>\n<tr>\n<td><strong>Complejidad</strong></td>\n<td>🟢 Simple</td>\n<td>🟡 Media</td>\n<td>🟢 Simple</td>\n<td>🔴 Compleja</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2 id=\"cuándo-usar-cada-método\" style=\"position:relative;\"><a href=\"#cu%C3%A1ndo-usar-cada-m%C3%A9todo\" aria-label=\"cuándo usar cada método permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Cuándo usar cada método</h2>\n<p><strong>Usa CSR cuando:</strong></p>\n<ul>\n<li>Construyes apps con autenticación (dashboards, paneles de administración)</li>\n<li>Los datos cambian frecuentemente y el SEO no importa</li>\n<li>Necesitas interacciones complejas del lado del cliente</li>\n</ul>\n<p><strong>Usa SSR cuando:</strong></p>\n<ul>\n<li>Las páginas necesitan datos frescos en cada solicitud</li>\n<li>El SEO es crítico y el contenido cambia frecuentemente</li>\n<li>Construyes plataformas de e-commerce o redes sociales</li>\n</ul>\n<p><strong>Usa SSG cuando:</strong></p>\n<ul>\n<li>El contenido no cambia frecuentemente (blogs, docs, portfolios)</li>\n<li>Quieres máxima velocidad y coste de servidor cero</li>\n<li>Las páginas son iguales para todos los usuarios</li>\n</ul>\n<p><strong>Usa Híbrido (SSG + SSR + ISR) cuando:</strong></p>\n<ul>\n<li>Algunas páginas son estáticas y otras dinámicas</li>\n<li>Necesitas reconstrucciones incrementales (ISR) para mantener las páginas estáticas actualizadas</li>\n<li>Quieres control del método de renderizado por página</li>\n</ul>\n<hr>\n<blockquote>\n<p><strong>El consenso moderno:</strong> La mayoría de las apps en producción se benefician de un enfoque híbrido. Frameworks como Next.js, Nuxt.js y SvelteKit permiten elegir la estrategia de renderizado <strong>por página</strong>, de forma que puedes generar estáticamente tus páginas de marketing mientras renderizas en servidor tus listados de productos y en cliente tu dashboard.</p>\n</blockquote>","fields":{"slug":"/metodos-de-renderizado/"},"wordCount":{"words":931},"frontmatter":{"title":"Métodos de Renderizado: CSR, SSR, SSG e Hidratación","isoDate":"2026-03-19","isoUpdated":null,"description":"Un análisis profundo de las principales estrategias de renderizado en frontend — Client-Side Rendering, Server-Side Rendering, Static Site Generation e Hidratación — con diagramas para cada una.","lang":"es","img":"https://i.postimg.cc/T3kBzrqr/rendering-methods.webp"},"tableOfContents":"<ul>\n<li>\n<p><a href=\"#client-side-rendering-csr\">Client-Side Rendering (CSR)</a></p>\n<ul>\n<li><a href=\"#c%C3%B3mo-funciona-el-csr-paso-a-paso\">Cómo funciona el CSR paso a paso</a></li>\n<li><a href=\"#ventajas-y-desventajas\">Ventajas y desventajas</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#server-side-rendering-ssr\">Server-Side Rendering (SSR)</a></p>\n<ul>\n<li><a href=\"#c%C3%B3mo-funciona-el-ssr-paso-a-paso\">Cómo funciona el SSR paso a paso</a></li>\n<li><a href=\"#ventajas-y-desventajas-1\">Ventajas y desventajas</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#static-site-generation-ssg\">Static Site Generation (SSG)</a></p>\n<ul>\n<li><a href=\"#c%C3%B3mo-funciona-el-ssg-paso-a-paso\">Cómo funciona el SSG paso a paso</a></li>\n<li><a href=\"#ventajas-y-desventajas-2\">Ventajas y desventajas</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#hidrataci%C3%B3n\">Hidratación</a></p>\n<ul>\n<li><a href=\"#el-problema-de-la-hidrataci%C3%B3n\">El problema de la Hidratación</a></li>\n<li><a href=\"#soluciones-modernas\">Soluciones modernas</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#comparaci%C3%B3n-de-todos-los-m%C3%A9todos\">Comparación de todos los métodos</a></p>\n</li>\n<li>\n<p><a href=\"#cu%C3%A1ndo-usar-cada-m%C3%A9todo\">Cuándo usar cada método</a></p>\n</li>\n</ul>"},"translations":{"nodes":[{"fields":{"slug":"/en/rendering-methods/"},"frontmatter":{"lang":"en"}}]},"previous":{"fields":{"slug":"/password-seguridad/"},"frontmatter":{"title":"Seguridad de Contraseñas - Cómo se hackean y cómo protegerte"}},"next":{"fields":{"slug":"/es6-javascript/"},"frontmatter":{"title":"Guía esencial de ES6: Las features que transformaron JavaScript"}}},"pageContext":{"id":"59e596a5-eb08-5936-9cf4-6018d73d3d8d","previousPostId":"2f83cf33-e6f1-54bc-94d5-753ee0723f8a","nextPostId":"e65a2fd1-5a4e-520c-81aa-1d1c693a4c8d","baseSlug":"/rendering-methods/","locale":"es"}},"staticQueryHashes":["4035521183"],"slicesMap":{}}