どうもこんばんわ。
恋にはあまえが必要です 攻略しました。
ゆびさきのときとは違ってちゃんとメッセージアプリのテキストも読み上げてくれます神。
この子のBルートの最後のイベントCGがめっちゃ好みです。
個人的には 満留さん と 千羽ちゃん のルートが好きです、
Aルートのほうが好みでした。
かわいい
↑ ヒロイン視点がめっちゃいい
ルート選択、妹ちゃんルートはちゃんと午後からしか出現しないようになってた(それはそうか
あつい・・・あついね
予想よりもめっちゃよかったです!!おすすめ(様子見しようかと思ってたけど予約してよかった)
あとめっちゃ関係ないですがMisskeyのお一人様インスタンス
立ててみました。しばらく見てないうちにインスタンス
ではなくサーバー
って言うようになったらしい。
こちらです。立ててしまった以上使わないとお金かかかるので使います・・・多分(???)
- URL
- ID と 鯖
@takusan_23@diary.negitoro.dev
なぜか私の鯖からリモートのユーザー情報が取れない鯖があるんですけどよく分かりません・・・
io鯖とかは普通にリモートフォロー出来たのでほんとに謎です・・・
本題
Next.js
のAppRouter
に移行しようと思います。いい加減やります。
おそらく日が経ったので、PromiseでJSX
を返してもエラーにならないはず・・・!
環境
| |
---|
Next.js | 13.4.4 |
React | 18.2.0 |
TypeScript | 5.1.3 (後述) |
リポジトリ | app_router ブランチ |
Next.js の AppRouter
React Server Components
が採用されているので、デフォルトで.tsx
を作った場合はサーバー側で描画されます。
???
サーバー側(このブログはSSG
ですが)でReact (JSX)
からHTML
を作ってクライアントに返そう言っています。?
動きのない(タイトルを表示している部分など)はこれを使うと、追加のJavaScript
が無いので軽くなるとか??
サーバー側で描画するため、直接データベース / API
へアクセスし、コンポーネントをクライアントへ返すことができるらしい。うーん難しい
サーバー側で描画されるので、useState
や、onClick
、Context
は使えない(動的な要素が必要ならクライアントコンポーネントが必要)
てなことがここに書いてある。
https://nextjs.org/docs/getting-started/react-essentials#when-to-use-server-and-client-components
データ取得の新しい考え方?
getStaticProps
は無くなったそう。かわりにコンポーネントが非同期で返せる(!?)ので、直接await
でブログ記事とかを読み込めばいいらしい。
コンポーネントでAPI叩くとか非同期なことできるようになったのがRSC
なのか・・・?
上に関連してなんですが、どうやらページの作り方の考え方も変わってるそうで、
今まではgetStaticProps
でデータを取ったら、Props
を他のコンポーネントにバケツリレーしてたと思うのですが、、
AppRouter
ではできる限り、非同期コンポーネント内でそれぞれgetStaticProps
に当たる取得処理をするのが良いらしい。どゆこと?
Material-UI
このブログはMaterial-UI
を使っていて、Material-UI
はクライアントコンポーネントで描画する必要があります。
というわけで、"use client";
をひたすら書いていくのが今回の移行作業だと思います・・・
せっかくApp Router
なのに、全部に全部"use client"
したら意味がないんじゃないかと思っていましたが、
サーバーコンポーネント以外にもメリットがあると言ってくれているので、pages
から移行したほうが良さそう
( 非同期なコンポーネントや、Next.js 用 fetch API
、pages ディレクトリ
よりも柔軟なファイル構成 など。特に最後のやつはそれだけでも旨味ありそう? )
移行します
公式
https://nextjs.org/docs/app/building-your-application/upgrading/app-router-migration
手順としては・・・
- もろもろ更新する
- 暗黙的な
children
が無くなったりとめんどいかも
pages
のルーティングをapp
に移動する
- 既存の
pages
で動いてたページをクライアントコンポーネントとして使えるようにする("use client"
をひたすら付ける)
app
へサーバーコンポーネントとして動くページを作り、データ取得と↑で作ったクライアントコンポーネントを呼び出す
generateStaticParams
を使って動的ルーティングを実装する
GoogleAnalytics
やグローバルCSS
を動くように調節する
がんばりましょう。。。
更新
Next.js
を更新します
npm install next@latest react@latest react-dom@latest
TypeScript
だけはnpm i -D typescript
で更新されなかったので直接package.json
をいじりました。
typescript
を5.1.3
以降へ、@types/react
を18.2.8
以降にします。
直接いじった場合、package-lock.json
、node_module
を消してnpm i
しないとだめです。
app フォルダを作る
pages
のようにapp
を作りました。
_app.tsx を layout.tsx にする
_app.tsx
を使って共通レイアウトを作ってましたが、App Router
ではlayout.tsx
を作ることで共通レイアウトを作れるようになりました。
app/layout.tsx
app/ClientLayout.tsx
_document.tsx を layout.tsx にする
また、next/head
も変更されており、メタデータを公開するような形になっています。
_document.tsx
でhead
いじってた場合はここに書くっぽい。
pages/_document.tsx
app/layout.tsx
icon
、favicon
は、appフォルダ
内に入れておくことで自動で認識して追加してくれるそうです。
https://nextjs.org/docs/app/api-reference/file-conventions/metadata/app-icons#image-files-ico-jpg-png
pages を app に移動する
pages/index.tsx
をクライアントコンポーネントにします。
app/ClientHomePage.tsx
次に、app/page.tsx
を作り、getStaticProps
でやっていたロード処理を非同期コンポーネント内でやるようにします。
app/page.tsx
なんとなく並列にしてみただけで、大人しく一個一個await
しても問題ないはずです。
最後に、pages/index.tsx
、pages/_app.tsx
、pages/_document.tsx
を消します。残しておくと、app
なのかpages
なのかどっちなんだい!ってなっちゃうので
どうだろう、これで見れるはず?
ひたすら pages を app にする作業をする
これを繰り返します。
getStaticPaths
は後でやります。
ルーティング
App Router
は、フォルダを作っただけではパスとしては認識されません。
フォルダの中にpage.tsx
があるかでパスとしては認識するかどうかが決まります。
なのでpages
でこうだった構成だと
app
だとこうなるはず
パスの名前のフォルダを作る必要がある感じですね。
一見ややこしいように見えますが、page.tsx
を置いてないフォルダはさっきの通りパスとしては認識されないので、
同じ場所にテストコード、コンポーネントを置くなどができるようになりました。
- app
- posts
- posts-components // 記事表示で使うコンポーネント置き場
- tests // テストコード
- [blog]
わかりやすいような・・・ややこしいような・・・
あと動的ルーティングはフォルダ名を[動的ルーティング名]
にすればいいです。([id]
とか[page]
とか)
page.tsx
からは以下のように引数で動的ルーティングのパス名が取れるようになります。
https://nextjs.org/docs/app/building-your-application/routing/dynamic-routes
どうでしょう、CSS
が当たってなかったりしますが、、、、とりあえずは出るようになりましたか?
もしConflicting app and page file found
がでてしまったら、一度開発サーバーを起動し直すといいかもしれないです。
npm run dev
動的ルーティング を返してあげる
動的ルーティングで生成されるパス一覧を返してあげます。
getStaticPaths
はAppRouter
ではgenerateStaticParams
になります。
API
はそんなに変わってないはずです。
pages/posts/[blog].tsx
app/posts/[blog]/page.tsx
404.tsx を not-found.tsx へ移行する
pages/404.tsx
もapp/not-found.tsx
へ移動します。
これでpages
フォルダーは削除できるようになるはず・・・!
CSS をなおす
layout.tsx
でcss
を読み込むことが出来ます
GoogleAnalytics をなおす
これはGA4
でSPA
でも使える設定(なんだっけ?、パスの変化を検知するみたいなやつ)をしていない場合に必要です。
useRouter
で遷移時にイベントを取得し、そのタイミングでGAの遷移イベント
を飛ばしていたやつは修正が必要です。
こーゆーやつ ↓↓↓
で、useRouter usePathname useSearchParams
の3つに分裂したそうなので置き換えます。
クライアントコンポーネントである必要があります。
https://nextjs.org/docs/app/api-reference/functions/use-router#router-events
app/layout.tsx
で呼び出せば良いのですが、<suspense>
でくくらないと怒られます。
これで一通り出来たかな???
静的サイト書き出しを有効にして、本番ビルドしてみる
https://nextjs.org/docs/pages/building-your-application/deploying/static-exports
next.config.js
に追記する必要があります。
また、output: 'export'
が追加された影響で、npx next export
が無くなったため、package.json
に書いたビルドコマンドも修正する必要があります。(npx next build
だけでよくなりました)
これでビルドしてみる。多分動くはず。
流石に全部やると時間かかりすぎるので記事を2個ぐらいにした。
型チェックが厳しくなった?
型のチェックが厳しくなっている?
TypeScript
、エラーがわかりにくい気がするんですけど、私だけなんですかね・・・
Kotlin
のfilterNotNull
に当たる処理が思いつかないので調べたんですが、flatMap
を使う方法だと型を予測して解決してくれていい感じ。
https://stackoverflow.com/questions/43118692/typescript-filter-out-nulls-from-an-array
静的書き出し結果を見てみる
npx next start
は使えなくなりました。
かわりに、以下のコマンドで起動できます。
うーんなんか全然動いて無くないか?
/posts/page/1/
を押してもなんかパスが中途半端なんですけど? → generateStaticParams
間違ってました。ごめんなさい
ついでに直したいところ
他に直したい部分が何個かあるんですよね...
- ドメインをハードコートするのをやめて、環境変数にする
- ドキュメント通りのサイトマップ生成を使う
- app/README.md 更新する
- Babel をやめたい
- ServiceWorker やめたい
- next/font を利用したい
- トップページの画像変えたい
- サイトマップ生成も変えたい
- 404 の画像変えたい
- OSSライセンス画面更新
- ビルドコマンドの修正(ライブラリ無しでサイトマップ生成したので
postbuild
なしでよくなった。npx next build
だけでいいはず)
サイトマップ生成
App Router
から、サイトマップ生成がライブラリ無しで作れるようになったっぽいので、移行します。
https://nextjs.org/docs/app/api-reference/file-conventions/metadata/sitemap
app/sitemap.ts
npm run build
したあとout/sitemap.xml
が出来て、こんなのが出てきます。
Babel をやめて SWC にする
https://nextjs.org/docs/architecture/nextjs-compiler
そもそも何だこれはという話ですが、なんかSWC
を使ったほうが高速に動くらしい。
で、SWC
にしたいところなんですが、、Babel
でsvg
をコンポーネント化するプラグインを使っているので、この代わりをどうにかする必要があります。
困ってる人私以外にもいた
https://github.com/vercel/next.js/discussions/33161
SVGR
を使っている人が多そうかな、じゃあこれで
https://react-svgr.com/docs/next/
.babelrc
を消して、プラグインも消しちゃいます。
次に入れて
npm install --save-dev @svgr/webpack
next.config.js
に書き足します。
webpack
の箇所ですね。
あとはsvg
のパスをインポートして、JSX書けば良いはず!すごい!
next/font を使う
こっちの方がいいらしい。ので
前は@next/font
を入れる必要があったみたいですが、Next.js
に組み込まれたみたいなので、入れなくても使えるらしい。
app/layout.tsx
で読み込めば良さそう。
用意したフォントを読み込みたいので、local
の方を使うぽい
https://nextjs.org/docs/app/building-your-application/optimizing/fonts#local-fonts
variable
を指定すると、.css
などから参照できるようになります。
<body className={koruriFont.variable}>
を忘れないようにしてください。(一敗)
app/layout.tsx
CSS
からはvar()
で参照できます。
global.css
Material-UI
のcreateTheme
も多分これで参照できているはず。
はい
next/head が無くなってしまったので、クライアントコンポーネントで head が操作できない?
唯一困ったかもしれない。
next/head
を使って、テーマの色に合わせてAndroid
のステータスバーの色も同じ色に合わせるようにしていたのですが、AppRouter
で使えなくなってしまった。
とりあえずDOM
をJavaScript
で無理やり変えてるんですけど、、、これでいいの?
動きました!
pages
→app
差分はこんな感じになります。
https://github.com/takusan23/ziyuutyou-next/pull/1
実際に適当に公開しても問題なさそうだったので、人がいなさそうな時にあげようかな。いや別にいつでも良いか・・?
2023/07/11 午前2~3時 くらいに入れました
Next.js
AppRouter
対応を入れます。
見てる人無さそうだったので(そもそもあんまり居ない;;
おわりに
めちゃ関係ないけどTailwind CSS
チョットだけ触ってみましたが、これで良くない?
サーバーコンポーネントとしてもTailwind CSS
は使えるみたいなのでMaterial-UI
をやめてもいいかもしれない
あと公式ドキュメント、Chromeの翻訳してるとルーティング失敗しない?
あとVSCode
はAltキー
を押しながらスクロールすると高速でスクロールできます。
おわりに2
ストレージがたりない!!!
[Error: ENOSPC: no space left on device, write]