Node.jsフレームワークを比較して見えたそれぞれの特徴

フレームワークに求められる機能

  • 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へ対応していない為、手を加える必要がある。
  • 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よりモダンに開発を始められる。
  • Fastify | https://www.fastify.io/

これらの中から、必要な機能をデフォルトまたはプラグインで実現出来て、かつ最もパフォーマンスの出るものを探しました。

必要な機能や対応の状況

最初に、今回のプロジェクトで必要な機能を各フレームワークが備えているかをチェックしました。
今回はクライアント側にAPIを提供することだけが目的で、Web向けのサーバーサイドレンダリング等は不要だった為、必要な機能リストからは外しています。

TypeScript対応

TypeScriptはMicrosoftが開発したJavaScriptのメタ言語で、型情報等が追加されます。
また、JavaScriptへの変換時(トランスパイル時)にエラーとして異常を弾いてくれる等、コードの安全性を向上させることが出来る為、TypeScript対応はフレームワークに求めたい要件の一つです。

ルーター機能

多くのAPIを作成することが予想されたので、簡単に管理出来る機能は必要です。

非同期処理対応

DBへの接続等で待機が発生する状況で、コールバック関数をいくつもネストしたり、別に定義したりすると、コードがとても追いにくくなったり、混乱の元になります。
その為、async/awaitのように視覚的にフローが分かりやすくなる機能は必要です。

バリデーション機能

受け取ったデータの型や値のチェックを簡単にして、TypeScriptの型情報と合わせてデータの不整合を防ぐ為に必要です。

テスト機能

APIの動作チェックをサーバーサイドのみで完結する為に必要です。

パフォーマンスの比較

ベンチマーク比較の結果をネット上から探してみました。
情報の通り、Fastifyが最もパフォーマンスが高いようですが、起動速度は遅いようです。
頻繁に再起動するようであれば、気にした方が良いかもしれません。

各カラムの情報引用元

他の参考情報

情報量の違い

参照出来る情報は多いに越したことはありません。
各公式サイトの日本語への対応状況とGoogle検索でのヒット数を調べてみました。

公式サイトの日本語化

express.jsはシェアトップということもあり、日本語化されていました。
他の2つは日本語サイトが見つかりませんでした。
頑張って英語を読むか、翻訳のお世話になりましょう。

Google検索

各フレームワーク名で検索してみました。
express.jsは日本語のみでも多くの情報があり、分からないことは大体調べれば出てきそうです。
対して、Fastifyは日本語での情報はとても少ないです。英語の先生が必要になりそうです。

※2019-07-22時点

まとめ

多くの人が参加したり、日本語の情報が多く必要な場合はexpress.jsやKoa.js
非同期処理が多く、コールバック関数のネスト等でコードの可読性を落としたくない場合はKoa.jsやFastify
とにかく速度が必要という場合はFastifyといった印象です。

いかがでしたか?

筆者は普通のエンジニアの一人ですが、自身の希望によりプロジェクトへの参加が決まり、今回のフレームワーク選定を任せられ、TypeScriptを使いたい等の希望が通りました。
弊社には個々人の希望をしっかりと見てくれて、キャリアパスをサポートしてくれる先輩方、経験の無い分野でも助け合える仲間達がいます。

本当に未来を見据えてチャレンジし続けられる弊社で、私達と一緒に働きませんか。

MYTHRIL Inc.'s job postings
Node.jsフレームワークを比較して見えたそれぞれの特徴
小西 壮和
MYTHRIL Inc. / エンジニア
4 Likes
4 Likes

Weekly ranking

Show other rankings
If this story triggered your interest, go ahead and visit them to learn more