ウェブ開発でNode.jsを採用するメリット・デメリット

f:id:k-kty:20190111210413p:plain

ウェブ開発においてある程度の地位を築いた感のあるNode.jsですが、自分も2年ほど使っています。 この記事では、Node.jsの良い点・悪い点をまとめてみます。

メリット

フロントエンドと同じ言語(JavaScript)でバックエンドを書くことができる

これは素晴らしいことだと思います。「一人がフロントエンドとバックエンドの両方に関わる」ということが容易になり、バックエンド開発者とフロントエンド開発者の間で共有できる知見の幅も広がります。

プロトタイピングに向いている

JavaScriptがダイナミックな言語だということや、フレームワークが充実していることにより、高速なプロトタイプ開発が可能です。

AltJSを用いてJavaScriptに足りない点を補完できる

ある程度大規模なものを作るとなると、JavaScriptにはない機能(型など)が欲しくなってきます。 そういう場合にはAltJSを用いることで解決することができます。 特にTypeScriptは開発も進んでおり、エコシステムとしても成熟が進んでいるのでよく用いられています。

シンプルな設計思想

豊富なパッケージ

NPMにはかなり多くのパッケージが公開されています。ここをみると、他の言語・レジストリよりも多くのパッケージが公開されていることがわかります(量だけではなく質も大切ですがそれを定量化するのは難しいので...)。

効率的なIO処理

シングルスレッド上でのイベントループにより、少ないオーバーヘッドで効率的にIOを並列に処理できます。大量のスレッドでメモリが逼迫されるということもなく、よくスケールします。

デメリット

計算量の多いタスクに向いていない

計算に時間のかかるタスクを実行するとき、(workerを使って別スレッドで実行するなどしない限り)イベントループをブロックします。イベントループをブロックしている間は他の処理が基本的にストップしてしまいます。

イベンドリブンなコードには慣れを要する

Node.jsでは、コールバックを利用するなどしてイベントドリブンなコードを書くことになります。1スレッド/1リクエストのモデルではシンプルに書けることも、少し複雑になってしまいます。これには慣れを要します。

コールバック地獄

Node.jsのコードでは、複数のコールバックがネストされてコードが意味不明になってしまう「コールバック地獄」を生み出してしまいやすいです。現在はPromiseや async-awaitなどの普及によって改善されつつあります。

まとめ

パフォーマンスのボトルネックが、計算よりもIOになりそうな場合(ウェブアプリケーションの多くはそうだと思います)においてはNode.jsは採用する価値があると思います。実際、Paypal, Netflix, LinkedInなども利用しているようです。