コンテンツにスキップ

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,
  };
}

重要: getPostDataasyncキーワードを追加しました。なぜなら、remarkのためにawaitを使用する必要があるからです。async/awaitを使用すると、非同期的にデータを取得できます。

これは、pages/posts/[id].jsgetStaticPropsを更新して、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].jsPostコンポーネントを更新して、dangerouslySetInnerHTMLを使用してcontentHtmlをレンダリングします。

export default function Post({ postData }) {
  return (
    <Layout>
      {postData.title}
      <br />
      {postData.id}
      <br />
      {postData.date}
      <br />
      <div dangerouslySetInnerHTML={{ __html: postData.contentHtml }} />
    </Layout>
  );
}

これらのページをもう一度訪問してみてください。

これでブログコンテンツが表示されるはずです。

How to Statically Generate Pages with Dynamic Routes

ほぼ完了です!次は各ページを磨きましょう。

チャプターを完了しました。33

次へ

34: ポストページの磨き上げ