Next.js(+tRPC)を触ってみて

ここしばらくブログの更新をサボっていた。(ちょっとだけ短いのを載せたけれども) 代わりに?といっては変だが、自由時間にNext.js(+ tRPC)で個人開発をしていた。

お断り

これを書いている僕は、現在一応エンジニアとしての責務もあるんだけどかなり比率としては下がっているし、これから言うのもただの感想である。

ドキュメントの1ページ目レベルの公式情報は見ているが、なぜその機能が追加されたのか?Issueまで追って裏取りするようなことは全くしてない、繰り返しになるがただの感想なのだ。

作っているもの

Railsがまだ5.xだった頃に作ったVailsというやつと

github.com

Next.js v11の頃に、Next.jsを単にReact.jsでSPAを作るためだけに使って作ったmangashurakuというやつ

github.com

この二つの持つ機能をマージしたようなアプリを作っている。

github.com

今回のテーマ

今回のテーマとして、RESTful APIじゃないAPIを作るフレームワークを使ってみたいというのがあった。

代表格がGraphQLだが、GraphQLは説明を読むだけではあまりメリットが感じられなかった。 GraphQLでN+1問題など起きないように最適化されカラムのアクセス制限もかかった上で直接クエリできるDBがあれば話は別だろうけれども、現状では「セキュリティもパフォーマンスもガバガバだけど柔軟なクエリができる」or「セキュリティ対策やパフォーマンスチューニングのため決まったスキーマでしかクエリできなくてGraphQLの意味があんまりない」のどちらかにならざるを得なそうで。

一方で、最近よく目にする「T3 Stack」に含まれるtRPCは、汎用性としては高くないかもと思いつつTypescriptを全面的に使っている環境を前提にすればかなり妥当なことをやっているように感じた。 というわけで、Typescript + Next.js + tRPC + Prismaという構成で作ってみることにした。

create.t3.gg

感じたこと

Next.jsとその周辺技術が次世代のRailsになるのか?なんていう議論をたまに見かけることがあるが、全然向いている方向が違うな?と言うことが感じられた。

Railsは、Rails guideに

Rails is opinionated software.

Railsは最近の進化でもActiveStorageやらActionTextやら、それまでこれらライブラリが解決してきた課題に対処してきたエンジニアだったらいらないよと言うような(個人の感想です)機能をつけてくる。 迷走している感もあるが、Webpackerやらなんやら、フロントエンド開発のツール類も自分たちが面倒を見て開発者から隠蔽しようとしてくる。 僕が仕事でRailsを使うようになったのはRails4の頃からであるが、ActiveStorageが追加されました?でもCDN通すようなこともできないし中途半端じゃない?ActionTextが追加されました?HTMLフラグメントでの方が汎用性高くない?Webpackerが追加されました?進化が早いフロントエンドのツール類に追従してくれるかわからないのに手を出しにくくない?と当時は思っていた。

実は先ほどの引用には続きがあって

Rails is opinionated software. It makes the assumption that there is a "best" way to do things, and it's designed to encourage that way - and in some cases to discourage alternatives.

とある。

これ自体は疑わしい、、例えばWebアプリでよくある画像アップロード機能。 これにActiveStorageを使うことがBestとは正直言い難いように思う。S3をバックエンドに使ったとして、Cloudfrontを通して配信することが出来ないし、インフラ視点からはとてもBestではない。

ただ一つ言えるのは、それで動くものはできるということ。 (最低限AWSのアカウントを作ってS3のバケットを作って、、、みたいな部分はあるけれども。)

なぜ追加されなかったのかよくわからなかった機能たちも、Webアプリ開発に必要だがRailsガイドに載っていない知識が最小になるようにというポリシーのもとで作られたのじゃないか?と推察すると納得がいく。

プロのエンジニアじゃなくても実際に動くMVP作れます、MVPが検証できたら0から作り直さなくても改善していけます、というベンチャースピリットのあるフレームワークという感じがある。 Railsの最初のリリースは2004年、Facebookの創業年と同じだそうだ。

一方のT3 Stackでは、画像アップロード機能を作ろうと思ったらT3 Stackの中では割とどうすることもできず、S3の署名つきアップロードURLを発行して・・・みたいな話になる。(tRPCもFormDataを扱えるようになるらしいが。)

T3 StackのWebサイトからNext.jsの説明文を引用するとこんなことが書いている。

Next.js offers a lightly opinionated, heavily optimized approach to creating applications using React.

T3 Stackは、T3 Stackを覚えればWebアプリが作れますと言ったものではなく、T3 Stackが対象とする範囲でのベストプラクティスを揃えてます。型とは何か最低限知っていることを前提にしてます、インフラ関連は自分で適切に設定してください、と基本的には「プロのエンジニア」のためのツールという感じがある。

時代の変化と求められるフレームワークの変化

iPhoneのアプリストアを考えても、昔はアイディア一発勝負でヒットが狙える時代だったが今では高品質なアプリケーションがごろごろしていて、アイディア一発で勝負が狙える時代ではなくなってきた。 産業の成熟とともに、最低限求められるレベルがあらゆる面で上がってきている。

RailsではなくNext.jsやT3 Stackがもてはやされるのは、そういった時代の変化の一つの表れなのかもと思った次第。