Création d'une architecture de blog simple
Les articles de blog dans notre exemple seront stockés sous forme de fichiers markdown locaux dans le répertoire de notre application (et non récupérés depuis une source de données externe), nous devrons donc lire les données depuis le système de fichiers.
Dans cette section, nous allons parcourir les étapes de création d'un blog qui lit les données markdown depuis le système de fichiers.
Création des fichiers markdown
Commencez par créer un nouveau répertoire de premier niveau appelé posts
(ce n'est pas le même que pages/posts
) dans votre dossier racine. À l'intérieur de posts
, créez deux fichiers : pre-rendering.md
et ssg-ssr.md
.
Maintenant, copiez le code suivant dans posts/pre-rendering.md
:
---
title: 'Deux formes de pré-rendu'
date: '2020-01-01'
---
Next.js propose deux formes de pré-rendu : **Génération statique** et **Rendu côté serveur**. La différence réside dans **le moment** où le HTML d'une page est généré.
- **La génération statique** est la méthode de pré-rendu qui génère le HTML au **moment de la construction**. Le HTML pré-rendu est ensuite _réutilisé_ à chaque requête.
- **Le rendu côté serveur** est la méthode de pré-rendu qui génère le HTML à **chaque requête**.
Il est important de noter que Next.js vous permet de **choisir** quelle forme de pré-rendu utiliser pour chaque page. Vous pouvez créer une application Next.js "hybride" en utilisant la génération statique pour la plupart des pages et le rendu côté serveur pour d'autres.
Ensuite, copiez le code suivant dans posts/ssg-ssr.md
:
---
title: 'Quand utiliser la Génération Statique vs le Rendu Côté Serveur'
date: '2020-01-02'
---
Nous recommandons d'utiliser la **Génération Statique** (avec ou sans données) autant que possible, car votre page peut être construite une fois et servie par un CDN, ce qui la rend beaucoup plus rapide qu'un serveur qui rend la page à chaque requête.
Vous pouvez utiliser la Génération Statique pour de nombreux types de pages, notamment :
- Pages marketing
- Articles de blog
- Listes de produits e-commerce
- Aide et documentation
Vous devriez vous demander : "Puis-je pré-rendre cette page **avant** la requête d'un utilisateur ?" Si la réponse est oui, alors vous devriez choisir la Génération Statique.
D'un autre côté, la Génération Statique n'est **pas** une bonne idée si vous ne pouvez pas pré-rendre une page avant la requête d'un utilisateur. Peut-être que votre page affiche des données fréquemment mises à jour, et que le contenu de la page change à chaque requête.
Dans ce cas, vous pouvez utiliser le **Rendu Côté Serveur**. Ce sera plus lent, mais la page pré-rendue sera toujours à jour. Ou vous pouvez ignorer le pré-rendu et utiliser JavaScript côté client pour peupler les données.
Vous avez peut-être remarqué que chaque fichier markdown a une section de métadonnées en haut contenant
title
etdate
. C'est ce qu'on appelle YAML Front Matter, qui peut être analysé à l'aide d'une bibliothèque appelée gray-matter.
Installation de gray-matter
Commencez par installer gray-matter qui nous permet d'analyser les métadonnées dans chaque fichier markdown.
npm install gray-matter
Création de la fonction utilitaire pour lire le système de fichiers
Ensuite, nous allons créer une fonction utilitaire pour analyser les données depuis le système de fichiers. Avec cette fonction utilitaire, nous aimerions :
- Analyser chaque fichier markdown et obtenir
title
,date
, et le nom du fichier (qui sera utilisé commeid
pour l'URL de l'article). - Lister les données sur la page d'index, triées par date.
Créez un répertoire de premier niveau appelé lib
dans le répertoire racine. Ensuite, à l'intérieur de lib
, créez un fichier appelé posts.js
, et copiez-collez ce code :
import fs from 'fs';
import path from 'path';
import matter from 'gray-matter';
const postsDirectory = path.join(process.cwd(), 'posts');
export function getSortedPostsData() {
// Obtenir les noms de fichiers sous /posts
const fileNames = fs.readdirSync(postsDirectory);
const allPostsData = fileNames.map((fileName) => {
// Supprimer ".md" du nom de fichier pour obtenir l'id
const id = fileName.replace(/\.md$/, '');
// Lire le fichier markdown comme une chaîne
const fullPath = path.join(postsDirectory, fileName);
const fileContents = fs.readFileSync(fullPath, 'utf8');
// Utiliser gray-matter pour analyser la section de métadonnées de l'article
const matterResult = matter(fileContents);
// Combiner les données avec l'id
return {
id,
...matterResult.data,
};
});
// Trier les articles par date
return allPostsData.sort((a, b) => {
if (a.date < b.date) {
return 1;
} else {
return -1;
}
});
}
Note :
Vous n'avez pas besoin de comprendre ce que fait le code ci-dessus pour apprendre Next.js, la fonction sert à rendre l'exemple de blog fonctionnel. Mais si vous souhaitez en savoir plus :
fs
est un module Node.js qui vous permet de lire des fichiers depuis le système de fichiers.path
est un module Node.js qui vous permet de manipuler les chemins de fichiers.matter
est une bibliothèque qui vous permet d'analyser les métadonnées dans chaque fichier markdown.- Dans Next.js, le dossier
lib
n'a pas de nom assigné comme le dossierpages
, vous pouvez donc le nommer comme vous voulez. Il est généralement d'usage d'utiliserlib
ouutils
.
Récupération des données du blog
Maintenant que les données du blog sont analysées, nous devons les ajouter à notre page d'index (pages/index.js
). Nous pouvons le faire avec une méthode de récupération de données Next.js appelée getStaticProps()
. Dans la section suivante, nous apprendrons comment implémenter getStaticProps()
.
Faisons-le dans la prochaine page !