cubenoy22.com

Next.js でブログを作った

Cover Image for Next.js でブログを作った

Gatsby良さそうだったけどいろいろ理解が必要でやりたいことが詰まってしまったのでもっとシンプルなNext.jsでやってみた。

最初にやったこと

まず 公式サイト のチュートリアルを進めて簡単に把握。その後公式の blog-starter-typescript を参考に新規プロジェクトを作成。

変更したこと

AuthorとAvatarの撤去

個人ブログで100%自分が書く前提なので関連する部分を消去。

日付フォーマットの日本スタイル化

DateFormater タグのフォーマットを yyyy/MM/dd に変更

若干のデザイン変更

余白が広すぎると思った部分を削ったりフッターは自分の関連アカウントのボタンを並べるようにしてみたり。 tailwindcss を初めて使ってみたけどコンポーネントにユーティリティクラスを書くだけで済むから楽ちん。

レスポンシブ幅を5段階から3段階へ減らす

レスポンシブ画像を指定するのが面倒なので3段階にした。

https://github.com/cubenoy22/cubenoy22com-template/commit/60b054a01a58d6b171fdcbf5dbfc72451d19fe71

記事中のリンクのスタイル修正

下線もなければ色もなく見分けがつかない状態だったので markdown-styles.modules.css を修正した。

Before After
before after

https://github.com/cubenoy22/cubenoy22com-template/commit/f93658f0ab0ca7c75e653ccb1db61d387a2c907d

コードのシンタックスハイライトを追加

もともと remark, remark-html が入っていたので ```javascript... って書けばクライアント側でスタイルを当てることが可能な状態だった。
ただせっかくの静的サイトジェネレータなのでサーバーサイドでスタイルを当てておきたい。ということで、

$ npm i highlight.js remark-highlight.js

して(highlight.jsはいらなかったかも?) 、 markdownToHtml.ts を書き換えた

export default async function markdownToHtml(markdown: string) {
  const result = await remark()
    .use(html)
    .use(highlight)
    .process(markdown)
  return result.toString()
}	}

あとCSSの読み込みも: pages/_app.tsx

import 'highlight.js/styles/default.css'

コードにファイル名入れられるようにするの忘れてた。

画像の最適化

next-optimize-images のおかげで簡単にサムネイル画像などを生成できる。
画像が404だと困るので optimizeImagesInDev: true を指定してしまっている。パフォーマンスが悪くなってきたら改善したい。

https://github.com/cubenoy22/cubenoy22com-template/commit/8ed316857fa3bdf7db228560337bb22a056cbef5

記事のタグ機能

これGatsbyのテンプレートなどでは用意されているけど、Next.jsでは自前実装するのが良さそうだったのでNode.jsのツールを別で作った:
https://github.com/cubenoy22/cubenoy22com-template/commit/d68cc931200cbeaf7ec41992b2a7e9b564ab8997

記事を追加したり、タグを編集した後は毎回 /generators で npm run gen:tags ってやる必要があるけどデザイン修正とか記事以外の修正でデプロイする時はやらなくていいのがちょっと売りかもしれない。
まずは記事を大量に書いたりしないと効果がなさそうですが。

そしてビュー側の修正がこれ:

https://github.com/cubenoy22/cubenoy22com-template/commit/3131104758198d1abdccd3b2d84e50f5671734fe

タグ一覧ページとタグごとの記事を参照できるようにした。あらかじめ生成しておけば関連する機能で毎回大きいmarkdownを開かずに済むはず...?

OGP画像

便利なライブラリがあったので利用しましたが、Node.jsでもcanvas使うライブラリがあったりするみたい。

https://github.com/cubenoy22/cubenoy22com-template/commit/fced89515ec49311cde0ac97e92db4beb83a698e

SEO

NextSEO という便利なライブラリを利用

https://github.com/cubenoy22/cubenoy22com-template/commit/852106263269b3873be0dece3f1c313d5a6b59a1

とりあえず最初はこんな感じ?

他の フロントエンド タグの記事

Cover Image for Promise を可視化する

Promise を可視化する

Promise の生成と実行を記録しPendingのまま残ったPromiseを特定したときのお話