Closed13

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

https://nextjs.org/docs/advanced-features/using-mdx#setup-nextmdx-in-nextjs

ヤマチューヤマチュー

疑問

自動でできた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)
ヤマチューヤマチュー

番外編

そして、ここまで感動してやっていたが、blog-starter使えば、この設定いらなさそう(ノ∀`)アチャー

https://github.com/vercel/next.js/tree/canary/examples/blog-starter

ヤマチューヤマチュー

ただ、@next/mdxを上手く使えればシンプルに実装できるのかも?
というか、目的がやっぱり微妙に異なるのかな?

ヤマチューヤマチュー

今の所感

ぶっちゃけ、Astroの方がノーコンフィグでいきなり使い始められるのでEasy
Markdownの書き方もZennとかに近いので、混乱せずに使えるのは強み

Next.js 13 + @next/mdxはSimpleな感じで、Custom Elementsはかなり気になる
一方で、mdx使うことになるので、レイアウト部分とかが出てきて、今後別のものに載せ替えるときがきたら大変かも(記事数ないから自分は問題ないが…)

Next.jsのblog-starterは、Astroに近いものを感じる(というかAstroがオマージュしてそう感)

でも画像周りの取扱は、ほぼ変わらないことが分かったので、そこはGatsbyが好きだったよ

このスクラップは2022/12/03にクローズされました