إنشاء بنية مدونة بسيطة
سيتم تخزين منشورات المدونة في مثالنا كملفات ماركداون محلية في دليل التطبيق (وليس جلبها من مصدر بيانات خارجي)، لذا سنحتاج إلى قراءة البيانات من نظام الملفات.
في هذا القسم، سنستعرض خطوات إنشاء مدونة تقرأ بيانات ماركداون من نظام الملفات.
إنشاء ملفات ماركداون
أولاً، أنشئ دليلًا رئيسيًا جديدًا في المجلد الجذر باسم 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()
.
لنقم بذلك في الصفحة التالية!