個人ブログを作成してみる

## はじめに

### 概要
個人ブログを作りたいと思い、作った内容を備忘録としてQiita記事に投稿します。開発力はまだまだ駆け出しですが、私のような初心者の方が始める際の参考になれば嬉しいです。本記事や作成したブログも温かい目で見ていただきますようよろしくお願いします。

### 対象読者
- Next.js, TypeScriptちょっとわかる人
- 個人ブログを作成してみたい人

### きっかけ
- 自分の転職を機に勉強するモチベーションとして自作のブログを運用してみたく作成しました
- あるあるですが、読書メモなど技術以外の記事を書きたかったので自分でよしなにできるブログが欲しいと思い作りました
- 開発力をあげるために自分で作成・運用ができるようにブログサービスには頼らず作ってみたかった

### 作成したもの

https://myblog-99i.pages.dev/

※まだトップページとそこから辿れる記事ページしかできていません。

## 使った技術

技術は手段でしかなく、流行り廃りもあるので選定にはこだわってはいません。強いていうなら

- 自分の仕事に活かせそうなもの
- コストをかけずにできる
- 参考記事があるもの
  - ブログ自体の作成に時間をかけるといつまで経っても始められないため
  - 自分の開発力がそこまでないため

です。

### [Next.js](https://nextjs.org/)

