自作ブログを作っています。
技術スタック
- TypeScript
- React
- Next.js
- Styled Components
- GitHub Pages
今回は、Markdownで用意した記事を、対応したURLで表示できるようにします。
ページURL
ファイル名を[slug].md
、ページURLを/posts/[slug]
とします。
例えば、記事ファイルのsample.mdに対応するURLは、/posts/sample
となります。
記事表示ページ
記事ファイルを元に、slug一覧を取得する関数を用意します。
(post-service.ts) export function getSlugs() { return fs .readdirSync(getPostDir()) .map((fileName) => path.parse(fileName).name) }
次に、pages/posts/[slug].tsx
を作成し、ここでページの定義をしていきます。
posts/[slug].md
に存在している各記事ファイルを、パス一覧に登録することで、静的ファイルとして生成されるようにします。
([slug].tsx) export async function getStaticPaths() { return { paths: postService.getSlugs().map((slug) => ({ params: { slug } })), fallback: false, } }
参考: getStaticPaths
次に、記事表示用の記述を行います。
ここで、getStaticPaths
が返却するpaths.params[]
が、getStaticProps
の引数として渡されます。
type Params = { params: { slug: string } } export async function getStaticProps({ params }: Params) { const postData = await postService.loadMarkdown(params.slug) return { props: { content: postData.content, }, } } type Props = { content: string } const Slug = ({ content }: Props) => { return ( <> <div dangerouslySetInnerHTML={{ __html: content }} /> </> ) } export default Slug
これで、/posts/sample
にアクセスすることで、sample.md
内容が表示されるようになりました。
参考: getStaticProps
Pull Request
https://github.com/nek0meshi/blog/pull/4
あとがき
開発に携わっているタイムカードにて、先日長く開発していた変形労働時間制機能がリリースされました。