JAMstackで技術ブログを作った話【Next.js ✖️ microCMS ✖️ Vercel】

5 min read読了の目安(約5300字

今回、Next.js, micoroCMS, Vercel を用いて JAMstack の技術ブログを作りましたので、そのお話をいたします。

作成したブログはこちら
ソースコードはこちら
NOCHITOKU

私はこんなやつ

モダンフロントを中心に活躍しているフリーランスエンジニアです。
エンジニアについての詳細なプロフィールはこちらにまとめていますので、良ければご覧ください。
プロフィール | NOCHITOKU

なぜ作ったのか?

以下の理由で作成しています。

  • 技術ノウハウの発信場所
  • SSG のアウトプット

私自身スキルのキャッチアップの中で、個人ブログの知見により救われたことが多くありました。
そこで、自分でも他のエンジニアの方の役に立とうと思い、個人ブログの開発に至りました。

ブログコンセプトなどはこちらにまとめていますので、良ければご覧ください。
「NOCHITOKU ブログ」について

また、React, Next.js をメインに仕事をしているので、SSG 構成のアウトプットを兼ねて開発しています。
現状は SSG 構成ですが、今後 ISR 化や E2E テストの導入など、保守体制の構築にも力を入れていこうと思います。

ブログの機能

一般的なブログの機能に加えて、PWA の機能があります。

  • ブログ一覧、記事詳細
  • 検索
  • カテゴリー検索
  • アーカイブ検索
  • プロフィール
  • 利用規約
  • プライバシーポリシー
  • PWA

PWA 機能について

スマートフォン (iPhone, Android)

ブログサイトを「ホーム画面に追加」することで、ネイティブアプリのように操作することができます。

PC ブラウザ (Mac)

ブログサイトにブラウザからアクセスします。
URL の右の方にあるアイコンをクリックし、「NOCHITOKU」ブログをインストールします。

すると画像のようなデスクトップアプリとして、ブログサイトを操作できるようになります。

システム構成

以下の構成にて、技術ブログを構築しています。

ホスティングは Vercel で実施しています。
Github との連携で、main リポジトリ push 時に自動デプロイが実行されるようになっています。
また macroCMS と連携しており、webhook を用いて記事を公開するタイミングでも同様に自動デプロイが実行されます。

今回 SSG を採用しており、ビルド時に microCMS から API にて記事データを取得し、静的ファイルを生成するようにしています。
そのため画面遷移時の同期通信などは発生せず、快適な操作性を実現しています。

開発の流れ

要件定義・WF 作成 (半月)

ブログコンセプトの決定とデザインの WF(ワイヤーフレーム)作成に注力しました。
デザインは妻に外注しています。
妻は現在、未経験から UI・UX デザイナーへの転職活動をしており、今回のブログデザインは良いポートフォリオになると思いお願いしました。
おしゃれで使いやすい UI のデザインを作成してくれて大満足です!

PC のみならずレスポンシブのデザインも作成していただきました。
■PC

■ レスポンシブ

またデザインツールに「Figma」を使用しています。
Figma は以下の 2 点が魅力的で、チーム開発において最適なデザインツールだと捉えています。

  • コンポーネント単位にパーツを分割し、再利用できる
  • 複数人でデザインを共有し同時操作ができる

今回のブログデザインもコンポーネントを作成し再利用することで効率的に開発することができました。

設計・開発・デプロイ(1 ヶ月)

WF 完成後、妻が本格的なデザインカンプを作成するのと並行して、私の方で技術ブログの開発に取り組みました。
スキルスタックは以下の通りです。

  • Next.js
  • TypeScript
  • CSS Modules
  • jest, testing-library
  • Storybook
  • eslint, prittier

またその他ライブラリとして、以下のものを導入しています。

  • dayjs
  • axios
  • react-anchor-link-smooth-scroll // ページ内リンク
  • react-modal // モーダル表示
  • react-scroll // ページトップへ遷移するためのライブラリ
  • react-share // SNS シェアボタン
  • cheerio // microCMS の記事データを変換
  • highlight.js // 記事内のコードをハイライト

設計方針や構成などは後ほど「NOCHITOKU ブログ」で発信する予定です。
また Github にコードは公開していますので、ご興味がありましたらご覧ください。

YukiOnishi1129/nochitoku-blog

役にたった記事紹介

開発時に助けられた記事を紹介いたします。

Next.js に CSS Modules を導入する

CSS Modules を Next.js に導入する際にとても参考になりました。
CSS 変数の扱い方、メディアクエリの共有方法、絶対パスの指定方法など助けられました。

Nest.js + Storybook + Bulma 環境構築メモ

Storybook に CSSmodules を導入する際の方法です。
「sass-loader」のバージョンが v10.1.1 にしないと、Storybook 側でエラーが発生するので注意です。(Storybook が v6 の場合)

How To Import SVGs into NextJS

Next.js で svg を使用する設定です。
いくつか方法はありますが、私は以下の方法を取っています。

  • 「babel-plugin-inline-react-svg」を install → .babelrc に設定
  • index.d.ts に svg の型定義を追加

Next.js でサクッと PWA 対応

Next.js に PWA 対応を導入する方法です。
「next-pwa」というライブラリが良く使われているので、こちらを採用しました。

Next.js の Preview Mode + Vercel でプレビュー機能を実現する

microCMS 側で記事を下書きした場合のプレビュー機能の設定です。
結構難しかったですが、micoroCMS 社が記事にしてくれていたので、詰まることなく進めることができました。
プレビュー機能を導入する際も、ホスティングは Vercel にした方が構築は楽でしたね。

Using NextJS with Google Analytics and TypeScript

Next.js に Google Analytics を適用させる方法です。
gtag の型定義ライブラリである「@types/gtag.js」をインストールすることで簡単に設定できます。

Next.js(SSG)でページネーションを実装してみよう

ブログ記事一覧ページのページネーションの構築方法がまとめられています。
getStaticPath で動的ページの作成、getStaticProps でデータ取得、ページネーションコンポーネントの作成など、結構複雑でしたが記事があって助かりました。

Next.js アプリを Vercel で公開して、独自ドメインに反映する

XSERVER で取得したドメインを Vercel に割り当てる方法です。
こちらはサブドメインの割り当てですが、オリジンドメインを XSERVER 側で設定し、ネームサーバを Vercel に設定し直せばいけました。
この辺りもいつか NOCHITOKU ブログでまとめようと思います。

最後に

以上、JAMstack な技術ブログを開発した話でした。
SSG に関しては初めての実装だったので戸惑うことが多かったですが、数多くの技術記事のおかげで完成まで到達することができました。
私も「NOCHITIOKU」ブログで技術ノウハウを発信していき、同じように苦しんでいるエンジニアの方々の手助けをしていこうと思います。
「NOCHITOKU」ブログでは実践的な技術ノウハウを中心に発信していきますので、ぜひご覧になってみてください!

「NOCHITOKU ブログ」について

また私の妻が現在 UI・UX デザイナーへの転職活動をしております。
このブログのデザインを 1 から全て担当しており、もしご興味がありましたら以下のアカウント宛に DM いただければ幸いです。

@shio_design