TanStack StartはNext.jsより優れているのか?

MMaximilian Schwarzmüller
Computing/SoftwareInternet Technology

Transcript

00:00:00Tan Stack Startが最近注目を集めていますが、問題は、Next.jsから乗り換えるべきかということです。
00:00:06Next.jsより優れているのでしょうか?
00:00:08昨日、
00:00:09私は両者を比較し、
00:00:102つのアプリ、
00:00:11つまり1つのアプリを2回、
00:00:131回はNext.jsで、
00:00:14もう1回はTan Stack Startで構築する配信を行いました。興味があればご覧いただけますが、
00:00:21ここでは何が違うのか、
00:00:22何が優れているのか、
00:00:24どちらを使うべきかについて、
00:00:25簡潔にまとめてお伝えします。
00:00:27もちろん、
00:00:28これはあくまで私の意見であり、
00:00:30客観的な比較ではありませんが、
00:00:31両者についての経験と、
00:00:32Next.jsとTan Stack Startについての私の考えをお話しします。
00:00:37さて、
00:00:37私は両者を比較するためのいくつかの視点を用意しました。もちろん、
00:00:42さらに追加することも、
00:00:44より多くのフレームワークを含めることもできます。
00:00:47RemixやReact Router、
00:00:49VueのためのNuxt、
00:00:51SvelteKitなども含めることができますが、
00:00:53このビデオではNext.jsとTan Stack Startに焦点を当てます。他が劣っているからではなく、
00:01:00この2つがよく比較されるからです。
00:01:01まず注目すべきは、
00:01:02Tan Stack Startは結局のところ、
00:01:05Tan Stack Routerに主にサーバー関連の機能を追加したものだということです。
00:01:10サーバーサイドレンダリングやサーバーサイド関数が不要な、
00:01:13シングルページアプリケーションを構築したい場合は、
00:01:16Tan Stack Routerを単独で使用できます。
00:01:19例えば、React ViteアプリでReact Routerの代わりにTan Stack Routerを使用できます。
00:01:25そしてTan Stack Startは、
00:01:26前述のとおり、
00:01:27Tan Stack Routerにサーバーサイドの機能を追加し、
00:01:30完全なReactフルスタックフレームワークにしたものです。
00:01:32Next.jsも同様に、フルスタックReactフレームワークです。
00:01:37そして、これも重要なポイントです。
00:01:38Next.jsとReact Vite with React Routerのどちらを使うべきかという質問を時々受けますが、
00:01:45それは間違った比較だと思います。
00:01:47サーバーサイドロジックやサーバーサイドレンダリングが不要なら、
00:01:50React Vite、
00:01:52つまりReactを使ったViteプロジェクトを使い、
00:01:55React RouterかTan Stack Routerを追加すればよいのです。
00:02:00その場合、Next.jsを選ぶ必要はありません。
00:02:02それでは、比較を始めましょう。
00:02:05最初の視点は、両者のAI対応度です。なぜなら、今の時代、これは当然重要だからです。
00:02:12おそらく皆さんは、
00:02:13Next.jsやTan Stack Startプロジェクトで、
00:02:17コードの一部、
00:02:18あるいはすべてを生成するためにAIを使っているでしょう。そのため、
00:02:22AIはそのコードの書き方を知っている必要があります。
00:02:25もちろん、
00:02:26ドキュメントページをコピーしたり、
00:02:28Context 7のようなMCPを使ってAIにドキュメントにアクセスさせたり、
00:02:34AIにウェブ検索を実行させたり、
00:02:36Tan Stack StartやNext.jsの使い方を教えるエージェントスキルを追加することで、
00:02:43適切なコンテキストを提供すべきですし、
00:02:45実際に提供できます。
00:02:47しかし、
00:02:47何も設定せずにChatGPTにTan Stack Startについて質問した場合、
00:02:52Next.jsについて知っていることよりも、
00:02:54Tan Stack Startについて知っていることは少なく、
00:02:57しかもその知識はおそらく間違っています。
00:02:59なぜなら、
00:03:00この録画時点でも、
00:03:01Tan Stack Startはまだリリース候補段階にあり、
00:03:05大幅な破壊的変更はもうありませんが、
00:03:07完全に安定しているわけでもないからです。
00:03:10過去1年間、
00:03:11主にベータ版とアルファ版の段階にありましたが、
00:03:14それがこれらのAIチャットボットが初期状態で持っている知識であり、
00:03:18そのためTan Stack Startについては誤った知識を持っているのです。
00:03:23したがって、初期状態でのAI対応度はあまり高くなく、Next.jsの方が明らかに優れています。
00:03:31もちろんNext.jsも長年にわたって変更があり、
00:03:34新しいuse cacheディレクティブについてはAIも初期状態ではあまり理解していませんが、
00:03:40app routerやReact Server Componentsなどについてはかなり良く理解しているので、
00:03:46Tan Stack Startよりも明らかにNext.jsの方が優れています。
00:03:51しかし繰り返しになりますが、
00:03:53AIに必要な適切な追加コンテキストを提供することを確実に行うべきです。そうしないと、
00:03:59AIの使い方を間違えているだけです。
00:04:02エコシステムについてはどうでしょうか。ここで言うエコシステムとは、
00:04:05チュートリアル、
00:04:06YouTube動画、
00:04:07コース、
00:04:08そしておそらくこれらのフレームワーク用の追加パッケージなど、
00:04:11見つけられる他のリソースのことです。
00:04:13そしてもちろん、
00:04:14ここでもNext.jsはTanStack Startよりはるかに優れて見えます。単純に歴史が長く、
00:04:21より長く存在しているため、
00:04:22より多くのリソースを見つけることができますし、
00:04:25規模も大きいからです。
00:04:27もちろん、
00:04:27規模が大きいということは、
00:04:29より多くの利用者がいるということでもあります。なぜなら、
00:04:32Next.jsはAIがデフォルトで持っているスタックの一部であり、
00:04:35基本的にほとんどのWebアプリでNext.js、
00:04:38React、
00:04:39Tailwind、
00:04:40TypeScriptを提供してくれるからです。TanStack Startがデフォルトの選択肢になることはおそらくないでしょう。
00:04:47そのため、
00:04:47この2つのダウンロードチャートを比較すると、
00:04:50当然ながらTanStack Startのダウンロード数はご覧の通りかなり少ないです。
00:04:56Next.jsを除外すると、TanStack Startには良い上昇トレンドが見られますけどね。
00:05:01エコシステムの点に関連するのが、もちろん学習の容易さですが、それだけではありません。
00:05:07学習の容易さというのは、どれだけシンプルに学べるかということです。
00:05:11もちろん、AI時代の今、学習には興味がないかもしれませんが、優秀な開発者であれば、自分が扱っているものを理解すべきです。
00:05:19もはや全てのコードを手書きしているわけではないかもしれませんが、AIが生成してくれるコードは理解すべきなのです。
00:05:25だから学習は今でも重要なのです。
00:05:28ここでNext.jsについては、賛否両論だと思います。
00:05:331つプラスにするか2つプラスにするか迷うところですが、
00:05:36App Routerを使ったNext.jsの始め方は、
00:05:40ちなみにここでの話は全てApp Routerに関するものですが、
00:05:44かなり分かりやすいです。
00:05:46理にかなっています。
00:05:47昨日のライブ配信では、メモを作成、保存、表示できる小さなメモアプリを作りました。
00:05:56Next.jsでそれを行うには、
00:05:57いくつかのpage.tsxファイルを指定するだけです。それがあなたの、
00:06:01お察しの通り、
00:06:02ページになります。
00:06:03動的セグメントも使えます。
00:06:04その構文とアプリケーション構築のアプローチを学ぶのは、結局のところかなり分かりやすいです。
00:06:12ドキュメントも、コアコンセプトを段階的にガイドして、Next.jsを始めるのに良い仕事をしていると思います。
00:06:22しかし、より複雑なアプリケーションを構築し、キャッシングのようなより高度な概念に踏み込むと、状況は複雑になります。
00:06:30特にキャッシング部分は非常に混乱を招く可能性があります。なぜなら、
00:06:35Next.jsはApp Routerの導入に伴い、
00:06:39異なるレイヤーで超積極的なキャッシングを行うという決定をしたからです。それを理解し、
00:06:45コンポーネントを組み込みキャッシングとうまく連携するように設定し、
00:06:50ユーザーに望む動作を提供する方法を理解するのは難しいと言えます。
00:06:55そう言っておきましょう。
00:06:56始めるのは素晴らしいです。
00:06:59より高度な機能を学ぶのは難しいです。
00:07:02ここは2つプラスにしておきます。
00:07:05TanStack Startにも同じ評価を与えますが、理由は全く異なります。
00:07:09TanStack Startの場合、
00:07:12入門ドキュメントがNext.jsほど良くないため、
00:07:16始めるのはNext.jsより少し難しいと思います。
00:07:20データフェッチングやミューテーションといった重要な概念がここには欠けていると思います。
00:07:27ただし、
00:07:27すでにNext.jsの知識があれば、
00:07:29データフェッチングやミューテーションを含む主要機能を比較するかなり良い比較ドキュメントがあります。
00:07:36しかし、
00:07:37ドキュメントは大幅に改善されたとは言え、
00:07:40まだ少し情報の羅列的な感じがあり、
00:07:43どの記事が必要なのかあまり明確ではなく、
00:07:46例えばデータフェッチングの記事がここにないといったことがあるため、
00:07:52少し難しいかもしれません。
00:07:54さらに、
00:07:54TanStack StartはTanStack Routerの上に構築されているため、
00:07:59ルーティング関連のすべてについてはTanStack Routerのドキュメントを見る必要があり、
00:08:05これも初めて見たときはかなり圧倒されます。
00:08:07しかし、
00:08:07最初の障壁を乗り越えれば、
00:08:09はるかに簡単になり、
00:08:11私の意見では全てが非常に理にかなっており、
00:08:13それほど難しくありません。そして、
00:08:16Next.jsで遭遇するかもしれないキャッシング関連の問題のような隠れた落とし穴もありません。
00:08:22だからこそ、
00:08:23TanStack Startは始めるのは難しいけれど、
00:08:27一度動き出せば、
00:08:28Next.jsよりも高度な機能に進んで深く掘り下げるのが簡単だと思います。
00:08:32先ほど述べたように、これはもちろん私の個人的な見解にすぎませんが。
00:08:36さて、開発者の視点から見た使いやすさはどうでしょうか?
00:08:41開発するのはどれくらい楽しいでしょうか?
00:08:43これはもちろん完全に主観的なものですが、Next.jsには確実にいくつかの問題があります。
00:08:48学習に関連する問題だけでなく、他の問題もあります。
00:08:53例えば、
00:08:53キャッシングの問題では、
00:08:55アプリが開発モードと本番モードで異なる動作をすることがあり、
00:08:59常に本番モードでテストする必要があるということです。もちろんそうすべきなのですが、
00:09:04開発中にこれを常に行わなければならないとなると、
00:09:08開発スピードが遅くなるため、
00:09:10かなり面倒になります。
00:09:11これが私が過去に経験した大きな問題の一つです。
00:09:14また、開発サーバーもかなり遅くなることがあります。
00:09:18少なくともwebpackバージョンを使用している場合はそうですが、
00:09:21新しいデフォルトのturbopackバージョンははるかに優れています。しかし私の経験では、
00:09:26TanStack Startが提供するViteベースのセットアップには及びません。
00:09:30ですので、
00:09:31開発者体験の観点から言えば、
00:09:33私の経験ではこれを使った作業が非常にスムーズだったため、
00:09:38ここには3つのプラスを付けます。
00:09:40高速で、
00:09:41予測可能で、
00:09:42ほとんどの場合奇妙な動作もありません。まだいくつかの癖はありますし、
00:09:48まだリリース候補段階ではありますが、
00:09:50全体的にはNext.jsよりもTanStack Startの開発者体験の方が好みです。
00:09:57もちろん、あなたにとっては違うかもしれませんが。
00:10:01では、Next.jsとTanStack Startが提供する具体的な機能についてはどうでしょうか?
00:10:06ルーティングについては、
00:10:07先ほどお見せしたように、
00:10:08Next.jsではファイルベースのアプローチを採用しており、
00:10:12ルートとして機能するファイルを設定し、
00:10:14そこで従うべき様々な命名規則があります。
00:10:16ドキュメントはそれらをうまく説明していますが、パラレルルートのような複雑な機能もあり、設定が厄介になることがあります。
00:10:25TanStack Startも、
00:10:26前述のようにTanStack Routerを内部で使用したファイルベースのアプローチを採用しており、
00:10:32ここでも従うべきファイル名の規則があり、
00:10:34これらも同様に習得しやすいものです。
00:10:36TanStack Startの利点の一つは、
00:10:39ファイルベースのルーティングで完全な型安全性が得られることで、
00:10:43これはかなり良い点です。
00:10:45つまり、
00:10:46両方ともファイルベースであり、
00:10:48どちらの命名パターンを好むかは好みの問題ですが、
00:10:51TanStack Startにはファイルベースのルーターに付随する100%の型安全性もあり、
00:10:58これは嬉しい機能です。
00:11:00これは次の質問にも答えます。Next.jsは非常に優れたTypeScriptサポートを持っていますが、
00:11:06私の経験ではTanStack Startはさらに優れたTypeScriptサポートを持っています。
00:11:11また、サーバーアクションやサーバー関数、あるいはそれらをどう呼ぶにせよ、データフェッチングに関してもそうです。
00:11:18TypeScriptを使う場合、
00:11:19そして使うべきだと思いますが、
00:11:21TanStack Startは本当に使っていて楽しいフレームワークです。
00:11:24さて、
00:11:24データフェッチングとデータ変更に関しては、
00:11:27前述のように両方ともサーバー上でコードを実行できます。両方ともフルスタックReactアプリケーションですが、
00:11:33異なるアプローチを取っています。
00:11:35Next.jsはReact Server Componentsを使用しており、
00:11:38長い間、
00:11:39React Server Componentsをサポートする唯一のフレームワークでした。
00:11:43つまり、ページコンポーネントはデフォルトでサーバー上でのみレンダリングされます。
00:11:48クライアント上で再レンダリングされることは決してないため、
00:11:51このようなデータフェッチングコード(裏でデータベースにアクセスするもの)をコンポーネントに入れても、
00:11:56クライアント側に漏れ出すことはありません。
00:11:59TanStack Startは異なるアプローチを採用しています。
00:12:01React Server Componentsのサポートも間もなく実装される予定で、
00:12:06この録画時点ではまだリリースされていませんが、
00:12:08ここでお見せしているアプローチ、
00:12:10そして私がすべてのプロジェクトで使用してきたこのアプローチも引き続き存在します。このアプローチでは、
00:12:15ルートコンポーネントはデフォルトでサーバー側とクライアント側の両方でレンダリングされ、
00:12:20サーバー側でプリレンダリングされ、
00:12:22クライアント側で更新されるため、
00:12:23サーバー側のコードをコンポーネント関数に入れることはできません。
00:12:27代わりに、
00:12:27Remixなどでご存知かもしれないローダーパターンを使用しており、
00:12:32ルートにローダーを付与することができます。このローダーはクライアント側とサーバー側の両方で実行されますが、
00:12:38その中でcreate server functionsでデコレートまたはラップされた関数を呼び出すことができます。これはTan Stick Startが提供する機能で、
00:12:49関数をサーバー側でのみ実行されるがクライアント側から呼び出し可能なものとしてマークします。
00:12:54それがサーバー関数というものです。
00:12:56そのような関数があれば、ローダー内やコンポーネント関数本体から安全に呼び出すことができ、コードはサーバー側に留まります。
00:13:05舞台裏ではHTTPリクエストが送信されます。
00:13:07Next.jsは主にRSCに依存していますが、
00:13:10もちろんAPIエンドポイントを設定してuseEffectとFetch APIを使用することもできます。
00:13:15Tan Stick Startはローダーとサーバー関数を使用しますが、
00:13:19ここでもAPIルートを設定してFetch APIやTan Stick queryなどを使用できることは注目に値しますが、
00:13:26主な組み込みアプローチはこのローダーとサーバー関数を組み合わせた方法です。
00:13:31ミューテーションに関しては、
00:13:32Next.jsはサーバーアクションを使用します。これは特別なuseServerディレクティブでデコレートされたアクションです。
00:13:39Next.jsにはuseServer、useClientといったディレクティブがあります。
00:13:44これらを好まない人もいますし、私も正直あまり好きではありません。
00:13:48useServerでデコレートされたファイルがあると、
00:13:51その中のすべての関数がサーバー関数となり、
00:13:53サーバー上でのみ実行されます。
00:13:55クライアント側では実行されませんが、クライアント側から呼び出すことは可能です。
00:13:59たとえば、
00:14:00ここにあるsaveNode関数は、
00:14:02データベースにノードを保存するものですが、
00:14:04useActionStateフックを使用することでクライアント側から呼び出すことができます。
00:14:10Tan Stick Startでは、
00:14:12このcreateServer関数アプローチを引き続き使用します。先ほど述べたように、
00:14:16これらはサーバー上で実行されることが保証された関数であり、
00:14:19データ取得やデータミューテーションに使用できます。なぜなら、
00:14:22コードはサーバー上でのみ実行されるからです。
00:14:24クライアント側でもレンダリングされるコンポーネント関数内では、
00:14:27Tan Stick Startが提供するuseServer関数フックを使用してサーバー関数をラップできます。これにより、
00:14:34クライアント側から呼び出し可能になり、
00:14:36自動リダイレクト処理などの追加機能が得られます。
00:14:39これにより、クライアント側コンポーネントからそのサーバー関数を呼び出せるようになります。
00:14:43Next.jsは公式のReactサーバー関数を使用し、
00:14:47Tan Stick Startは最終的には独自のサーバー関数を使用します。
00:14:51ただし、全体的な考え方はもちろん同じです。
00:14:54では、キャッシングについてはどうでしょうか?
00:14:56それが難しい部分だと述べました。
00:14:58Next.jsではかなりアグレッシブで、潜在的に複雑です。
00:15:04これは間違いなくNext.jsの難しい部分の1つです。
00:15:07Next.jsを学びたい場合は、私のNext.jsコースで他の重要なNext.jsの概念と同様にこれもカバーしています。
00:15:16このコースは、完全な初心者から上級Next.jsユーザーへと成長するための素晴らしいリソースです。
00:15:21しかし、キャッシングは間違いなくNext.jsのより問題のあるトピックの1つです。
00:15:26もちろん、
00:15:27アグレッシブなデフォルト設定により、
00:15:29ユーザーにとって非常に良好なキャッシングを得られる可能性があるという利点があります。
00:15:35しかし、簡単に自分の足を撃つこともできます。
00:15:38Tan Stick Startについては、良好なデフォルト設定と要約できます。
00:15:43Next.jsよりもはるかにアグレッシブではなく、
00:15:46最も重要なのは、
00:15:47少なくとも私の経験では、
00:15:49開発モードと本番モード間で一貫性があることです。
00:15:52ユーザーがルート間を移動する際などにデータが一定期間キャッシュされるため、キャッシング機能も提供されます。
00:16:00これにより、高速なナビゲーション時にサーバーに大量のリクエストを送信することがなくなります。
00:16:04これはもちろんパフォーマンスに大いに役立ちますが、
00:16:07すべてをキャッシュしようとしたり、
00:16:09異なるレイヤーですべてをキャッシュしようとするわけではないため、
00:16:12開発者としての生活がより楽になります。
00:16:14ただし、
00:16:15もちろんこれは、
00:16:16ユーザーにとって最高のパフォーマンスを得たり、
00:16:18トラフィックを節約したりするには、
00:16:20適切なキャッシュヘッダーを自分で設定し、
00:16:23Next.jsで必要とされるよりもアプリケーションのキャッシング方法についてもう少し考える必要があることも意味します。
00:16:30ただ、そこでは他の問題について考える必要があります。
00:16:32さて、安定性についてはどうでしょうか?
00:16:35ここでは、おそらく両方に2つのプラスを付けるでしょう。
00:16:39どちらもかなり安定しています。
00:16:40明らかにNext.jsの方が成熟していますが、
00:16:45私の経験上、
00:16:46ここ数年はかなりバグが多く、
00:16:48特に開発サーバーはクラッシュなどの問題を抱えていました。
00:16:53しかし、
00:16:54大幅に改善され、
00:16:55全体的には安定した体験となっており、
00:16:58もちろん問題なく本番環境で稼働している何百、
00:17:01何千ものアプリケーションが存在します。
00:17:03これは間違いなく重要な点です。
00:17:06確かにReactのセキュリティ脆弱性がありましたが、
00:17:08まず、
00:17:09それらのいくつかは将来発見される可能性があり、
00:17:11特にReactサーバーコンポーネントのサポートを開始すれば、
00:17:1410-stack startにも影響を与える可能性があります。そして第二に、
00:17:18それは主にNext.jsの問題ではありません。
00:17:2110-stack startはまだリリース候補段階であり、私も確実にそれなりの問題に遭遇してきました。
00:17:28奇妙なクラッシュ、
00:17:29奇妙なエラーメッセージ、
00:17:30あちこちで奇妙な動作があったので、
00:17:32そのために1つのプラスだけを付けることもできますが、
00:17:35リリース候補段階であることを考えると、
00:17:38それにしてはかなり安定しているので、
00:17:40ここでは2つにします。
00:17:41ただし、
00:17:4210-stack startを使用する際には確実にいくつかの問題に遭遇する可能性があることを認識しておいてください。
00:17:47とはいえ、
00:17:47私はbuildmygraphic.comのような本番環境で稼働しているアプリケーションを持っており、
00:17:53これはAIの助けを借りて素晴らしいインフォグラフィックを作成できるもので、
00:17:5710-stack startで動いていて問題なく稼働しており、
00:18:00構築も問題ありませんでした。
00:18:02バッテリー同梱についてはどうでしょうか?
00:18:04つまり、最適化された画像レンダリングや国際化対応などを簡単に実現できるかということです。
00:18:12ここでは、Next.jsの方が間違いなく優れた仕事をしています。
00:18:15組み込みの画像コンポーネントがあり、
00:18:18組み込みの国際化サポートがあり、
00:18:2010-stack startにはそのようなものは一切ありません。
00:18:24計画されているかどうかわかりませんし、
00:18:26あなたにとって重要かどうかもわかりませんが、
00:18:29必ず必要なものではなく、
00:18:30他の選択肢もあり、
00:18:32使用できるサードパーティのパッケージもあり、
00:18:34組み込み機能を望んでいないかもしれませんが、
00:18:37もしそれが気になることや心配事であれば、
00:18:39おそらくNext.jsの方がここでは良い選択でしょう。
00:18:43それでは、デプロイメントについてはどうでしょうか?
00:18:45これは難しいトピックです。
00:18:48Next.jsはもちろんVercelによって構築されており、Vercelにデプロイすれば非常に簡単でスムーズです。
00:18:56すべてがそのために最適化されています。
00:18:58歴史的には、
00:18:58例えば自分のサーバーにデプロイするのは少し難しかったのですが、
00:19:03公平に言って、
00:19:04Next.jsチームはそれを簡単にし、
00:19:07より良いドキュメントを書くためにいくらかの作業を本当に行っており、
00:19:12したがって今日では他のサービスにも大きな問題なくデプロイできると言えます。
00:19:17したがって、
00:19:18これは2つまたは3つのプラスで、
00:19:21Vercelを使用する場合は3つ、
00:19:24他のプロバイダーを使用する場合はおそらく2つだと思います。
00:19:2810 stack startについては、現時点では2つにしますが、3つを付けることもできます。
00:19:36私が2つを付ける主な理由は、これを録画している時点では、ホスティングのドキュメントがまだ少しわかりにくいからです。
00:19:45CloudflareやNetlifyのような公式にサポートされているパートナーがあり、
00:19:50かなり良いドキュメントがあり、
00:19:52デプロイはおそらくかなりスムーズですが、
00:19:54私はそれらを使用していません。
00:19:56例えば、
00:19:56BUNで自分のVPSで実行したい場合、
00:19:59いくつかの手順がここにありますが、
00:20:02それらに従うのが少し難しいと感じたり、
00:20:05いくつかの問題に遭遇しましたが、
00:20:07すべて解決可能でしたが、
00:20:09確実にいくらか時間がかかりました。
00:20:12BUNまたはNodeを使用してVPSに10 stack startをデプロイするための良いガイドができれば、
00:20:19特にそのガイドに従うべきベストプラクティスや直面する可能性のある潜在的な落とし穴に関する推奨事項が含まれていれば、
00:20:26デプロイは間違いなく簡単になると思います。
00:20:29しかし前述のように、見方によっては、ここで3つのプラスを付けることも間違いなくできます。
00:20:34述べたように、これはすべて主観的であり、私の経験、私の考えに過ぎず、明らかに私もあなたの考えを聞くことに興味があります。
00:20:42Next.jsやT3 Stackに切り替えたか、
00:20:44切り替えを検討しているか、
00:20:46あるいはそれらを使わずに別の選択肢を使っているかについて、
00:20:49皆さんの意見を聞かせてください。

