14

Implementa Progressive server-side render con Next.js

21836Puntos

hace 7 años

Cuando renderizamos una aplicación normalmente decidimos entre hacer server-side render o client-side render. También existe la opción de usar ambos métodos para iniciar nuestra aplicación con server-side render y que luego mediante client-side render hagamos los cambios de vistas o actualizaciones de datos.

Resulta que al combinar ambos métodos podemos usar otra técnica llamada progressive server-side render. Esto significa renderizar una parte de nuestra aplicación en el servidor, normalmente el above the fold, y el resto en el navegador.

Esta técnica es usada actualmente por Netflix para cargar super rápido. Vamos a ver como implementar esta técnica en una aplicación de React.js usando Next.js.

Nuestro código

Lo primero que vamos a hacer es instalar nuestras dependencias.

yarn add next react react-dom react-no-ssr

De estas dependencias react-no-ssr es el que va a hacer la magia acá. Lo que hace este muy pequeño componente (19 líneas de código) es solo renderizar los componentes que indiquemos en el navegador y darnos la posibilidad de definir otro componente para el servidor (como un mensaje de cargando).

Ahora vamos a crear un archivo index.js dentro de ./pages con este contenido.

import React from'react';
import NoSSR from'react-no-ssr';
import Loading from'../components/loading';

const loading = <Loading />;

function HomePage() {
  return (
    <main><section><h1>
          Esta parte se renderiza en el servidor.
        </h1></section><NoSSRonSSR={loading}><section><h2>
            Esta parte <em>no</em> se renderiza en el servidor.
          </h2></section></NoSSR><stylejsx>{`
        section {
          align-items: center;
          display: flex;
          height: 50vh;
          justify-content: center;
        }
      `}</style></main>
  );
}

export default HomePage;

Luego en nuestro package.json vamos a agregar un script dev que corra el comando next y vamos a correr yarn dev. Esto va a iniciar un servidor HTTP en el puerto 3000 donde vamos a poder usar nuestra aplicación.

Al entrar probablemente el JS del cliente cargue muy rápido para que notemos el efecto de NoSSR, pero ya sea que desactivemos JS o que limitemos nuestra velocidad de descarga (a 2G por ejemplo) vamos a notar que se renderizó el primer <section /> y el contenido que hayamos colocado en el componente Loading y luego cuando se inicie la aplicación en el cliente se renderiza el segundo <section />.

Conclusiones

Este es un ejemplo super simple, pero como se puede ver es muy fácil implementar este componente react-no-ssr para evitar renderizar partes en el servidor.

Hacer esto nos ayudaría a solo renderizar las partes más importantes de nuestra aplicación como el above the fold o que se necesiten para el SEO. Y luego en el cliente hacer render del resto de la aplicación, por ejemplo si tenemos un sistema de comentarios podemos solo renderizarlo en el navegador y dejar al server-render el contenido principal de nuestro sitio.

Esto beneficia al usuario al recibir el contenido importante más rápido y a nuestro servidor de render a pasar menos tiempo haciendo el render. Además de reducir la cantidad de HTML enviado por lo que el sitio pesaría menos.

Sergio Daniel
Sergio Daniel
sergiodxa

21836Puntos

hace 7 años

Todas sus entradas
Escribe tu comentario
+ 2
2

Nosotros tenemos una implementación parecida con Next.js i Preact. Usamos dynamic rendering, así que para los bots mostramos 100% con SSR el contenido y no le servimos el JS, totalmente estático, y para los usuarios solo en SSR la parte más visible, y las otras partes con skeleton y se cargan con la API de Intersection Observer al ser visibles en el viewport. De esta forma hace la carga mucho más rapida 🙂! Ahora estoy esperando la feature de la rehydratacion progresiva, a ver cuando aterriza en Preact…