UTALI

みんなの役に立つ情報をどんどん公開していきます

初心者向け | サーバーサイドJavaScript - Node.jsをわかりやすく理解する

f:id:mochizuki_p:20161005031521j:plain

公式サイト

Node.js

Node.jsはGoogleが開発したJavaScript処理エンジンV8上で動作するJavaScript実装です。Node.jsは非同期で動作するノンブロッキングIOのイベント駆動モデルを採用し、軽量・高速に動作することが特徴です。

2009年に、ライアン・ダール(Ryan Dahl)によって開発が始まり、アメリカのクラウドコンピューティング会社である Joyent社 によってプロジェクトが支援されています。

Node.jsの開発者 ライアン・ダール(Ryan Dahl) 氏

f:id:mochizuki_p:20170112212253j:plain

今回は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アプリケーションで利用するには、問題のないレベルなのですが、重い処理を大量に裁く必要のあるアプリケーション、たとえば広告配信サーバーなどには不向きでしょうね。

参考:

github.com

Go言語に比べると性能が低い

f:id:mochizuki_p:20170112212657p:plain

PHPに比べると導入が面倒

大半のレンタルサーバーにはPHPがデフォルトでインストールされていることが多いですが、Node.jsに対応しているサーバーは比較的少なく、VPSなどを利用して各自インストールする必要があります。

apt-getなどのツールを利用すれば簡単なのですが、コマンドラインに慣れていない超初心者な人には厳しいかもしれません。

Node.jsの有名なフレームワーク

  • Express - RubyのSinatraに似たWebアプリケーションフレームワーク
  • Socket.io - サーバーとクライアントの間でリアルタイム処理を簡単に実行可能

Node.jsを採用している企業

国内

  • サイバーエージェント
  • Tokyo Otaku Mode

海外

  • Uber
  • PayPal
  • LinkedIn

と海外の有名IT企業にも多く導入されていますので、上司や同僚を説得するのにも役に立ちますね。

UberとPayPalについては以下の記事を

www.utali.io

フィン・エアーでの採用事例

www.utali.io

WordPress.comがNode.jsを採用

www.utali.io

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

Ubuntu

www.utali.io

Node.jsでかんたんWebサーバーを作る

最初にnpmでExpressとhttpをインストールしておきます。

sudo npm install express http -g

そして以下のファイルを保存

server.js

var app = require("express")();
var http = require('http');
http.createServer(app.get("/",function (req, res) {
    res.send(req.query.q);
})).listen(3000, '127.0.0.1');

そして起動します。

node server.js

ブラウザに以下を入力してローカルで起動したExpressサーバーにアクセスします。

f:id:mochizuki_p:20170113212633p:plain

すると以下のようにq=で指定した内容が出力されます。

f:id:mochizuki_p:20170113212639p:plain

このように入力値に応じてリスポンスの結果を変えるのがWebアプリケーションの基本です。

そして、Node.jsはたった5行でこの機能を実現できてしまうのですね。

簡単な画像掲示板を作るチュートリアル

www.utali.io

次はNode.jsで一般的に利用されているWebアプリケーションフレームワークのExpressの解説をどうぞ

www.utali.io

入門書については

www.utali.io