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
で表示すれば完成です。