◆ Koa 本体は好きだけど ミドルウェアのクオリティがついてきてない
◆ ユーザの多い Express のミドルウェアの方が優れてるかも
◆ 他のフレームワークを探してみた
  ◆ → 複雑すぎるものが多めで結局選択肢は昔ながらのものたち

Koa に疲れた

ここ最近は Node.js のフレームワークに Koa を使ってきました

Koa は Express 系のミドルウェアを使うタイプのフレームワークです
Express のメンバーが作ったもので 基本的な部分は似ています
ジェネレータや非同期関数などの JavaScript の新機能に対応したもので Express のメジャーアップデートというか後継のようなものです
ただし それ以外にも大きな違いもありミドルウェアの互換性はないです
そういうこともあってか Express の新バージョンではなく別のライブラリになってます

Koa は名前の通り Core 部分しか本体にはなくて Express では同梱していた機能も外部のミドルウェア化しています
ルーターや静的ファイルのサーブもミドルウェアをインストールして使います

本体部分だけで言えば優れた作りになっていると思いますし シンプルなのに拡張性が高くすごく好きです
しかし 本体はあくまでベースの部分だけです
何かをするにはミドルウェアが必要となるので 実質的にはミドルウェア次第です
Express が未だに人気上位なのも 本体自身がすることは少なく更新が必要になるような処理はミドルウェア側によるものだからでしょう

ミドルウェアのクオリティ

それで肝心のミドルウェアなのですが クオリティが低いです
Koa コミュニティ公式のものも です

中身を見てみたら驚くほどの低クオリティなものもあります
変更したい部分がハードコーディングされていたりで拡張性が低いものが多いです
オプションは用意されていてもあまり使われていなさそうな機能は正しく動かないこともあり ソースコードを確認したら明らかなバグだったということもあります
それが修正されればいいですが PR があるのに放置されていたりします

中には明らかにムダな処理をしてるものもあり せっかく本体はパフォーマンスを考慮してるのにミドルウェアレイヤーではムダが多いです
後からその場限りの付け足しで機能追加の修正を繰り返したような状態で 管理してる人がリファクタリングをしたりはしていないようです
他のミドルウェアで処理できるからと言って 必要ないのにムダな処理をして 後から別のミドルウェアでレスポンスを上書きするような作りになっているものもあります

企業がやってるわけではなくコミュニティベースなので仕方ない部分はありますが 積極的な更新が行われず放置気味のミドルウェアが多いです
上にも書きましたが良い PR があるのに放置されているのを何度も見ました
その割には更新があったときに新機能でも増えたのかとマージされたコミットを見ると 最適化と書いてるのに意味ないどころかパフォーマンスが落ちるような変更があったこともあります
最近の v8 はこれで逆に速くなるの?と思って変更された部分の処理だけを比較してみたらやっぱり数倍遅くなってました
こういう有名 OSS 関係は JavaScript や Node.js の内部的なところまで精通している人たちが作ってそうな印象ですが 実際には全然そういうことはなさそうです

そんなクオリティなので 動きが読めなくてソースコードを見ることは多いのですが そのたびに大幅に書き直したくなるほどです
バンドルしてるわけでもなくソースコード自体が index.js の 1 ファイルだけで済む程度なのものが多いので いっそ一から自作してしまえばいいかと思ったことは何度かありますが やっぱり面倒です
極端に遅くなるわけでもないなら見なかったことにして 既存のコードでバグってる部分を直して 必要なオプションを追加すればいいかなと思いました
それでも npm ライブラリを書き換えるのは後々が面倒になります
そのプロジェクトだけだとしても 後からライブラリのバージョンが上がったときに必要な変更ならマージが必要です
まぁ今回対象としてるようなパッケージはロクな変更なさそうなので 気にしなくていいかもですけど
また npm からダウンロードできなくなるので 他のプロジェクトで使いたいなどで扱いづらくなります
フォークしたのを publish することもできますし npm ではそういうパッケージもよく見ますが あまりやりたいとは思えないです

PR 送るという選択も取れますが 放置されてる Issue や PR があるあたりやるだけムダでしょう
私が見つけたバグやあってほしい機能は やっぱり他にもそう思っている人はいるようですでに Issue や PR にあることも結構ありました
ただ 放置されていたり よくわからない理由をつけてクローズされていたりです
活発なプロジェクトならそこから議論していたりもするのですが そういうこともなく PR 出した人もそのまま放置してるくらいで 言うだけムダと感じ取ったのかなぁと思ったり

コミュニティの公式なものなのでしっかりしているはずだという考えでしたが Koa の本体が Github で 3 万スターあるのに対して それらは 2 桁だったりよくて数百程度です
できたばかりのリポジトリというわけでもないですし 公式コミュニティのグループに属していて 特にマイナー用途な機能というわけでもないのに このスターの少なさは中身を見るまでもなくクオリティが高くないのは明らかでした

しかし Koa のミドルウェアでは何千もスターがあるようなリポジトリはほぼ見ないです
それぞれのミドルウェアのやっていることが大したものではないので ある程度のスキルがある人なら自分で作ってしまうから使わないのでしょうか?
本体部分は Express よりも Koa のほうが優れていると思うのですが ミドルウェア周りではユーザの多い Express の方が優れてるんじゃないかと思えてきました
Express のミドルウェアはあまり詳しくないですが 内部で Express を使っているフレームワークやプロダクトは多いですし それらが内部で使うために Express 用の優れたミドルウェアを作っている事も十分ありえそうです

気に入ったミドルウェアがないなら全部自作してしまうという人でもないと Koa は向いていないのかもしれません

フレームワーク探してみる

