33
章33
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');
// Use gray-matter to parse the post metadata section
const matterResult = matter(fileContents);
// Use remark to convert markdown into HTML string
const processedContent = await remark()
.use(html)
.process(matterResult.content);
const contentHtml = processedContent.toString();
// Combine the data with the id and contentHtml
return {
id,
contentHtml,
...matterResult.data,
};
}
重要: `getPostData`に**`async`**キーワードを追加したのは、`remark`で`await`を使用する必要があるためです。`async`/`await`を使用すると、データを非同期にフェッチできます。
つまり、pages/posts/[id].js
にあるgetStaticProps
を更新し、getPostData
を呼び出す際にawait
を使用する必要があります
export async function getStaticProps({ params }) {
// Add the "await" keyword like this:
const postData = await getPostData(params.id);
return {
props: {
postData,
},
};
}
最後に、pages/posts/[id].js
のPost
コンポーネントを更新し、dangerouslySetInnerHTML
を使ってcontentHtml
をレンダリングします
export default function Post({ postData }) {
return (
<Layout>
{postData.title}
<br />
{postData.id}
<br />
{postData.date}
<br />
<div dangerouslySetInnerHTML={{ __html: postData.contentHtml }} />
</Layout>
);
}
これらのページを再度訪れてみてください
これでブログコンテンツが表示されるはずです

もうすぐ完了です!次は各ページを洗練させましょう。
お役に立ちましたか?