※当サイトの記事には、広告・プロモーションが含まれます。

Next.jsでPages RouterからApp Routerに代わったが、結局どうするか。Next.jsでなくRemixという選択肢。

www.publickey1.jp

www.publickey1.jp

⇧ シンプルにしようとしてくれるのは素晴らしいんですが、破壊的変更が無いのが利用者にとっては嬉しい気がしますな、自分はRuby on Railsを利用していませんが...

Next.jsのPages RouterとApp Routerと

React単独での利用が非推奨っぽいので、Next.jsを利用せざるを得ないことになったので、Next.jsを利用しようとしたところ、どうも、Next.jsの端境期に遭遇したようで、

  1. Pages Router
  2. App Router

の切り替えの時期に、Next.jsの入門をすることになった模様。

と言っても、アーキテクチャが分からんので何が変わったのかがサッパリ分かりませんと。

⇧ とのこと。

ネットの情報を漁った感じでは、

github.com

アーキテクチャの違いについての概念図のようなものは存在しないってことみたいね...

ブラックボックスにしてくれてますな...

ネットの情報によると、

handsonreact.com

⇧ Reactの場合は、上図のような全体像になるらしい。

ReactのRouterだと、

medium.com

⇧ 上記サイト様によりますと、使い方が4種類あるらしく、

  1. Browser Router
  2. Hash Router
  3. Memory Router
  4. Static Router

が用意されているらしい。

話が脱線しましたが、

github.com

⇧ Next.jsで上がっている課題から推測するに、

  • React単独
    • React Router
  • Next.js
    1. Pages Router
    2. App Router

といった感じで、React単独のRouterとNext.jsのRouterは全く別物と考えれば良いんですかね?

nextjs.org

⇧ 何と言うか、

Next.js is a React framework for building full-stack web applications. 

とあるのに、React Routerと相容れなかったりと、なかなかの絶望感...

Reactの公式のドキュメントに見当たらないけど、

reacthandbook.dev

github.com

⇧ ReactのEcosystemが、Reactと密結合してしまっているということですかね?

Wikipediaによると、

React (リアクト)またはReact.jsReactJS とは、ウェブブラウザで複雑なUIを容易に生成するためのフリーかつオープンソースフロントエンドJavaScriptライブラリである。

React - Wikipedia

Meta(旧Facebook)が2011年から社内用に開発していたライブラリを2013年に一般に公開したもので、Meta社と個人や企業からなるコミュニティによって開発されている。

React - Wikipedia

特徴

主な特徴 

Reactが提供する代表的な機能を以下に挙げる。

React - Wikipedia

歴史

ReactはFacebookのソフトウェアエンジニアであるJordan Walkeによって開発された。PHP向けのHTMLコンポーネントフレームワークであるXHP英語版の影響を受けている。

React - Wikipedia

2011年Facebookのニュースフィード上で最初に使用され、2012年にはInstagramでも使用されるようになった2013年5月のJSConf USでオープンソース化された。

React - Wikipedia

一般的なイディオム

Reactは完全なアプリケーションフレームワークを提供しようとはしていない。Reactはユーザインタフェースを構築するために設計されており、故に、開発者がアプリケーションを構築する際に必要であると考えるかもしれない多くのツールは含まれていない。

React - Wikipedia

⇧ とあり、React自体は、UIを提供することのみに特化しているという立ち位置らしく、本来であれば、その他の機能についてはReactの責任範囲外であると。

ちなみに、React Routerは、

github.com

React Router is a lightweight, fully-featured routing library for the React JavaScript library. React Router runs everywhere that React runs; on the web, on the server (using node.js), and on React Native.

https://github.com/remix-run/react-router

⇧ とあり、

remix.run

⇧「Remix」というWeb Frameworkを開発してる組織で開発されたものらしい。

なるほど、Reactの公式のドキュメントには、

  • ReactはReact単独での利用は非推奨として、以下、いずれかとの併用を推奨
    1. Next.js
    2. Remix
    3. Gatsby
    4. Expo(ネイティブアプリ向け)

