动手练一练,使用 React 和 Next.js 做一个简单的博客网站(中)

作者:Craig Bucklere
       原文:Build a Blog with React and Next.js(sitepoint) 
       字数:4272 字 (非直译,有添加部分)
       阅读: 10 分钟

大家好,在《动手练一练,使用 React 和 Next.js 做一个简单的博客网站(上)》一篇文章里,我们一起了解了什么是 Next.js,并手工创建了一个简单的 Next.js 项目,学会了如何基于模板创建简单的页面,本篇文章,我们继续完善这个案例。

一、基于MD文档生成动态路由

创建博客,自然少不了文章内容,如果我们每写一篇文章,就创建一个 JSX 单页面,这样太不现实,费事费力又不容易维护,我们开发人员更喜欢使用 Markdown 文档写文档。

庆幸的是,Next.js 允许我们使用 Markdown 作为文章的数据源,基于文件名生成动态路由,并且实现文件内容的 HTML 静态化。

1、在编写本功能时,最好停止 Next.js  服务(Ctrl | Cmd + C)。

2、接下来,在项目的根目录里创建 articles 文件夹,把你的 Markdown 文件放置在这里,例如:articles/article-01.md,MD 文档格式如下所示:

---
title: The first article
description: This is the first article.
date: 2020-10-01
---
This is an article post.
## Subheading
Lorem ipsum dolor sit amet, consectetur adipiscing elit.

我们将文档的标题名称、文档描述、创建日期放置在 — 之间,Front-matter 这个 npm 插件基于这个格式可以读取上述相关信息提取文档的标题、描述、创建日期。要将 MD 文档格式化成网页的形式,我们还需要安装 remark 和  remark-html 这两个npm 插件,安装命令如下:

npm i front-matter remark remark-html

3、安装完成后,我们要实现读取和格式化 MD 文档的功能,接下来创建 lib/posts-md.js 工具函数文件。getFileIds(dir) 函数返回一个 MD 文件名的数组(不包含 .md 扩展名的文件名),示例代码如下:

import { promises as fsp } from 'fs';
import path from 'path';
import fm from 'front-matter';
import remark from 'remark';
import remarkhtml from 'remark-html';
import * as dateformat from './dateformat';
const fileExt = 'md';
// return absolute path to folder
function absPath(dir) {
  return (
    path.isAbsolute(dir) ? dir : path.resolve(process.cwd(), dir)
  );
}
// return array of files by type in a directory and remove extensions
export async function getFileIds(dir = './') {
  const loc = absPath(dir);
  const files = await fsp.readdir(loc);
  return files
    .filter((fn) => path.extname(fn) === `.${fileExt}`)
    .map((fn) => path.basename(fn, path.extname(fn)));
}

获取到文件名数组后,我们需要解析 MD 的具体内容,比如文件的标题、描述、创建日期、具体的内容HTML格式化等,示例代码如下:

export async function getFileData(dir = './', id) {
  const
    file =
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值