Open7

Next.js で CMS を使わないでブログ作成。

Daiki SakumaDaiki Sakuma

自分のプロジェクトで使おうとするとModule not found: Can't resolve 'fs'が出てしまう。これはブラウザ上のランタイムには fs がないからでバックエンドのランタイムなら大丈夫ってのはわかるけど、nextjs の blog-starter では fs module 使えてる。getStaticProps で呼び出してるからなのかな。この関数は SSG の際に使えるものでビルド時間に pre-render する。
https://github.com/vercel/next.js/tree/canary/examples/blog-starter
https://nextjs.org/docs/basic-features/data-fetching/get-static-props

Daiki SakumaDaiki Sakuma

ISR について少しまとめる。
ISR はビルド時に pre-render されたページへのリクエストがあったとき、初めにキャッシュされたページが表示されて、その間にバックグラウンドでビルドして後から表示してる。
これを使うメリットして LCP が改善すると思われる。Largest Contentful Paint は、ページの読み込みの際にメインコンテンツが読み込まれるまでの時間を示すもの。前は FCP があったらしいが、読み込みの際のごく初期の部分しか考慮できず、読み込みのインジケーターなどが表示される場合、ユーザーにとってあまり意味がないらしい。ここでの意味がないというのは読み込みのインジケーターのことを指しているのではなく、あくまでユーザ体験を中心としたパフォーマンスを測定する際のというコンテキストである。
https://nextjs.org/docs/basic-features/data-fetching/incremental-static-regeneration
https://web.dev/lcp/
https://web.dev/fcp/

Daiki SakumaDaiki Sakuma

remark とかで markdownToHTML をするけど、nextjs で @next/mdx があるからコンパイルを明記せずに mdx でブログ作成できないかなと考えてみた。
思い浮かんだのは、public 配下に posts/1.mdx 的なのを置いて、pages 配下の [id].tsx で useRouter 使って dynamic import で実装する。
https://www.npmjs.com/package/@next/mdx

Daiki SakumaDaiki Sakuma

下記画像がページ遷移のボタンクリックしてから dynamic import して描画されるまでのパフォーマンス。70ms ぐらいかかってる。nextjs の dynamic import は React.lazy を使用していて、ページのレンダリングに必要な JavaScript の量を減らして、最初の読み込みパフォーマンスを向上させる。また、コンポーネントやライブラリは、それらが使用されるときにのみインポートされ、JavaScriptバンドルに含まれる。また、Suspense と組み合わせて使用すると、Suspense の境界が解決されるまでコンポーネントのハイドレーションを遅らせることができる。

Daiki SakumaDaiki Sakuma

下記画像は md ファイルを remark でコンパイルした場合を測定したもの。合計 400ms ぐらいかかってる。体感でも明らかに少し遅いと感じることができた。