公式サイト
Node.jsはGoogleが開発したJavaScript処理エンジンV8上で動作するJavaScript実装です。Node.jsは非同期で動作するノンブロッキングIOのイベント駆動モデルを採用し、軽量・高速に動作することが特徴です。
2009年に、ライアン・ダール(Ryan Dahl)によって開発が始まり、アメリカのクラウドコンピューティング会社である Joyent社 によってプロジェクトが支援されています。
Node.jsの開発者 ライアン・ダール(Ryan Dahl) 氏
今回はNode.jsの概要とその使い方について、主に初心者向けの解説記事を書きたいと思います。
Node.jsの特徴は?メリットは?
- サーバーサイドで動作するJavaScript
- C++実装
- ノンブロッキングIO
- イベント駆動モデル
- 単独でWebサーバーとして動作する
- 細かい処理を大量に実行することに向いている
- サーバーサイドとクライアントサイドでコードを共通化
- 学習コストが低い
- npmという膨大なライブラリを収めたアーカイブの存在
- MongoDBとの相性がよい(MEAN スタック)
サーバーサイドで動作するJavaScript
Node.jsはサーバーサイドで動作するJavaScriptです。JavaScriptについて知っているひとはこう思うはずです。
「JavaScript」ってブラウザでいろいろ動かしたりするために書くアレでしょ〜それがサーバーで動く の?
心配ご無用です。Node.jsは国内・海外の有名なテック企業に次々と採用され、その実績と安定性が認められている言語です。そして今非常に注目を集めている言語でもあります。
ノンブロッキングI/O
Node.jsは性能の低いサーバーでも大量の処理を実行できるようにするためにノンブロッキングI/Oという仕組みを採用しています。これはMongoDBやMySQLのようなデータベースと情報を読み込んだり(Read)、書き込んだり(Write)するときに生じる待ち時間(ブロック)によって生じるパフォーマンスの低下の対策として、考案されたものです。非同期処理によってプログラムを順番どおりに実行せずに、できる処理から行うことで、非常に高速に動作するサーバーを実装できるのです。
C10K問題
これに関連した話題としてC10K問題があります。
イベント駆動モデル
Node.jsは何も処理をしない場合でもメインスレッドが無限ループを繰り返しています。他のプログラミング言語では、処理をしない場合はスレッドを停止させます。 そしてNode.jsの素晴らしいのは、重い処理は別のスレッドに任せることで、メインスレッドが一切I/Oでブロックされません。
これをイベント駆動モデルと言います。
単独でWebサーバーとして動作する
Node.jsはそれ単独でWebサーバーとして利用できます。つまり、PHPのようにApacheのようなWebサーバーを別に用意しなくても済むのです。
細かい処理を大量に行うことに向いている
Node.jsのプロセスはシングルスレッドでノンブロッキングI/Oで動作しています。 これは、Webアプリケーションの様な小さな処理を大量に行う目的に非常に適しています
サーバーサイドとクライアントサイドでコードを共通化
Node.jsの文法はクライアントサイド、つまりブラウザで動くJavaScriptと基本的に同じです。 実際はES6などの新しい規格でコーディングすることが推奨されていますが、これをブラウザで動かせるようにできるフレームワークも存在します。
つまり、Node.jsを使えば、ある程度までですが、サーバーとクライアントサイドで同じコードを使うことができるのです。
学習コストが低い
Node.jsはスクリプト言語で、習得が容易で、初心者でも簡単に書くことができます。
npmからライブラリを導入できる
Node.jsにはnpmと呼ばれているオープンソースライブラリのアーカイブがあります。データベースを利用したりする大半の機能はnpmのライブラリから簡単に利用可能ですので、いろいろな機能をもったアプリケーションを短時間で作成可能なのです。
npmでは特定のアプリケーション用にパッケージをインストールするだけではなく、Node.jsで実装されたコマンドラインツールを導入することにも使えます。グローバルにインストールするということですね。
MongoDBとの相性が良い
最近、流行のデータベースとしてMongoDBがあります。NoSQLの一種で、非常に高速にデータを読み出すことができるデータベースです。そのデータ構造はJavaScriptのJSONと同じで、JavaScriptでもあるNode.jsとの相性が抜群です。
Node.js用のWebアプリケーションフレームワークであるExpress、クライアントサイドでのSPAライブラリであるAngularJSと組み合わせたMEANスタックは海外では非常に人気のある開発手法です。
MEANスタック
- M - MongoDB
- E - Express
- A - AngularJS
- N - Node.js
C++実装
Node.jsはJavaScriptの文法で動作しますが、その中身はC++で実装されています。
つまり、C++で書いたアプリケーションとの連携も可能なのです。
できること
- かんたんWebサーバー
- リアルタイムチャットアプリ
- 本格的なWebアプリケーション
- IoTにも使える?
デメリットもあるんでしょ?
- Goに比べると遅い
- PHPに比べると導入が面倒
Goに比べると遅い
残念ながらGo言語に比較すると性能面では劣ります。 Webアプリケーションで利用するには、問題のないレベルなのですが、重い処理を大量に裁く必要のあるアプリケーション、たとえば広告配信サーバーなどには不向きでしょうね。
参考:
Go言語に比べると性能が低い
PHPに比べると導入が面倒
大半のレンタルサーバーにはPHPがデフォルトでインストールされていることが多いですが、Node.jsに対応しているサーバーは比較的少なく、VPSなどを利用して各自インストールする必要があります。
apt-getなどのツールを利用すれば簡単なのですが、コマンドラインに慣れていない超初心者な人には厳しいかもしれません。
Node.jsの有名なフレームワーク
- Express - RubyのSinatraに似たWebアプリケーションフレームワーク
- Socket.io - サーバーとクライアントの間でリアルタイム処理を簡単に実行可能
Node.jsを採用している企業
国内
- サイバーエージェント
- Tokyo Otaku Mode
海外
- Uber
- PayPal
と海外の有名IT企業にも多く導入されていますので、上司や同僚を説得するのにも役に立ちますね。
UberとPayPalについては以下の記事を
LinkedInについては以下の記事が詳しいです。
LinkedIn での Ruby on Rails 対 Node.js
LinedIn のモバイルエンジニアリング担当ディレクタであるKiran Prasad氏は ArsTechnica に対して,LinkedIn ユーザにモバイルサービスを提供する バックエンドインフラを再検討しなければならなかった理由について説明した。モバイルアプリケーションを利用しているユーザは全体の 7~8%に過ぎないにも関わらず,Ruby on Rails で実装されたバックエンドが深刻なスケーラビリティ上の問題に悩まされていた,というのだ。
LinkedIn では適用可能な3つのソリューションを評価した – Rails/Event Machine,Python/Twisted,そして Node.js である。Prasad 氏によると,多くのメリットがあることから,最終的に Node.js が選ばれたのだという。
優れたパフォーマンス – いくつかのシナリオにおいて,Node.js は Rails の20倍以上高速だった。 サーバ30台の処理をわずか3台で実行できるため,10倍以上のトラフィックを処理する余地が生まれる。 フロントエンドの JavaScript 技術者をバックエンドコード開発に従事させることが可能になる。この結果,2つあった開発チームが1つに統合された。
Node.jsの導入
Mac (OSX)
Macであれば専用のパッケージ管理ツールのHomebrewで一発です。
brew install node
導入がうまくいったか確認するには以下のコマンドを入力
node -v
うまくいけばバージョンが表示されます。
v6.7.0