Eine einfache Blog-Architektur erstellen
Die Blogbeiträge in unserem Beispiel werden als lokale Markdown-Dateien im Anwendungsverzeichnis gespeichert (nicht von einer externen Datenquelle abgerufen), daher müssen wir die Daten aus dem Dateisystem lesen.
In diesem Abschnitt gehen wir die Schritte durch, um ein Blog zu erstellen, das Markdown-Daten aus dem Dateisystem liest.
Markdown-Dateien erstellen
Erstellen Sie zunächst ein neues oberstes Verzeichnis namens posts
(dies ist nicht dasselbe wie pages/posts
) im Stammverzeichnis. Erstellen Sie innerhalb von posts
zwei Dateien: pre-rendering.md
und ssg-ssr.md
.
Kopieren Sie nun den folgenden Code in posts/pre-rendering.md
:
---
title: 'Two Forms of Pre-rendering'
date: '2020-01-01'
---
Next.js has two forms of pre-rendering: **Static Generation** and **Server-side Rendering**. The difference is in **when** it generates the HTML for a page.
- **Static Generation** is the pre-rendering method that generates the HTML at **build time**. The pre-rendered HTML is then _reused_ on each request.
- **Server-side Rendering** is the pre-rendering method that generates the HTML on **each request**.
Importantly, Next.js lets you **choose** which pre-rendering form to use for each page. You can create a "hybrid" Next.js app by using Static Generation for most pages and using Server-side Rendering for others.
Dann kopieren Sie den folgenden Code in posts/ssg-ssr.md
:
---
title: 'When to Use Static Generation v.s. Server-side Rendering'
date: '2020-01-02'
---
We recommend using **Static Generation** (with and without data) whenever possible because your page can be built once and served by CDN, which makes it much faster than having a server render the page on every request.
You can use Static Generation for many types of pages, including:
- Marketing pages
- Blog posts
- E-commerce product listings
- Help and documentation
You should ask yourself: "Can I pre-render this page **ahead** of a user's request?" If the answer is yes, then you should choose Static Generation.
On the other hand, Static Generation is **not** a good idea if you cannot pre-render a page ahead of a user's request. Maybe your page shows frequently updated data, and the page content changes on every request.
In that case, you can use **Server-Side Rendering**. It will be slower, but the pre-rendered page will always be up-to-date. Or you can skip pre-rendering and use client-side JavaScript to populate data.
Sie haben vielleicht bemerkt, dass jede Markdown-Datei oben einen Metadatenabschnitt mit
title
unddate
enthält. Dies wird YAML Front Matter genannt und kann mit einer Bibliothek namens gray-matter geparst werden.
gray-matter installieren
Installieren Sie zunächst gray-matter, das uns ermöglicht, die Metadaten in jeder Markdown-Datei zu parsen.
npm install gray-matter
Hilfsfunktion zum Lesen des Dateisystems erstellen
Als Nächstes erstellen wir eine Hilfsfunktion zum Parsen von Daten aus dem Dateisystem. Mit dieser Hilfsfunktion möchten wir:
- Jede Markdown-Datei parsen und
title
,date
sowie den Dateinamen (der alsid
für die Post-URL verwendet wird) erhalten. - Die Daten auf der Indexseite auflisten, sortiert nach Datum.
Erstellen Sie ein oberstes Verzeichnis namens lib
im Stammverzeichnis. Erstellen Sie dann innerhalb von lib
eine Datei namens posts.js
und kopieren Sie diesen Code hinein:
import fs from 'fs';
import path from 'path';
import matter from 'gray-matter';
const postsDirectory = path.join(process.cwd(), 'posts');
export function getSortedPostsData() {
// Get file names under /posts
const fileNames = fs.readdirSync(postsDirectory);
const allPostsData = fileNames.map((fileName) => {
// Remove ".md" from file name to get id
const id = fileName.replace(/\.md$/, '');
// Read markdown file as string
const fullPath = path.join(postsDirectory, fileName);
const fileContents = fs.readFileSync(fullPath, 'utf8');
// Use gray-matter to parse the post metadata section
const matterResult = matter(fileContents);
// Combine the data with the id
return {
id,
...matterResult.data,
};
});
// Sort posts by date
return allPostsData.sort((a, b) => {
if (a.date < b.date) {
return 1;
} else {
return -1;
}
});
}
Hinweis:
Sie müssen den obigen Code nicht verstehen, um Next.js zu lernen. Die Funktion dient dazu, das Blog-Beispiel funktionsfähig zu machen. Aber falls Sie mehr erfahren möchten:
fs
ist ein Node.js-Modul, das das Lesen von Dateien aus dem Dateisystem ermöglicht.path
ist ein Node.js-Modul, das die Manipulation von Dateipfaden ermöglicht.matter
ist eine Bibliothek, die das Parsen der Metadaten in jeder Markdown-Datei ermöglicht.- In Next.js hat der
lib
-Ordner keinen festgelegten Namen wie derpages
-Ordner, daher können Sie ihn beliebig benennen. Üblicherweise wirdlib
oderutils
verwendet.
Blog-Daten abrufen
Nachdem die Blog-Daten geparst wurden, müssen wir sie unserer Indexseite (pages/index.js
) hinzufügen. Dies können wir mit einer Next.js-Datenabrufmethode namens getStaticProps()
tun. Im nächsten Abschnitt lernen wir, wie man getStaticProps()
implementiert.
Lassen Sie uns das auf der nächsten Seite machen!