Blog を MDX, Next.js で作成した
なぜ MDX と Next.js で作成したか
2 か月前に GitHub Pages × Hugo でブログを始めました。始めた経緯などは次の記事に書いてあります。 GitHub Pages × Hugo で技術ブログを始めた
- GitHub Pages を使うことでデプロイを自動化
- ブログ記事は使い慣れている Vim で Markdown で書くことができる。
- ページパフォーマンスも高い
などのメリットがあり、割と気にいっていた反面、
- 選択したテーマはブログ主体のものではなかった
- もう少しカスタマイズしたい
- 業務で触れる機会がないフロントエンドの技術を触りたい
など、気になる点もいくつかありました。 Vue や React は去年それぞれ 1 か月ほど触った経験があったので、TypeScript と相性が良いと言われている React を選択しました。 (普段 Ruby を使っていることもあり、型のある TypeScript が触りたかった)
また、Hugo からの移行ということもあって、まずは SSG の Gatsby も触ってみたのですが、
- プロジェクト生成後のディレクトリ構成が割と煩雑
- GraphQL が難しそう(これは食わず嫌い)
上記の理由から、よりシンプルな Next.js を選択しました。 リポジトリはこちらです。 reona5/dev
github.io
も気に入ってはいましたが、良い機会なので reona.dev
のカスタムドメインを取得しました。
MDX
MDX は Markdown に JSX を挿入できるフォーマットです。Markdown ファイルは .md
、MDX ファイルは .mdx
です。オープンソースのライブラリとなっています。
mdx-js/mdx JSX in Markdown for ambitious projects
JSX を挿入できるので、Markdown で書くブログ記事に React のコンポーネントを組み込むことができます。
このように使いたいコンポーネントを import します。 React のコードを書くような感覚でブログ記事を書けるのがとても良いですね。
SEO 対策
以前のブログで SEO 周りの設定は一通り行ないましたが、URL も変わったので再度 Search Console に登録しました。
Sitemap
Next.js 用の nextjs-sitemap-generator を用いて生成し、Search Console に送信しました。
画像圧縮
パフォーマンスを落としたくなかったので、画像圧縮の仕組みを作りました。 scripts/imagemin.jsにスクリプトを書いて、ビルド・デプロイ時に実行するようにします。
Twitter/Youtube の埋め込み
react-twitter-embed react-youtube
上記のライブラリは記事中に Tweet や Youtube のリッチなコンポーネントを提供してくれます。
Twitter のライブラリは他にも色んなコンポーネントを提供してくれているみたいです。
自動デプロイ
上記のチュートリアルでもデプロイ手順が書いてあるので参考にしました。独自ドメインでも設定は簡単でした。
基本的に、now
(もしくは vercel
)コマンドでデプロイできますが、GitHub リポジトリと紐づければ master ブランチへの Push 時にデプロイしてくれて便利です。