- [React](https://ja.react.dev/) のメタフレームワーク
- 他にも Gatsby, Astro がありますが、業務で使う可能性が高いものが　Next.js でした
  - 時間があれば勉強したい...
- 推奨になった`App Router`を使いました
  - 以前触ったのが`Pages Router`であったため、リハビリのため[Learn Nextjs](https://nextjs.org/learn)をやりました
- ディレクトリ構成はやりながら自分の方法を見つければいいと思ったのでとりあえず[この方の記事](https://zenn.dev/brachio_takumi/articles/5af43549cdc4e0)を参考にしました

### [Tailwind CSS](https://tailwindcss.com/)

- 以前触ったことがあり、Next.js のスターターに最初から入っているので tailwind を採用しています

### [Contentlayer](https://contentlayer.dev/)

- 書きやすさと他サービスへの移植性の観点から投稿記事を Markdown 形式で書きたく、いろいろな参考記事があり、採用しました
- 利用するにあたり、[Getting Started](https://contentlayer.dev/docs/getting-started-cddd76b7)で勉強しました
  - 色々参考記事がありましたが、結局Getting Startedが一番よかったです
  - 段階的に学ぶことで初期セットアップに必要なもの、設定ファイルに書くべきもの、実装の仕方がわかるようになるため
- 後から Zenn の CSS が用意されていることに気がつき、[これ](https://zenn.dev/team_zenn/articles/intro-zenn-markdown)にすればよかったとも少し後悔している

### [Cloudflare Pages](https://pages.cloudflare.com/)

- 商用、無料で利用できるため
- Cloudflare を触って機能を把握してみたかったため
  - CDN で有名である Cloudflare を把握しておくことは今後に活かせる可能性が高いと考えた
  - Pages ではないが、業務で Cloudflare を使う可能性があった
- 消去法
  - [Vercel](https://vercel.com/)
    - Next.js の学習の時に使い、ある程度慣れていた。今回は慣れていないものを使いたいと思い除外
  - [Github Pages](https://pages.github.com/)
    - 業務でちょこっと使ったことがあった。
    - 静的エクスポート後のリポジトリを参照する必要があり、リポジトリが複数になりそうだった。
  - [Netlify](https://www.netlify.com/)
    - Netlify から Cloudflare へ移行している記事が多かった
    - おそらく東京にエッジサーバがなく遅いのだろう（と推測）
  - [Firebase Hosting](https://firebase.google.com/docs/hosting?hl=ja)
    - 悩んだ。。
    - 今度モバイルの勉強をするので firebase はそれで慣れることにした

## ブログを実装する

### とりあえずサンプルで起動してみる

自分にデザインの素養がないのとゼロから考えるのは大変だったためフリーで参考になりそうなものを探しました。最終的には[このサイト](https://github.com/timlrx/tailwind-nextjs-starter-blog)のが自分の実現したいブログに一番近く、MIT ライセンスであったため採用しました。

README に書いてある Quick Start Guide を参照すれば苦労することなく起動することができます。同じように参考にしている記事がいくつかありました。

- [ブログをリニューアルしました](https://oikawa.dev/blog/20220508_blog-setup)
- [そろそろ自分のブログを作ってみることに...　序章](https://zenn.dev/melodyclue/scraps/fe11992773f65b)

しかし、一部修正をしようにも、本サイトでは自作パッケージが使われていて、依存パッケージのバージョンを変えたり使われている技術を理解するのが大変でした。結局このパッケージを使うことを諦め、ゼロから自分で作りました。サンプルページをそのまま使う分には立ち上げも簡単なため非常に良いですし、ヘッダやダークモードの切り替えなど各コンポーネントで参考になるところはあるのでサンプルとしては非常によかったと思います。

### トップページを作る

ということでゼロから自分で作ることにしました。

前述の通りサンプルの構成は気に入っていたので、[ヘッダ](https://github.com/timlrx/tailwind-nextjs-starter-blog/blob/main/components/Header.tsx)と[フッタ](https://github.com/timlrx/tailwind-nextjs-starter-blog/blob/main/components/Footer.tsx)はサンプルのコンポーネントを持ってきて加工しました。

トップページのコンポーネントは以前[本記事](https://qiita.com/kmnky/items/614a22d6724a85dee0da#tailwindcss)にて学習した際に tailwind のコンポーネントの参考になりそうなサイトを備忘として残しておいたのでこちらから探しました(よろしければ Qiita 記事にいいねください)。最終的には[TAILBLOCKS](https://tailblocks.cc/)のブログコンポーネントを参考にさせていただきました。

### 投稿ページを作る

前述のサンプルで Contentlayer を使っていたのでそのまま Contentlayer を採用しています。私のように Contentlayer の記事を色々みても config ファイルの修正などどれをどうすればいいのかわからない方は[Getting Started](https://contentlayer.dev/docs/getting-started-cddd76b7) をやって理解を深めてやると良いと思います。本ページは Getting Started の結果をほぼそのまま使っています。

Contentlayer を使ってブログを作っている参考サイトで kedama-t さんの[ブログ](https://kedama-t.netlify.app/posts/tech/01.create_own_blog)や[Qiita 記事](https://qiita.com/kedama-t)がとても参考になりました。こちらのブログは自分で CSS を定義したり、独自色があって素敵でした。ただ、私には CSS を自分で作るセンスがなかったので、[こちらの記事](https://zenn.dev/team_zenn/articles/intro-zenn-markdown)の CSS のみ適用するというサボりをしました。（Contentlayer を使わず html パッケージを使うというのもありだなと思いました。）

https://kedama-t.netlify.app/posts/tech/01.create_own_blog


ついでに[こちらの記事](https://inari-tech.net/posts/zenn-toc-tocbot)によると簡単に目次が作れそうだったので、ほぼそのまま適用しました。INARI TECH さんは他にも参考になりそうな記事やコンポーネントを公開していました。

https://inari-tech.net/posts/zenn-toc-tocbot


## 静的エクスポートの設定

### エクスポート

今回使っている Next.js の ver.14 では`next export`コマンドが使えなくなっています。代わりに[ドキュメント](https://nextjs.org/docs/pages/building-your-application/deploying/static-exports)にも記載されている通りに設定する必要があります。

```javascript
const nextConfig = {
  reactStrictMode: true,
  swcMinify: true,
  output: "export", // outputを追加
};
```

この設定を加えるだけで、`next build`した際に`out`ディレクトリに静的ファイルが出力されるようになります。この out ディレクトリを Cloudflare で公開するようにします。

### その他

細々したことですが、エクスポートする際に引っかかった 2 点紹介します。

- 画像が出力されない
  - 当初 Next/Image を使っていましたが、デフォルトでは出力されません。
  - ドキュメントにも対応方法が書いてあるっぽいのですが、私の技術力では足りず、、今回は img タグに切り替えました。
- HTML ファイルにあるアポストロフィーで Lint エラーが出た
  - `react/no-unescaped-entities": "off"`で Lint エラーをオフにしました。

## Cloudflare にデプロイする

[【Cloudflare Pages】ブログを公開したい？...5 分もあれば十分だ](https://zenn.dev/rivine/articles/2023-06-23-deploy-hugo-to-cloudflare-pages)の記事の通りに実施しました。タイトルは大げさかもですが、この記事の通り確かに簡単にできたので手順は割愛します。

事前に準備しておくことは以下です。

- フロントエンドリポジトリ(Github)
  - 発行されるドメインはリポジトリ名に 3 桁のランダム値が付与される名前になるようなのでリポジトリ名は事前に良いものにしたほうがいいかもしれません。
- ビルド
  - ビルドコマンドと出力先を入力するので事前に把握しておく。

実際にデプロイしてみた感想としては、
- Cloudflareでよかった点
  - 構築は不要で、リポジトリとビルドコマンドを設定するだけで簡単にデプロイされる
  - Cloudflare のセキュリティ対策の恩恵を受けることができる
  - リクエストのメトリクスを取得できる
- Cloudflare で苦労した点
  - 色々な比較サイトに書いてあるとおり、サーバサイドレンダリング(SSR)に関しては Vercel が楽だなと感じました。Nextjs の静的エクスポートをしましたが、Image で怒られて今回は諦めて img を使うことにしました。何かの記事で Next.js は Vercel をホスティングすることが前提になっているかも？という議論を見て、今回その一端を少し感じてしまいました。


## おわりに

自分なりにシンプルでいいブログが作れたと満足していますが、まだ一部のページしか作れていないのでやることばかりです。

- About ページを作る
- タグをつける
- ブログ一覧ページをつける
- 埋め込みリンクができるようにする
- SEO や広告など


また、Cloudflare は\_headers でヘッダを設定できるようなので、ブログの改善に飽きたらこちらを試してみたいと思っています。

最後まで読んでいただきありがとうございました。

## 参考文献

- 使用技術の学習
  - [Learn Nextjs](https://nextjs.org/learn)
  - [Content Layer Getting Started](https://contentlayer.dev/docs/getting-started-cddd76b7)
- デザインの参考
  - [Nextjs のサンプル集](https://github.com/vercel/next.js/tree/deprecated-main/examples)
  - [このサイト](https://github.com/timlrx/tailwind-nextjs-starter-blog)
  - [ブログの構築](https://kedama-t.netlify.app/posts/tech/01.create_own_blog)
  - [TAILBLOCKS](https://tailblocks.cc/)
  - [Next.js 製 個人ブログに zenn-markdown-html と zenn-content-css を導入する](https://zenn.dev/team_zenn/articles/intro-zenn-markdown)
  - [tocbot で Zenn とか Qiita みたいな目次を作る](https://inari-tech.net/posts/zenn-toc-tocbot)
- その他
  - [Next.js+Go でクイズアプリを作ってみる](https://qiita.com/kmnky/items/614a22d6724a85dee0da)