⇧ のような感じの説明があり、

  • Next.js
    • Pages Router
    • App Router
  • Rimix
    • React Router

⇧ といった感じになるのか。

ネット上の情報が整理されてなさ過ぎて辛い...

Next.jsでPages RouterからApp Routerに代わったらしいが、結局どうすれば良いのか

とりあえず、Next.jsのRouterの話に焦点を絞ると、

qiita.com

nextjs.org

⇧ 上記サイト様によりますと、

No 項目 Pages Router App Router
1 Node.jsバージョン v18.17未満 v18.17以上
2 Next.jsバージョン 13未満 13以上
3 デフォルト Client Component Server Component
4 ルートレイアウト pages/_app.tsxおよびpages/_document.tsx app/layout.tsx
5 各ページの起点ディレクト pages/ app/
6 ファイル名の命名ルール 特に決まりなし page.js、page.ts、page.jsx、page.tsx

⇧ といった違いが大きな部分になるのかな?

まぁ、分からん用語のオンパレードなんだが...

公式のドキュメントによると、

⇧「pages/_app.tsx」、「pages/_document.tsx」の内容を「app/layout.tsx」に移し終えたら、「pages」ディレクトリは削除することになるらしいが、前提として「App Router」への移行が完全に遂行されていることが確認できてから行うらしい。

何をもって、完全に移行できたとみなせば良いのかをハッキリさせて欲しいんだが...

とりあえずは、

nextjs.org

⇧ メソッドとHTMLが混在するカオスな構成に慣れる必要があるということですか...

UIと処理は分離して欲しい気がするんだが...

エントリーポイントが不明だが、デバッグとかどうすれば良いのか

で、Routerとは少し話がズレるのだが、Next.jsでデバッグ実行とかしたい場合、どうすれば良いのか?

一応、公式のドキュメントによると、

nextjs.org

⇧ 上記が正しいとすると、

No 項目 CRA(Create React App) Next.js(App Router)
1 エントリーポイント src/index.tsx app/page.tsx

⇧ という感じになるんかね?

デバッグについては、

qiita.com

iret.media

⇧ 上記サイト様によりますと、

  • サーバーサイド
  • クライアントサイド

の区別をしているようなのだけど、どうやって区別しているのか基準が分からん...

公式のドキュメントによると、

nextjs.org

  • The client refers to the browser on a user’s device that sends a request to a server for your application code. It then turns the response it receives from the server into an interface the user can interact with.
  • The server refers to the computer in a data center that stores your application code, receives requests from a client, does some computation, and sends back an appropriate response.

https://nextjs.org/learn/react-foundations/server-and-client-components

⇧ という説明なのだけど、UIと処理がごちゃ混ぜになってるから、区別が付けようが無くない?

Vercelが公開している情報だと、

vercel.com

■Without React Server Compoenets

■With React Server Compoenets

⇧ そもそも、「Client Component」とは言わずに「Without React Server Components」と言っていたりするので、余計にわけが分からないことになっている...

ただ、

Server Actions: React’s first steps into mutability

Within the context of RSCs, Server Actions are functions that you define in an RSC on the server side that you can then pass across the server/client boundary. When a user interacts with your app on the client side, they can directly call Server Actions which will be executed securely on the server side.

https://vercel.com/blog/understanding-react-server-components

⇧ 上記の説明によると、

  • React Server Component
    「Server Action」を実装している

と言えそうなのですが、「Server Action」はと言うと、

react.dev

Server Actions

Server Actions allow Client Components to call async functions executed on the server.

https://react.dev/reference/rsc/server-actions

⇧ 安定してない、且つ、Reactのバージョン固定が必要とあって、甚だ不安しかないんだが...

When a Server Action is defined with the "use server" directive, your framework will automatically create a reference to the server function, and pass that reference to the Client Component.

https://react.dev/reference/rsc/server-actions

⇧ 上記のような関数を実装しているコンポーネントを「React Server Component」と見なせばよいということなんですかね?

何やら、

postd.cc

この文を書いている時点で、React Server Componentsの使用を開始する方法は1つだけであり、それはNext.js 13.4以降で、最新の再設計された「App Router」を使用することです。