Key Takeaway

TanStack StartとNext.jsはそれぞれ異なる強みを持ち、Next.jsはエコシステムと成熟度で優れているが、TanStack Startは型安全性、開発者体験、シンプルなキャッシングで優位性があり、プロジェクトの要件と開発者の好みに応じて選択すべきである。

Highlights

TanStack StartはTanStack Routerにサーバー機能を追加したフルスタックReactフレームワークで、Next.jsと比較されることが多い

Next.jsはAI対応度とエコシステムで優位性があるが、TanStack Startは型安全性と開発者体験で優れている

Next.jsはReact Server Componentsを使用し、TanStack Startはローダーパターンとサーバー関数を採用している

Next.jsのキャッシングは非常にアグレッシブで複雑だが、TanStack Startは良好なデフォルト設定でシンプル

Next.jsはVercelへのデプロイが容易で、バッテリー同梱機能(画像最適化、国際化)が充実している

TanStack Startは始めるのは難しいが、一度理解すれば高度な機能への対応がNext.jsより簡単

両フレームワークとも安定しているが、Next.jsの方が成熟度が高く、TanStack Startはまだリリース候補段階

Timeline

イントロダクションとフレームワークの基本概念

TanStack Startが注目を集めており、Next.jsと比較して優れているかという問いから動画が始まる。TanStack StartはTanStack Routerにサーバーサイドレンダリングやサーバーサイド関数などのサーバー機能を追加したフルスタックReactフレームワークであることが説明される。Next.jsとReact Vite with React Routerの比較は間違っており、サーバーサイドロジックが不要ならViteプロジェクトにReact RouterかTanStack Routerを追加すればよいと指摘される。この動画では、実際に両フレームワークで同じメモアプリを構築したライブ配信の内容を基に、複数の視点から比較を行うことが述べられる。RemixやNuxtなど他のフレームワークもあるが、この動画ではNext.jsとTanStack Startに焦点を当てる理由が説明される。

