Рендеринг Markdown
Для рендеринга контента в формате Markdown мы будем использовать библиотеку remark
. Сначала установим её:
npm install remark remark-html
Затем откройте файл lib/posts.js
и добавьте следующие импорты в начало файла:
import { remark } from 'remark';
import html from 'remark-html';
И обновите функцию getPostData()
в том же файле, чтобы использовать remark
:
export async function getPostData(id) {
const fullPath = path.join(postsDirectory, `${id}.md`);
const fileContents = fs.readFileSync(fullPath, 'utf8');
// Используем gray-matter для раздела метаданных поста
const matterResult = matter(fileContents);
// Используем remark для преобразования Markdown в HTML-строку
const processedContent = await remark()
.use(html)
.process(matterResult.content);
const contentHtml = processedContent.toString();
// Объединяем данные с id и contentHtml
return {
id,
contentHtml,
...matterResult.data,
};
}
Важно: Мы добавили ключевое слово
async
кgetPostData
, потому что нам нужно использоватьawait
дляremark
.async
/await
позволяют получать данные асинхронно.
Это означает, что нам нужно обновить getStaticProps
в pages/posts/[id].js
, чтобы использовать await
при вызове getPostData
:
export async function getStaticProps({ params }) {
// Добавляем ключевое слово "await" следующим образом:
const postData = await getPostData(params.id);
return {
props: {
postData,
},
};
}
Наконец, обновите компонент Post
в pages/posts/[id].js
, чтобы рендерить contentHtml
с помощью dangerouslySetInnerHTML
:
export default function Post({ postData }) {
return (
<Layout>
{postData.title}
<br />
{postData.id}
<br />
{postData.date}
<br />
<div dangerouslySetInnerHTML={{ __html: postData.contentHtml }} />
</Layout>
);
}
Попробуйте снова посетить эти страницы:
Теперь вы должны увидеть содержимое блога:
Мы почти закончили! Далее давайте доработаем каждую страницу.