https://postd.cc/server-components/

この新しい「React Server Components」パラダイムでは、すべてのコンポーネントが、デフォルトで、サーバー・コンポーネントとみなされます。クライアント・コンポーネントについては、「オプトイン」する必要があります。

https://postd.cc/server-components/

⇧ とあり、Next.js 13.4からは、デフォルトだと全て「React Server Component」扱いとなるらしい。

ただ、

react.dev

React Server Components

Server Components are a new type of Component that renders ahead of time, before bundling, in an environment separate from your client app or SSR server.

https://react.dev/reference/rsc/server-components

This separate environment is the “server” in React Server Components. Server Components can run once at build time on your CI server, or they can be run for each request using a web server.

https://react.dev/reference/rsc/server-components

⇧ React単独でも利用できそうではある。

う~む、Next.jsもファジーな部分が多過ぎて辛過ぎる...

どうも、昨今のフロントエンドの思想が理解できんのよね...

柔軟性を求めたが故に、複雑さが増しているのか分からんのだけど、アーキテクチャを図解で整理して欲しいですな...

あと、定義はハッキリさせて欲しいかな...

具体的な実装と定義が紐付かないから、何がOKで何がNGなのかがハッキリしないんよね...

ちなみに、

zenn.dev

背景

Next.js に App Router が導入されてから1年近くが経ちました。しかし、未だに App Router を前提として設計のベストプラクティスが定まっておらず、身近なフロントエンドエンジニアはみな「まだプロダクトに取り入れるには考えることが多いよね」という共通認識のまま止まっているような気がしています。

Next.js って App Router が出てきて平和じゃなくなったよね

⇧ まさかの本番環境では受け入れがたい説が...

なるほど、フロントエンドを生業とする方からしても、扱いに困る代物だったとは...

やはり、公式のドキュメントがイケてないってことに尽きるんですかね?

Next.jsは独自路線派、RemixはWeb標準に準拠する派

ネットの情報を漁った感じでは、

zenn.dev

zenn.dev

user-first.ikyu.co.jp

qiita.com

kdotdev.com

⇧ Next.jsは、Remixと比べた場合に、

  • 「Web 標準」を準拠しないことが多いらしい
  • バージョンアップにより不具合が起こる可能性が高い
  • Vercel へのデプロイが前提

という懸念がある模様。

「Next.js」は、「Next.js」を利用する開発者を人柱にしてる傾向があるらしいのも、誠に遺憾である。

ただ、Remixにも、ドキュメントの情報量が少ないという難点がありますと。

とは言え、運用・保守のフェーズを考えると、バージョンアップにより不具合が起こる可能性が高い「Next.js」は、爆弾を抱えているような心境で精神衛生上好ましくない気はしますな。

何か「Next.js」ではなく「Remix」を利用した方が良さそうのかしら?

ちなみに、

remix.run

⇧『Get good at Remix, get good at the web.』という哲学を掲げていたらしいのだけど、

remix.run

⇧ バージョン 2系ではリンクだけ残っているが、遷移先のページが無くなっており、「Remix technical explanation」に遷移するようになっている。

ネット上の情報によると、

⇧ Remixも過去にやらかしてるっぽい...

フロントエンドのライブラリって破壊的変更が多過ぎる気がしていて、設計が適当なんじゃないか疑惑がありますな...

何と言うか、頻繫にリリースしなくても良いので、しっかり要件を固めて開発して欲しいですな...

あまりにも破壊的変更が多過ぎるからして、もし、アジャイルとかで開発を進めているんなら、ウォーターフォールでの開発にした方が良いんじゃないかね?

ライブラリの利用者(アプリケーション開発者)に負担させ過ぎなんよね...

う~む、結局、

  • Next.js
  • Remix

のどちらを利用すれば良いのか...

2024年5月時点の情報によると、

developer.chrome.com

⇧ 上記のマトリックス表に、各々のJavaScriptフレームワークで用意されている機能がまとめられている。

フロントエンド、関わりたくないなぁ...

毎度モヤモヤ感が半端ない…

今回はこのへんで。