AI対応度とエコシステムの比較

AI対応度の観点から、Next.jsが明らかに優位であることが示される。TanStack Startはまだリリース候補段階で、過去1年間ベータ版とアルファ版だったため、ChatGPTなどのAIが持つ知識は古く誤っている可能性が高い。Next.jsもuse cacheディレクティブなど新機能についてはAIの理解が不十分だが、app routerやReact Server Componentsについては良く理解している。ただし、Context 7のようなMCPを使ってドキュメントにアクセスさせたり、適切なコンテキストを提供することで、この問題は解決可能であると指摘される。エコシステムについても、Next.jsは歴史が長く規模が大きいため、チュートリアル、YouTube動画、コース、パッケージなどのリソースがはるかに豊富である。ダウンロードチャートを見ても、Next.jsの利用者数が圧倒的に多いことが分かる。

学習の容易さの比較

学習の容易さについて、両フレームワークとも2つのプラスが付けられるが、理由は異なる。Next.jsはApp Routerを使った始め方が分かりやすく、page.tsxファイルを作成するだけでページができ、動的セグメントも使える。ドキュメントもコアコンセプトを段階的にガイドしており、初心者には優れている。しかし、キャッシングなどの高度な概念は非常に複雑で混乱を招く可能性がある。一方、TanStack Startは入門ドキュメントがNext.jsほど良くなく、データフェッチングやミューテーションの説明が不足している。また、TanStack Routerのドキュメントも見る必要があり、初めて見ると圧倒される。しかし、最初の障壁を乗り越えれば、すべてが理にかなっており、Next.jsのようなキャッシング関連の隠れた落とし穴もない。つまり、Next.jsは始めやすいが高度な機能が難しく、TanStack Startは始めるのが難しいが高度な機能への対応が簡単である。

