إنشاء بنية مدونة بسيطة

سيتم تخزين منشورات المدونة في مثالنا كملفات ماركداون محلية في دليل التطبيق (وليس جلبها من مصدر بيانات خارجي)، لذا سنحتاج إلى قراءة البيانات من نظام الملفات.

في هذا القسم، سنستعرض خطوات إنشاء مدونة تقرأ بيانات ماركداون من نظام الملفات.

إنشاء ملفات ماركداون

أولاً، أنشئ دليلًا رئيسيًا جديدًا في المجلد الجذر باسم posts (هذا ليس نفس pages/posts). داخل posts، أنشئ ملفين: pre-rendering.md و ssg-ssr.md.

الآن، انسخ الكود التالي إلى 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.

ثم انسخ الكود التالي إلى 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.

قد تلاحظ أن كل ملف ماركداون يحتوي على قسم بيانات وصفية في الأعلى يتضمن title و date. هذا يسمى YAML Front Matter، ويمكن تحليله باستخدام مكتبة تسمى gray-matter.

تثبيت gray-matter

أولاً، قم بتثبيت gray-matter التي تتيح لنا تحليل البيانات الوصفية في كل ملف ماركداون.

npm install gray-matter

إنشاء دالة مساعدة لقراءة نظام الملفات

بعد ذلك، سننشئ دالة مساعدة لتحليل البيانات من نظام الملفات. باستخدام هذه الدالة المساعدة، نريد أن:

  • نحلل كل ملف ماركداون ونحصل على title و date واسم الملف (الذي سيستخدم كـ id لرابط المنشور).
  • ندرج البيانات في صفحة الفهرس، مرتبة حسب التاريخ.

أنشئ دليلًا رئيسيًا باسم lib في المجلد الجذر. ثم، داخل lib، أنشئ ملفًا باسم posts.js، وانسخ والصق هذا الكود:

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;
    }
  });
}

ملاحظة:

لا تحتاج إلى فهم ما يفعله الكود أعلاه لتعلم Next.js، فالدالة تهدف إلى جعل مثال المدونة يعمل. ولكن إذا كنت ترغب في معرفة المزيد:

  • fs هي وحدة Node.js تتيح لك قراءة الملفات من نظام الملفات.
  • path هي وحدة Node.js تتيح لك التعامل مع مسارات الملفات.
  • matter هي مكتبة تتيح لك تحليل البيانات الوصفية في كل ملف ماركداون.
  • في Next.js، لا يحتوي مجلد lib على اسم محدد مثل مجلد pages، لذا يمكنك تسميته بأي شيء. عادةً ما يكون الاتفاق السائد هو استخدام lib أو utils.

جلب بيانات المدونة

الآن بعد تحليل بيانات المدونة، نحتاج إلى إضافتها إلى صفحتنا الرئيسية (pages/index.js). يمكننا القيام بذلك باستخدام طريقة جلب البيانات في Next.js المسماة getStaticProps(). في القسم التالي، سنتعلم كيفية تنفيذ getStaticProps().

صفحة الفهرس

لنقم بذلك في الصفحة التالية!