1
/
5

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を使いたい等の希望が通りました。
弊社には個々人の希望をしっかりと見てくれて、キャリアパスをサポートしてくれる先輩方、経験の無い分野でも助け合える仲間達がいます。

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

Invitation from MYTHRIL Inc.(ミスリル株式会社)
If this story triggered your interest, have a chat with the team?
MYTHRIL Inc.(ミスリル株式会社)'s job postings
16 Likes
16 Likes

Weekly ranking

Show other rankings
Like 小西 壮和's Story
Let 小西 壮和's company know you're interested in their content