2022/01/09
さすがにSPAだとSEO対策やOGP対応できないのでNext.jsに移行した。
/pages/api
にDBアクセスするAPIを書いて /pages
のgesStaticPropsからAPIを呼び出すのかと思ってたが、getStaticProps内で直接DBアクセスすることでデータを取得できた。APIという依存が1つ減っただけでかなりすっきりした実感がある。
どうやって posts/[id].html
のようなルーティングができるようになるのかと不思議に思ってたら export getStaticPaths
することで対応できた。
export async function getStaticPaths() { const results = JSON.parse(JSON.stringify(await query('SELECT * FROM post WHERE published = true'))) const paths = results.map((post: any) => `/posts/${post.id}`) return { paths, fallback: false } }
今回、データはfirestoreからMySQLを使うことにしたので、DBへのアクセスが必要になった。Next.jsからのMySQLクライアントラッパーで一番使われてそうだったので serverless-mysql を使った。
Next.jsのサンプルを参考に、薄いwrapperを作成して使いやすくした。 https://github.com/92thunder/blog/blob/main/blog/libs/db.ts
Material UIから4から5へ変わっていたがpackage名の変更くらいしか影響がなかった
buildしてからexportすることで静的なHTMLを生成することができる。2GBのVPSだとビルド失敗することあってわりと厳しめ。
"scripts": { ... "build": "next build && next export", ... }
SPA用の設定だとだめだったので、ここを参考にしてpathに応じてNext.jsのルーティングに対応したHTMLを返すように設定した
https://gist.github.com/zackad/7dd46be60df4fe7d1010a0fcf33d1afc