Flaancs.devFlaancs.dev

Optimización del Rendimiento en Next.js: SSR, SSG, e ISR Explicados

Por FlaancsAugust 7, 2024 2:30 PM

Main Image

Next.js es un framework popular que permite a los desarrolladores construir aplicaciones web eficientes y de alto rendimiento. Ofrece varias estrategias de renderizado, como el renderizado del lado del servidor (SSR), la generación de sitios estáticos (SSG) y la regeneración estática incremental (ISR). En este post, exploraremos cómo estas estrategias pueden optimizar el rendimiento de tu aplicación Next.js.

Renderizado del Lado del Servidor (SSR)

El SSR, o renderizado del lado del servidor, es una técnica en la que el contenido de la página se genera en el servidor cada vez que un usuario realiza una solicitud. Esto significa que el servidor prepara el HTML completo, incluyendo los datos dinámicos necesarios, antes de enviarlo al navegador del cliente. Este enfoque es particularmente útil para mejorar la visibilidad en los motores de búsqueda y acelerar el tiempo hasta el primer byte (TTFB), ya que el contenido ya está listo para ser renderizado en el navegador tan pronto como llega.

Ventajas del SSR:

  • Mejora del SEO: Al servir el HTML completamente renderizado, los motores de búsqueda pueden indexar el contenido de manera más efectiva.
  • Mejora del TTFB: El contenido se muestra más rápidamente al usuario, ya que el HTML inicial ya está renderizado.
  • Contenido siempre actualizado: Ideal para páginas que requieren datos actualizados en tiempo real.

Desventajas del SSR:

  • Mayor carga en el servidor: Cada solicitud requiere una renderización en el servidor, lo que puede aumentar el uso de recursos.
  • Tiempo de respuesta puede aumentar: Especialmente en aplicaciones complejas o con carga pesada de datos.

Ejemplo de SSR en Next.js con TypeScript:

1import { GetServerSideProps, NextPage } from 'next';
2import { Product } from '../interfaces/Product';
3
4interface Props {
5  products: Product[];
6}
7
8const Home: NextPage<Props> = ({ products }) => {
9  return (
10    <div>
11      {products.map((product) => (
12        <div key={product.id}>{product.name}</div>
13      ))}
14    </div>
15  );
16};
17
18export const getServerSideProps: GetServerSideProps = async () => {
19  const res = await fetch('https://api.example.com/products');
20  const products: Product[] = await res.json();
21
22  return {
23    props: {
24      products,
25    },
26  };
27};
28
29export default Home;

Este código utiliza getServerSideProps para buscar datos de productos del servidor en cada solicitud, lo que permite que la página se pre-renderice con los datos actualizados.

Generación de Sitios Estáticos (SSG)

La SSG, o generación de sitios estáticos, implica generar el HTML de las páginas durante el proceso de build. Una vez generado, el HTML se puede servir desde un CDN, lo que reduce la carga en el servidor y permite tiempos de carga de página extremadamente rápidos. Esta técnica es ideal para sitios web con contenido que no cambia frecuentemente.

Ventajas del SSG:

  • Rendimiento superior: Al servir páginas estáticas desde un CDN, se minimizan los tiempos de carga.
  • Reducción de la carga del servidor: No hay procesos de renderización en el servidor para cada petición.

Desventajas del SSG:

  • No ideal para contenido dinámico: Cada cambio requiere un nuevo despliegue del sitio.
  • El tiempo de build puede ser largo: Especialmente en sitios grandes, donde cada página debe ser generada en el build.

Ejemplo de SSG en Next.js con TypeScript:

1import { GetStaticProps, NextPage } from 'next';
2import { Product } from '../interfaces/Product';
3
4interface Props {
5  products: Product[];
6}
7
8const ProductsPage: NextPage<Props> = ({ products }) => {
9  return (
10    <div>
11      {products.map((product) => (
12        <div key={product.id}>{product.name}</div>
13      ))}
14    </div>
15  );
16};
17
18export const getStaticProps: GetStaticProps = async () => {
19  const res = await fetch('https://api.example.com/products');
20  const products: Product[] = await res.json();
21
22  return {
23    props: {
24      products,
25    },
26  };
27};
28
29export default ProductsPage;

En este caso, getStaticProps se usa para generar la página estáticamente en el momento del build.

Regeneración Estática Incremental (ISR)

ISR es una característica de Next.js que permite combinar las ventajas de SSR y SSG. Con ISR, las páginas se generan estáticamente en el momento del build y pueden ser invalidadas y regeneradas en base a una política definida. Esto significa que se pueden actualizar las páginas estáticas sin necesidad de hacer un nuevo build y desplegar todo el sitio.

Ventajas del ISR:

  • Mejor equilibrio entre rendimiento y actualización de contenido: Las páginas se cargan rápidamente desde un CDN, pero aún pueden actualizarse dinámicamente.
  • Reducción de la carga del servidor: Aunque permite contenido actualizado, no requiere renderización en el servidor para cada visita.
  • Flexibilidad: Ideal para sitios que tienen contenido que cambia ocasionalmente, permitiendo actualizaciones sin generar un nuevo build.

Desventajas del ISR:

  • Configuración y gestión más complejas: Requiere una configuración cuidadosa para equilibrar la frecuencia de las regeneraciones y el rendimiento.
  • Posibles retrasos en la actualización del contenido: Dependiendo de la política de regeneración, puede haber una demora hasta que el contenido actualizado se muestre a todos los usuarios.

Ejemplo de ISR en Next.js con TypeScript:

1import { GetStaticProps, NextPage } from 'next';
2import { Product } from '../interfaces/Product';
3
4interface Props {
5  products: Product[];
6}
7
8const ProductsPage: NextPage<Props> = ({ products }) => {
9  return (
10    <div>
11      {products.map((product) => (
12        <div key={product.id}>{product.name}</div>
13      ))}
14    </div>
15  );
16};
17
18export const getStaticProps: GetStaticProps = async () => {
19  const res = await fetch('https://api.example.com/products');
20  const products: Product[] = await res.json();
21
22  return {
23    props: {
24      products,
25    },
26    revalidate: 10, // Revalida la página cada 10 segundos
27  };
28};
29
30export default ProductsPage;

Con revalidate, Next.js intentará re-generar la página cuando una solicitud llegue después de la expiración del tiempo definido, mejorando así la frescura del contenido sin sacrificar el rendimiento.

Conclusión

SSR, SSG e ISR son técnicas poderosas en Next.js para optimizar el rendimiento de las aplicaciones web. La elección entre ellas depende de las necesidades específicas de tu proyecto, como la frecuencia de actualización del contenido, la importancia del SEO, y la capacidad de carga del servidor. Next.js ofrece la flexibilidad para utilizar una combinación de estas estrategias, permitiendo a los desarrolladores aprovechar lo mejor de cada una para crear experiencias web rápidas, eficientes y amigables con el usuario.