Creación de una arquitectura simple para un blog

Los artículos del blog en nuestro ejemplo se almacenarán como archivos markdown locales en el directorio de nuestra aplicación (no se obtendrán de una fuente de datos externa), por lo que necesitaremos leer los datos del sistema de archivos.

En esta sección, veremos los pasos para crear un blog que lea datos markdown del sistema de archivos.

Creación de los archivos markdown

Primero, crea un nuevo directorio de primer nivel llamado posts (no es lo mismo que pages/posts) en tu carpeta raíz. Dentro de posts, crea dos archivos: pre-rendering.md y ssg-ssr.md.

Ahora, copia el siguiente código en posts/pre-rendering.md:

---
title: 'Two Forms of Pre-rendering'
date: '2020-01-01'
---
 
Next.js tiene dos formas de prerenderizado: **Generación Estática** y **Renderizado del Lado del Servidor (SSR)**. La diferencia está en **cuándo** se genera el HTML para una página.
 
- **Generación Estática** es el método de prerenderizado que genera el HTML en el **momento de compilación**. El HTML prerenderizado se _reutiliza_ en cada solicitud.
- **Renderizado del Lado del Servidor (SSR)** es el método de prerrenderizado que genera el HTML en **cada solicitud**.
 
Es importante destacar que Next.js te permite **elegir** qué forma de prerrenderizado usar para cada página. Puedes crear una aplicación Next.js "híbrida" usando Generación Estática para la mayoría de las páginas y Renderizado del Lado del Servidor para otras.

Luego, copia el siguiente código en posts/ssg-ssr.md:

---
title: 'When to Use Static Generation v.s. Server-side Rendering'
date: '2020-01-02'
---
 
Recomendamos usar **Generación Estática** (con y sin datos) siempre que sea posible porque tu página puede construirse una vez y servirse desde una CDN, lo que la hace mucho más rápida que tener un servidor renderizando la página en cada solicitud.
 
Puedes usar Generación Estática para muchos tipos de páginas, incluyendo:
 
- Páginas de marketing
- Artículos de blog
- Listados de productos de e-commerce
- Ayuda y documentación
 
Debes preguntarte: "¿Puedo prerrenderizar esta página **antes** de la solicitud de un usuario?" Si la respuesta es sí, entonces deberías elegir Generación Estática.
 
Por otro lado, la Generación Estática **no** es una buena idea si no puedes prerrenderizar una página antes de la solicitud de un usuario. Tal vez tu página muestra datos actualizados frecuentemente, y el contenido cambia en cada solicitud.
 
En ese caso, puedes usar **Renderizado del Lado del Servidor (SSR)**. Será más lento, pero la página prerrenderizada siempre estará actualizada. O puedes omitir el prerrenderizado y usar JavaScript del lado del cliente para poblar los datos.

Puedes haber notado que cada archivo markdown tiene una sección de metadatos en la parte superior que contiene title y date. Esto se llama YAML Front Matter, que puede ser analizado usando una biblioteca llamada gray-matter.

Instalación de gray-matter

Primero, instala gray-matter que nos permite analizar los metadatos en cada archivo markdown.

npm install gray-matter

Creación de la función utilitaria para leer el sistema de archivos

A continuación, crearemos una función utilitaria para analizar datos del sistema de archivos. Con esta función utilitaria, nos gustaría:

  • Analizar cada archivo markdown y obtener title, date, y el nombre del archivo (que se usará como id para la URL del artículo).
  • Listar los datos en la página de índice, ordenados por fecha.

Crea un directorio de primer nivel llamado lib en el directorio raíz. Luego, dentro de lib, crea un archivo llamado posts.js, y copia y pega este código:

import fs from 'fs';
import path from 'path';
import matter from 'gray-matter';
 
const postsDirectory = path.join(process.cwd(), 'posts');
 
export function getSortedPostsData() {
  // Obtener nombres de archivos en /posts
  const fileNames = fs.readdirSync(postsDirectory);
  const allPostsData = fileNames.map((fileName) => {
    // Eliminar ".md" del nombre del archivo para obtener el id
    const id = fileName.replace(/\.md$/, '');
 
    // Leer archivo markdown como string
    const fullPath = path.join(postsDirectory, fileName);
    const fileContents = fs.readFileSync(fullPath, 'utf8');
 
    // Usar gray-matter para analizar la sección de metadatos
    const matterResult = matter(fileContents);
 
    // Combinar los datos con el id
    return {
      id,
      ...matterResult.data,
    };
  });
  // Ordenar artículos por fecha
  return allPostsData.sort((a, b) => {
    if (a.date < b.date) {
      return 1;
    } else {
      return -1;
    }
  });
}

Nota:

No necesitas entender qué hace el código anterior para aprender Next.js, la función es para hacer que el ejemplo del blog sea funcional. Pero si deseas aprender más:

  • fs es un módulo de Node.js que te permite leer archivos del sistema de archivos.
  • path es un módulo de Node.js que te permite manipular rutas de archivos.
  • matter es una biblioteca que te permite analizar los metadatos en cada archivo markdown.
  • En Next.js, la carpeta lib no tiene un nombre asignado como la carpeta pages, por lo que puedes nombrarla como quieras. Por convención se suele usar lib o utils.

Obtención de los datos del blog

Ahora que los datos del blog están analizados, necesitamos agregarlos a nuestra página de índice (pages/index.js). Podemos hacer esto con un método de obtención de datos de Next.js llamado getStaticProps(). En la siguiente sección, aprenderemos cómo implementar getStaticProps().

Página de Índice

¡Hagámoslo en la siguiente página!

On this page