フレームワークに求められる機能
- TypeScript対応
- ルーター機能
- 非同期処理対応
- バリデーション機能
- テスト機能
TypeScriptや非同期処理対応等のモダンな開発には必須の機能を始めとした、上記の機能群がフレームワークに必要と考えています。
どのフレームワークを利用するのか?
現在、GitHub上で [node framework] と検索して約7,600のリポジトリがヒットする程、数多くのNode.jsフレームワークが存在しています。
その中から、全てを詳細に比較して決めるのはとても骨が折れるので、シェアもしくはパフォーマンスの高いものから、3つを選んで比較しました。
- express.js | https://expressjs.com/
- Node.jsフレームワークの中で最もシェアが高い
参考: https://x-team.com/blog/most-popular-node-frameworks/ - 日本語での情報が多く、利用者も多いが、速度が遅く、パフォーマンスを求める開発には不向き。
また、jsの非同期処理機能のジェネレータ関数や、async/awaitへ対応していない為、手を加える必要がある。
- Node.jsフレームワークの中で最もシェアが高い
- Koa.js | https://koajs.com/
- express.jsの作者が開発する、実質的なexpress.jsの後継フレームワークにあたる
参考: https://mseeeen.msen.jp/koa-js-v2-beginning/ - express.jsよりは速度は早く、Fastifyよりはシェアが高い。2つの中間に位置するフレームワーク。
v1でジェネレータ関数、v2でasync/awaitに対応しており、express.jsよりモダンに開発を始められる。
- express.jsの作者が開発する、実質的なexpress.jsの後継フレームワークにあたる
- Fastify | https://www.fastify.io/
- Node.jsフレームワークの中で最もパフォーマンスが高い
参考: https://github.com/fastify/benchmarks#benchmarks, https://www.jishuwen.com/d/2Bal/zh-hk| - シェアは低く、情報も少ないが、最もパフォーマンスが高く、async/awaitにも対応している。
JSON Schemaによるバリデーション機能もあり、パフォーマンスを謳う割に細やかな機能が豊富。
- Node.jsフレームワークの中で最もパフォーマンスが高い
これらの中から、必要な機能をデフォルトまたはプラグインで実現出来て、かつ最もパフォーマンスの出るものを探しました。
必要な機能や対応の状況
最初に、今回のプロジェクトで必要な機能を各フレームワークが備えているかをチェックしました。
今回はクライアント側にAPIを提供することだけが目的で、Web向けのサーバーサイドレンダリング等は不要だった為、必要な機能リストからは外しています。
TypeScript対応
TypeScriptはMicrosoftが開発したJavaScriptのメタ言語で、型情報等が追加されます。
また、JavaScriptへの変換時(トランスパイル時)にエラーとして異常を弾いてくれる等、コードの安全性を向上させることが出来る為、TypeScript対応はフレームワークに求めたい要件の一つです。
- express.js | ○
参考: https://qiita.com/yuukive/items/012bdf1b9ff3881546b3 - Koa.js | △ プラグインによる対応
参考: https://github.com/tkoajs/tkoa
: https://github.com/javieraviles/node-typescript-koa-rest - Fastify | ○
参考: https://qiita.com/biga816/items/92d8537a34ebe0f70152
: https://github.com/fastify/fastify/blob/master/docs/TypeScript.md
ルーター機能
多くのAPIを作成することが予想されたので、簡単に管理出来る機能は必要です。
- express.js | ○
参考: https://expressjs.com/ja/guide/routing.html - Koa.js | △ プラグインによる対応
参考: https://mseeeen.msen.jp/koa-v2-router/
: https://github.com/ZijianHe/koa-router - Fastify | ○
参考: https://github.com/fastify/fastify/blob/master/docs/Routes.md
非同期処理対応
DBへの接続等で待機が発生する状況で、コールバック関数をいくつもネストしたり、別に定義したりすると、コードがとても追いにくくなったり、混乱の元になります。
その為、async/awaitのように視覚的にフローが分かりやすくなる機能は必要です。
- express.js | ×
対応資料: https://qiita.com/yukin01/items/1a36606439123525dc6d - Koa.js | ○ v1まではジェネレータ関数のみ、v2からasync/await対応
参考: https://mseeeen.msen.jp/koa-js-v2-beginning/
: https://mobiarch.wordpress.com/2017/07/18/asyncawait-with-koa/ - Fastify | ○ async/await対応
参考: https://github.com/fastify/fastify/blob/master/docs/Routes.md#async-await
バリデーション機能
受け取ったデータの型や値のチェックを簡単にして、TypeScriptの型情報と合わせてデータの不整合を防ぐ為に必要です。
- express.js | △ プラグインによる対応
参考: https://express-validator.github.io/docs/ - Koa.js | △ プラグインによる対応
参考: https://github.com/berman-solutions/koa-router-joi-validator
: https://github.com/RocksonZeta/koa-validate - Fastify | ○ JSON Schemaによるバリデーション
参考: https://github.com/fastify/fastify/blob/master/docs/Validation-and-Serialization.md
テスト機能
APIの動作チェックをサーバーサイドのみで完結する為に必要です。
- express.js | ×
対応資料: https://pepese.github.io/blog/express-test/ - Koa.js | △ プラグインによる対応
参考: https://www.npmjs.com/package/koa-test - Fastify | △ プラグインによる対応
参考: https://www.fastify.io/docs/latest/Testing/
パフォーマンスの比較
ベンチマーク比較の結果をネット上から探してみました。
情報の通り、Fastifyが最もパフォーマンスが高いようですが、起動速度は遅いようです。
頻繁に再起動するようであれば、気にした方が良いかもしれません。
各カラムの情報引用元
- Requests/s, Latency, Throughput/Mb
https://github.com/fastify/benchmarks#benchmarks - Requests/s(other data)
https://www.jishuwen.com/d/2Bal/zh-hk - AvgStartTime
https://github.com/nahtnam/fastify-benchmarks
他の参考情報
- Fast and low overhead web framework fastify benchmarks.
https://github.com/foxifyjs/fastify-benchmarks - Express vs Fastify performance
https://medium.com/@onufrienkos/express-vs-fastify-performance-4dd5d73e08e2
情報量の違い
参照出来る情報は多いに越したことはありません。
各公式サイトの日本語への対応状況とGoogle検索でのヒット数を調べてみました。
公式サイトの日本語化
express.jsはシェアトップということもあり、日本語化されていました。
他の2つは日本語サイトが見つかりませんでした。
頑張って英語を読むか、翻訳のお世話になりましょう。
- express.js | ○
https://expressjs.com/ja/ - Koa.js | ×
- Fastify | ×
Google検索
各フレームワーク名で検索してみました。
express.jsは日本語のみでも多くの情報があり、分からないことは大体調べれば出てきそうです。
対して、Fastifyは日本語での情報はとても少ないです。英語の先生が必要になりそうです。
※2019-07-22時点
まとめ
多くの人が参加したり、日本語の情報が多く必要な場合はexpress.jsやKoa.js
非同期処理が多く、コールバック関数のネスト等でコードの可読性を落としたくない場合はKoa.jsやFastify
とにかく速度が必要という場合はFastifyといった印象です。
いかがでしたか?
筆者は普通のエンジニアの一人ですが、自身の希望によりプロジェクトへの参加が決まり、今回のフレームワーク選定を任せられ、TypeScriptを使いたい等の希望が通りました。
弊社には個々人の希望をしっかりと見てくれて、キャリアパスをサポートしてくれる先輩方、経験の無い分野でも助け合える仲間達がいます。
本当に未来を見据えてチャレンジし続けられる弊社で、私達と一緒に働きませんか。