Gatsby だと時折見かける gray-matter ですが、Next.js でも非常に役立つので使い方と利点を書いておきます。
マークダウンでコンテンツを分けることを合わせて pages/ の負担を減らせます。
pages/ の管理
pages/ 下には設定用にスクリプト(js, jsx, ts, tsx)を置けません。
data/ などを外に用意してもいいんですが疎になりすぎてフォルダを行き来するのが面倒になります。
jsonで管理してもいいんですがコンテンツを入れると構造がごちゃごちゃします。
マークダウンならタグ付きのコンテンツを簡単に管理できます。
この辺は以前の内容ですが、gray-matter を使って config 付きのコンテンツとして管理することが出来ます。
gray-matter とは
gray-matter は front matter の YAML 解析を行うライブラリです。
言葉にするとわかりにくいですが、markdown で書いたファイルなどの先頭に json 相当の情報を書くことが出来ます。
先頭に --- で挟んだ場所を data、以降をcontentとして json 形式で取得します。
言葉で説明しにくいのでサンプルを見ると、このファイルの場合は以下のように解析されます。
|
|
若干複雑ですが、 config と contents を同時に書くことが出来ます。
マークダウンに書く場合、この例の注意点は excerpt 部分です。
文のすぐ後の行に --- が来るため マークダウンとしてみると <h2> です。
prettier などのフォーマッターを入れていると ## に変えられたりします。
実際に使ってみる
ogp や twitter タグのようなメタタグと、パンくずリストを設定します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
--- meta: title: Anime List - Narumium description: 年ごとのアニメリストへのリンクとアニメタイトル一覧 image: /icon/anime.png url: /tools/anime bread: - href: / title: Home - href: / title: Tools - href: "/tools/anime" title: Anime --- ## アニメタイトル一覧 年ごとのアニメリストへのリンクとアニメタイトル一覧 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import matter from "gray-matter"; import indexmd from "./index.md"; const App = ({ animes }: Props) => { const md = matter(indexmd); return ( <Template animes={animes} content={md.content} meta={md.data.meta} bread={md.data.bread} /> ); }; |
page は肥大化しやすいので、設定とコンテンツだけ管理して投げる形です。
content は react-markdown で表示すれば完成です。