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 und date 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 als id 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 der pages-Ordner, daher können Sie ihn beliebig benennen. Üblicherweise wird lib oder utils 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.

Indexseite

Lassen Sie uns das auf der nächsten Seite machen!

On this page