開発者体験の比較

開発者体験の観点から、TanStack Startに3つのプラスが付けられ、Next.jsより優れていると評価される。Next.jsにはいくつかの問題があり、特にキャッシングの問題で開発モードと本番モードで異なる動作をすることがあり、常に本番モードでテストする必要があるため開発スピードが遅くなる。また、開発サーバーもwebpackバージョンを使用している場合は遅くなることがある。新しいturbopackバージョンは改善されているが、TanStack StartのViteベースのセットアップには及ばない。TanStack Startは高速で予測可能であり、奇妙な動作もほとんどなく、まだリリース候補段階ではあるが、全体的な開発者体験はNext.jsより優れていると評価される。ただし、これは個人的な見解であり、人によって異なる可能性があることが強調される。

ルーティングとTypeScriptサポートの比較

ルーティングについて、両フレームワークともファイルベースのアプローチを採用している。Next.jsはルートとして機能するファイルを設定し、様々な命名規則に従う必要があり、パラレルルートのような複雑な機能もある。TanStack Startも同様にファイルベースで、TanStack Routerを内部で使用しており、ファイル名の規則がある。TanStack Startの大きな利点は、ファイルベースのルーティングで完全な型安全性が得られることである。どちらの命名パターンを好むかは好みの問題だが、TanStack Startの100%の型安全性は嬉しい機能である。TypeScriptサポートに関しても、Next.jsは非常に優れているが、TanStack Startはさらに優れており、サーバーアクション、サーバー関数、データフェッチングなどすべてにおいて、TypeScriptを使う場合は本当に使っていて楽しいフレームワークであると評価される。

