2022/04/23
JSX as data

このサイトはnext exportされた静的ファイルのSPAで、各記事はファイル名が日付のJSXになってる。もしかすると「JSXをvalueとしてもつJavaScriptオブジェクト」という表現のほうが正しいかも。ここでは区別しない。

例えばsrc/2021/2021_0101.jsはこんな感じ。
(拡張子が.jsなのはNext.jsが賢いのに任せているだけで、拡張子を.jsxにしたくない派というわけでもない。)

export default {
    title: '新年',
    content: (
        <p>
            あけましておめでとうございます。<br/>
            CSS何も分からん。
        </p>
    )
}

ブログとか記事とかそういうのはデータとして扱いづらくて、どうするのがいいか悩ましいわけ。今、すごく雑なことを言っています。データとして扱いやすくすると、コンテンツとしての表現力が下がるか面倒になりそう。MDXという解決もあるけど、全然気に入らず。次に、markdownをそのままhtmlに変換するのはどうかと考えたら、

  • markdownを書きたくない
  • htmlをそのまま書きたい

という気持ちが出て、前者はよく分からないけど放置して、後者に向き合うことにした。そしたら目の前にJSXがあったので採用して、紆余曲折ありつつ、最近やっと当初の目論見がだいたい達成された雰囲気になってきてる。それでもデータフォーマットとしては名前付きexportがexport defaultになったぐらいで他は変わらず。

getStaticPropsとかgetStaticPathsであればnodeのfsが普通に使えるので、記事ファイル名の一覧(2021_0101.jsなど)を取得して、dynamic importで読み込んだJSXをごにょごにょして、サイトの組み立てと表示に使っている。

dynamic importを使って静的なSPAを出力してるのが楽しいところで、混乱するところ。実際にdynamic importしているのはgetStaticなんとかではなく各ページのコンポーネントのレンダリング時(つまりNext.jsではなくReactのライフサイクル内)で、グローバルに1つのPromiseが全記事をまとめてimportしている。このPromiseの裏には上述の「記事ファイル名の一覧」のキャッシュがあって、これは当然グローバルに1つなのだけど、getStaticなんとかのときと、ページコンポーネントがレンダリングされるときでは実行環境が違っていて、前者でキャッシュされていても後者で再取得される。そりゃそうかと思ったり、同じプロセスで実行できないんだっけと考えたり、まだ混乱は残ってるんだけど楽しい。

とはいえ現在はgetStaticPropsで取得したファイル名の一覧をページコンポーネントに渡していて、一度しか取得されない実装になっている。先に取得しておけばいいもんね。この「先に取得しておけばいいもんね」が曲者で、ファイル名の一覧はStringの配列だから渡せるんだけど、記事そのものはJSXなのでページコンポーネントに渡せない。シリアライズできないって理解でいいのかな。JSXはデータじゃないのだ。それはそう。

フェーズの境界を実用のためにゴリッと繋げている通路こそがNext.jsに興味を持った理由なので、このあたりで混乱したり納得したりできて僕は幸せです。

日付
タイトル

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
新年