2026/01/26
レンダリング!

元々このサイトはNext.jsで生成される静的サイトで、以下のようになっていた。

  • Next.jsによるStatic Site Generation
    • Next.jsのライフサイクル
      • getStaticPaths
        • [yyyy]_[mm][dd].jsなファイルの一覧を取得
          • 中身はexport default { title: string, content: HTML }なJSX(としてHTMLを持つJSオブジェクト)
          • ただし、ここでは中身は読まず、nodeのfs.readdirでファイル名のみ集める
        • Next.jsのDynamic Routesposts/[yyyy]/[mm]/[dd]なパス(とページ)を生成
      • getStaticProps
        • [yyyy]_[mm][dd].jsなファイルの一覧を取得(同上)
        • 各ファイルの情報をシリアライズ可能なJSオブジェクトとして用意する(つまりJSX等を渡せない)
      • Next.jsのpage / Reactのライフサイクル
        • JSXとしてHTMLを持つ各ファイルをdynamic importしてページを作る

いろいろと改善はしたけど、2022/04/23 JSX as dataと2021/01/02 Next.jsとPHPと私で書いたときとほぼ同じ。App Routerには移行せずPage Routerのまま。十分楽しんだし、そろそろNext.jsから離れるか、ということで書き換えて、以下のようになった。

  • nodeで実行
    • tscでJSXと.tsをESモジュールに変換
      • [yyyy]_[mm][dd].jsなファイルの一覧を取得
      • JSXとしてHTMLを持つ各ファイルをdynamic importする
      • renderToStaticMarkupで静的なHTMLを出力する
        • Reactでページを作る

実行順じゃなくて依存ツリー(?)なので注意。Next.jsのライフサイクルから解放された結果、JSX(を含むJSオブジェクト)のdynamic importを早めに行えるようになり、Reactのライフサイクル内では非同期実行を含まなくなった。あれ?(tscのコンパイル時にはdynamic importは実行されてないのに)コンパイル後のESモジュールがJSXをimportできるのは何故なんだろう。何か勘違いがありそう。ちなみに、renderToStaticMarkupはレガシーなAPIらしく、prerenderToNodeStreamだとサスペンスの解決まで待てるから非同期処理も含められて、かつ、「クライアントで React をまったく実行したくない場合」としてhydrationしない場合への言及もあるから、たぶん移行できるはず。そのうちやる。

HTMLで書きたいが、そのままでは辛い。だからJSX。Reactじゃなくていいのかもしれないけど、そこで道を踏み外すのは辛そうだし十分に好きだからReact。そして静的サイトが欲しくて、かつ、面白そうだったからNext.js。という流れの最後を差し替えたのが今回。いろいろと整理した後だったから割とすんなり。動いていないはずのCSSがNext.js版では動いていることが分かり、謎が解けないから仕方なく正しいものに直したりはした。あとTypeScript関連でも似たような謎があった気がする。

Live Reload的なものが失われたから、次はそれをどうにかしたい。そういうライブラリを使えばいいんだけど、依存を減らしたいから自分で書きたくて、Server-Sent Eventsを使ってどうにかする。開発用のサーバを書く感じ。最終的にこの部分はSwiftで書いてもいいかもなあ。

日付
タイトル

2026/03/14
読んだ本〜2026冬
2026/03/05
聴いてるポッドキャスト
2026/01/30
レンダリング?
2026/01/27
Live
2026/01/26
レンダリング!
2026/01/13
2025年まとめ
2025/09/23
読んだ本〜2025夏
2024/07/24
健康er
2024/02/10
健康
2023/05/19
喪/2
2023/04/24
コンサル
2023/02/01
それはそう
2022/12/17
2022/06/11
動かないもの
2022/06/05
スタイル
2022/04/23
JSX as data
2022/04/08
数学
2021/12/18
Activeな話
2021/09/05
Goのmultiple ABI
2021/07/31
『Goならわかるシステムプログラミング』
2021/07/28
ここにはタイトルが入ります
2021/01/25
これは日記ではない
2021/01/24
修行
2021/01/23
Considered Harmful
2021/01/22
雑感オブSwing
2021/01/21
雑感オブAndroid
2021/01/20
雑感オブiOS
2021/01/19
プログラミング言語その9【Groovy】
2021/01/18
1回休み
2021/01/17
会社を作る
2021/01/16
外国語
2021/01/15
プログラミング言語その8【C】
2021/01/14
プログラミング言語その7【OCaml】
2021/01/13
to be continued
2021/01/12
プログラミング言語その6【Kotlin】
2021/01/11
プログラミング言語その5【Swift】
2021/01/10
プログラミング言語その4【TypeScript】
2021/01/09
プログラミング言語その3【JavaScript】
2021/01/08
Comme d'habitude
2021/01/07
プログラミング言語その2【Java】
2021/01/06
プログラミング以前【Lisp】
2021/01/05
プログラミング言語その1【Objective-C】
2021/01/04
言語処理系入門
2021/01/03
ブログのようなもの
2021/01/02
Next.jsとPHPと私
2021/01/01
新年