在接下來即將實作的範例裡面,會將文章以 markdown 的格式儲存在應用程式的目錄裡面(不是從外部取得),所以我們需要透過檔案系統中讀取資料。
這個章節我們將會透過一步步實作,建立可以從檔案系統中讀取 markdown 檔案的部落格。
首先,在根目錄創建一個名為 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.
你可能會注意到,每個 markdown 檔案在最上方都有一個 metadata 區塊,包含
title
和date
。這些 metadata 稱之為 YAML Front Matter,我們可以透過 gray-matter 這個函式庫來解析這些資料。
首先,下載 gray-matter,這個函式庫可以讓我們解析 markdown 檔案中的 metadata。
npm install gray-matter
接下來,我們將建立一個公用函式,用來從檔案系統中解析資料。我們希望它可以達成:
title
、date
和檔案名稱 ( 這將會被用來當作文章 URL 的 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() { // 拿取 /posts 資料夾中的所有檔案名稱 const fileNames = fs.readdirSync(postsDirectory); const allPostsData = fileNames.map((fileName) => { // 移除名稱中的 ".md",並將它當作 id const id = fileName.replace(/\.md$/, ''); // 將 markdown 內容轉換為字串 const fullPath = path.join(postsDirectory, fileName); const fileContents = fs.readFileSync(fullPath, 'utf8'); // 使用 gray-matter 解析 metadata 區塊 const matterResult = matter(fileContents); // 將資料與 id 結合 return { id, ...matterResult.data, }; }); // 依照日期排序 return allPostsData.sort((a, b) => { if (a.date < b.date) { return 1; } else { return -1; } }); }
注意:你不需要理解上面的程式碼是如何運作的,只要知道它是為了讓部落格範例可以正常運作即可。但如果你想要了解更多:
現在部落格資料已經被解析,我們需要將它加入到我們的首頁 (pages/index.js
)。我們可以使用一個名為 getStaticProps()
的 Next.js 資料取得方法來實現。在下一個章節,我們將學習如何實現 getStaticProps()
。
讓我們在下一頁來實現它吧!
← 返回上一頁 前往下一頁 →