Next.js 13 + @next/mdxでMarkdownを記事に簡単に変換できるのかの調査
目的
ようやく落ち着いたので、3ヶ月以上前に途中まで作ったAstroのブログを完成させようかと思ったが、10月に発表されたNext.js 13が個人的には衝撃的だったので、いろいろ考え中
Astroのブログを完成させるべきか、Next.jsで作り直すか色々と迷っているので調査する
やったことメモ
Automatic Setup
npx create-next-app@latest --typescript
Setup @next/mdx in Next.js
疑問
自動でできたnext.config.jsの設定と追加するべき設定の共存どうやるんだ?👀
→型定義でwithMDXの引数がnextConfigと分かったので、これと共存できそう
Markdownファイルの追加
適当に、pages
配下にMarkdownファイルを追加するだけで表示された!
GFMを有効にしたい
現状だと、Markdownが十分変換されるわけではないので、GitHub flavored markdown (GFM)をremark-gfm
を用いて有効にする
npm install remark-gfm
withMDXのremarkPluginsで指定するといける
問題
ただ、ここでremark-gfm
がESMにしか対応していないことが発覚
そこでnext.config.mjs
に中身を変換する必要がでてきた
結果、以下のように書き換えた
import remarkGfm from 'remark-gfm'
import nextMDX from '@next/mdx'
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
swcMinify: true,
pageExtensions: ['ts', 'tsx', 'js', 'jsx', 'md', 'mdx'],
}
const withMDX = nextMDX({
extension: /\.mdx?$/,
options: {
// If you use remark-gfm, you'll need to use next.config.mjs
// as the package is ESM only
// https://github.com/remarkjs/remark-gfm#install
remarkPlugins: [remarkGfm],
rehypePlugins: [],
// If you use `MDXProvider`, uncomment the following line.
// providerImportSource: "@mdx-js/react",
},
})
export default withMDX(nextConfig)
next.config.ts
について
もし、next.config.ts
があれば使いたかったので少しだけ調査
ただ、以下のstackoverflowの回答を見て、公式のissueも見たけど、@type
を使う方に舵切ったっぽいので本当に無さそう
Frontmatter
見慣れた記述のgray-matter
が良いかなと思ったけど、@next/mdx
を使ってレイアウトするならconstで定義するほうが良いのかも
Custom Elements
個人的には、なかなか痺れる内容
全部指定しなくても良いなら、割と遊び心を持ったコンポーネントを指定できそうだし、ここは強みになりそう👀
番外編
そして、ここまで感動してやっていたが、blog-starter
使えば、この設定いらなさそう(ノ∀`)アチャー
今の所感
ぶっちゃけ、Astroの方がノーコンフィグでいきなり使い始められるのでEasy
Markdownの書き方もZennとかに近いので、混乱せずに使えるのは強み
Next.js 13 + @next/mdxはSimpleな感じで、Custom Elementsはかなり気になる
一方で、mdx使うことになるので、レイアウト部分とかが出てきて、今後別のものに載せ替えるときがきたら大変かも(記事数ないから自分は問題ないが…)
Next.jsのblog-starter
は、Astroに近いものを感じる(というかAstroがオマージュしてそう感)
でも画像周りの取扱は、ほぼ変わらないことが分かったので、そこはGatsbyが好きだったよ
とりあえず、途中まで作っているし、Astroでいく!