もう 2020 年も終盤に入ってきてますし 新しいフレームワークでもないか探してみました

……が 特に新しそうなものは見当たりませんでした
JavaScript とは言え フロントエンドと違って次から次へと色々出てはいなさそうです
未だに一位に Express を上げているところも多いです

ベスト 20 みたいのを見ると下位には聞かないマイナーどころがあります
しかし Koa や Express などと比べて実用性がありそうなものは見当たりませんでした

Web サーバだと 最近なら大きなところはクラウドに任せてそうです
サーバレスとかできますし Node.js に限らず需要がそこまでないのかもですね
またフロントエンドを SPA にしてるなら 静的ファイルのサーバと API サーバがあれば良いので CDN と API サーバで分けれます
何でもできる系のフレームワークよりも用途特化のサーバを個別に作ったりしているのかもしれません

Node.js フレームワーク

ほとんど代わり映えのしないものでしたが 一応探したので簡単にまとめておきます

Express

  • Node.js の初期の頃からあるやつ
  • ルーティングのなどの基本的な処理はある
  • ミドルウェアだよりなので今でもよく使われてる
  • 他の高機能フレームワークが内部で使ってるケースもある

Koa

  • 上に書いたとおりの Express の後継みたいなもの
  • 本体はシンプルで拡張性が高くて Express より良くなってると思う
  • 似てるけど互換性がないからか 未だに Express を使う人のほうが多い
  • そのせいかミドルウェアがイマイチ

Hapi

  • ミドルウェアじゃなくて設定ファイル風
  • デフォルトで高機能な上に追加の公式パッケージが用意されてる
  • 企業がやってるので更新が速い

パフォーマンスの比較でよく遅いと言われてますが Express や Koa はデフォルトだとほぼ何もしないからであって Hapi はデフォルトで色々用意されています
Koa にパフォーマンスを考慮してないミドルウェアをあれこれ詰め込むともっと遅くなりそうな気がします
Koa にあれこれミドルウェアを入れるなら Hapi でいいような気もしています

Fastify

  • 速度追求
  • 特別使いやすさ的には特に優れてるわけでもない
  • デフォルトでもある程度の機能が揃ってる

速度追求というと 余計な機能入れてなさそうですが よく使われる基本的な機能が入ってたのは意外でした
Koa を見ていると 本体は高速でもサードパーティのミドルウェアのせいで遅くなるということは十分ありそうですし 基本的な機能は本体に含めてしまうほうが実際のユースケースでの速度が優れてそうで そのほうがいいのかもしれません

以前少し使った分には Koa に比べて特に使いやすくはなかったのですが ちょっと触れたくらいなのでまだ判断は難しいです
速度のために多くの利便性が犠牲になっているのなら 速度をそこまで重視しないときには使おうとは思いませんが 慣れれば問題ないくらいなら 普段使いもありかもしれません

Restify

  • RESTful

あまり聞かないものですが npm や NETFLIX などで使われていてプロダクションとして使えるクオリティらしいです
名前の通り RESTful なウェブサービスを作るのに良いらしいです
ラッパー系かなと思いましたが 内部で別のフレームワークは使っていなくて 直接 http モジュールで処理しています
RESTful にこだわりはなく その言葉の意味をそこまで意味を理解してる自信もないくらいですが それが必要なときには良いのかもです

Sails

  • Rails 風に書けるらしい
  • Express と Socket.IO を内部で使ってる

そこそこしっかりしてそうだけど Rails は詳しくないし 考え方が好きでもないので候補には入ってません

Meteor

規模が大きくて詳細には把握してないですが サーバとクライアントの両方をあわせて作る感じだったはずです
クライアント側は昔は専用の Blaze だけだったと思いますが今では React や Vue や Svelte など色々あるようです
中で何してるかよくわからないのはあまり好きではないのと サーバとクライアントは独立した別のアプリケーションで API での通信のフォーマットだけを共有するくらいでいいと思うので あまりこれを使おうとは思ってません

Nest

名前は聞くのですが イマイチ何が良いかを把握してません
サーバ部分は Express か Fastify でその他多くの機能を組み合わせられるようです
オフィシャルサイトはしっかりしていて エンタープライズ向きもあるようですけど 実際に Nest 自体が何をしてくれるのかは軽く見た感じだとわかりませんでした
TypeScript をサポートしてるらしいので 組み合わせるライブラリに TypeScript を使ってないものがあってもうまく動くようにしてたりするのかもしれません

なんにせよ 複雑なものは求めてなくて ソースコードを見てすぐ把握できる程度のシンプルさかつ最低限の機能は揃ってる程度でいいので使わなさそうです
Koa でミドルウェアに実用性がある程度のクオリティならそれで十分なくらいですから

WebSocket 系

WebSocket の Socket.IO なども Node.js の WebFramework として紹介されていました
間違いではないですが 求めてるものではないのでスキップします

その他

  • Adonis
  • Derby
  • Feathers
  • LoopBack
  • Total

今回見かけたものはこれくらいでした

そういえば Node.js の framework をまとめたサイトをどこかで見たなと思ってみつけてきました

http://nodeframework.com/

スターが 1 桁のも含んでますし たぶんもう更新されていないようなリポジトリも含まれていますが量は多いです

まとめ

探してみましたが 求めてるのはなさそうでした
新しめなものはあっても なにかに特化してるものか 高機能がウリで複雑すぎるものだったりです

中で何が起きているのかを理解できて 思い通り動かないときにソースを見てどうにかできるくらいのがいいです
そうなるとやっぱり

  • Express
  • Koa
  • Hapi
  • Fastify

くらいが選択肢なのでしょうか