データフェッチングとミューテーションの仕組み

データフェッチングとデータ変更について、両フレームワークとも異なるアプローチを取っている。Next.jsはReact Server Componentsを使用し、ページコンポーネントはデフォルトでサーバー上でのみレンダリングされるため、データベースアクセスコードをコンポーネントに直接入れてもクライアント側に漏れない。TanStack Startは異なるアプローチで、ルートコンポーネントはサーバー側とクライアント側の両方でレンダリングされるため、ローダーパターンを使用する。ローダー内でcreate server functionsでラップされた関数を呼び出すことで、サーバー側でのみ実行されるがクライアント側から呼び出し可能な関数を作成できる。ミューテーションに関して、Next.jsはuseServerディレクティブでデコレートされたサーバーアクションを使用し、TanStack Startはcreate server functionsとuseServer関数フックを組み合わせて使用する。全体的な考え方は同じだが、実装の詳細が異なる。

キャッシングの比較

キャッシングについて、Next.jsは非常にアグレッシブで潜在的に複雑であり、Next.jsの難しい部分の一つであることが指摘される。アグレッシブなデフォルト設定により良好なキャッシングを得られる可能性があるという利点はあるが、簡単に問題を引き起こすこともある。TanStack Startは良好なデフォルト設定と要約でき、Next.jsほどアグレッシブではなく、最も重要なのは開発モードと本番モード間で一貫性があることである。ユーザーがルート間を移動する際にデータが一定期間キャッシュされるため、高速なナビゲーション時にサーバーに大量のリクエストを送信することがなく、パフォーマンスに役立つ。ただし、これは開発者が適切なキャッシュヘッダーを自分で設定し、Next.jsで必要とされるよりもキャッシング方法について考える必要があることも意味する。全体として、TanStack Startの方が開発者にとって扱いやすいキャッシングシステムであると評価される。

安定性の比較

安定性について、両フレームワークとも2つのプラスが付けられる。Next.jsは明らかに成熟度が高いが、ここ数年はかなりバグが多く、特に開発サーバーがクラッシュなどの問題を抱えていた。しかし大幅に改善され、全体的には安定した体験となっており、問題なく本番環境で稼働している何千ものアプリケーションが存在する。Reactのセキュリティ脆弱性はあったが、それは主にNext.jsの問題ではなく、将来的にReact Server ComponentsをサポートすればTanStack Startにも影響する可能性がある。TanStack Startはまだリリース候補段階で、奇妙なクラッシュやエラーメッセージ、奇妙な動作などの問題が確実にある。リリース候補段階であることを考えるとかなり安定しているため2つのプラスが付けられるが、使用する際には問題に遭遇する可能性があることを認識しておく必要がある。実際にbuildmygraphic.comという本番環境のアプリケーションがTanStack Startで問題なく稼働している例が紹介される。

バッテリー同梱機能とデプロイメントの比較

バッテリー同梱機能について、Next.jsの方が間違いなく優れている。Next.jsには組み込みの画像コンポーネントや国際化サポートがあるが、TanStack Startにはそのようなものが一切ない。必ず必要なものではなく、サードパーティのパッケージを使用することもできるが、組み込み機能が重要であればNext.jsの方が良い選択である。デプロイメントについて、Next.jsはVercelによって構築されており、Vercelへのデプロイは非常に簡単でスムーズで、すべてが最適化されている。歴史的には自分のサーバーへのデプロイは難しかったが、Next.jsチームはそれを改善し、今日では他のサービスにも大きな問題なくデプロイできる。Vercel使用時は3つのプラス、他のプロバイダー使用時は2つのプラスが付けられる。TanStack Startは2つまたは3つのプラスで、CloudflareやNetlifyのような公式サポートパートナーへのデプロイはスムーズだが、BUNで自分のVPSにデプロイする場合はドキュメントがまだわかりにくく、いくつかの問題に遭遇する可能性がある。

まとめと視聴者への質問

動画の最後に、すべての評価が主観的であり、話者の経験と考えに基づくものであることが強調される。視聴者に対して、Next.jsやTanStack Start(T3 Stackと言い間違えている)に切り替えたか、切り替えを検討しているか、あるいはそれらを使わずに別の選択肢を使っているかについて、コメント欄で意見を共有するよう呼びかけられる。この動画は両フレームワークの包括的な比較を提供し、それぞれの強みと弱みを明確にすることで、視聴者が自分のプロジェクトに適したフレームワークを選択する際の参考になることを目的としている。

Community Posts

View all posts