Node.jsとは何なのか調べてみました
サーバーサイドのプログラムとして数年前から注目されているNode.jsですが、
私は、サーバーサイドで動くJavaScriptで、非同期の処理が得意というくらいの認識しかなかったので、
さすがにまずいと思い、どんなものなのか調べてみました。
今回は同じくサーバーサイドで動くプログラミング言語であるPHPと比較する形でまとめてみました。
(私はまだ理解が浅いので、間違ったことを書いてしまっている可能性がありますので、ざっくりと参考までに)
1. Node.jsのJavaScriptとPHPは基本的に役割が異なる
正直私はNode.jsはPHPを動かすためのApacheのようにJSファイルをサーバー上に置くことで、
それを実行してくれるようにするものだと思っていました。
実際はそうではなく、Node.jsはサーバーサイドでJavaScriptを実行できるようにしてくれるものです。
これは、JSファイルをサーバー上の特定のディレクトリに配置すると自動的に実行できるようにするという意味ではありません。
実際には、以下のようにコマンドでNode.jsにJSファイルを実行するように指示することで、JavaScriptは実行されます。
1 | $ node example.js |
さらに、これを実行するとPHPのようにWebページにテキストが表示されるというものでもなく、
Webページにテキストを表示は、以下のようにJSファイル内でHTTPモジュールを呼び出すことで可能になります。
1 2 3 4 5 6 | var http = require('http'); //httpモジュールの呼び出し http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); //ヘッダー情報の書き込み response.end('Hello World\n'); //テキストの書き込み }).listen(8000); //ポートの指定 |
このコードでは 「Hello World」と書かれたテキストファイルが8000番ポートに出力されます。
ここまで見ていただいて分かる通り、Node.jsにおけるJavaScriptはPHPとは根本的な役割が違います。
PHPはApacheなどのHTTPサーバ上でHTMLを表示したりデータベースを操作したりするWebアプリを作成することが役割となりますが、
Node.jsでのJavaScriptでは、HTTPサーバやファイルサーバなどを作成したりするなど、サーバのより根幹的なアプリを作成することも役割となります。
2. PHP(Apache)は同期処理×マルチスレッド、Node.jsは非同期処理×シングルスレッド
PHPでは何かプログラムを実行する場合、
その処理が終わるまでは他の処理が始まらない同期処理という方法でプログラムを実行しています。
この方法では、同時に一つの処理しか行うことができないため、
同時に2つ以上の処理が必要な場合、
例えば複数のユーザーからアクセスがあった場合などには、
処理する場所を複数作ることで、平行して処理を行っています。
この複数に分けて処理する方法をマルチスレッドといいますが、
この方法は処理が増えるたびに処理する場所を確保する必要があるので、
メモリの消費が大きいという欠点があります。
一方Node.jsでは、プログラムを実行するときに、
ある処理が終わる前に別の処理を実行する非同期処理という方法でプログラムを実行しています。
この方法ではひとつの場所で複数の処理を平行して行うことができるので、
処理する場所を複数に分ける必要がありません。
そのこともあり、Node.jsでは処理を一つの場所で行うシングルスレッドという方法で処理を行っています。
このあたりは↓こちらのサイトでの説明がわかりやすいです。
コンビニでわかるノンブロッキングIO | break the code!! | codebreak;
3. PHPはフロー駆動型、Node.jsはイベント駆動型
PHPではプログラムによる命令があるたびに実行を行う「フロー駆動型」という実行形式をとっていますが、
Node.jsでは”ページが読み込まれた”、 “クライアントからリクエストがあった”などのイベントが起こったときに実行を行う「イベント駆動型」という実行形式をとっています。
イベント駆動型のプログラムでは、イベントが起こった時だけ実行するので、特定の処理が終わるのを待たずに別の処理を行うことができたり、処理の流れがわかりやすくなるなどのメリットがあります。
他にも様々な違いや特徴がありますが、今回はこのあたりまでで。
Node.jsがすべてのサイトに有利であるというわけではないので、
すべてのサイトがNode.jsに変わっていくということはないと思いますが、
リアルタイムな処理が求められるサイトなどでは特に強みを発揮しますので、
利用は更に広がっていくのではないかと思います。
参考サイト
WordPressとApache、PHP、MySQLの関係 | サイト構築日記(WordPress編)
コンビニでわかるノンブロッキングIO | break the code!! | codebreak;
参考図書
Author Profile
NINOMIYA
Webデザイナー兼コーダー出身のフロントエンド開発者です。 UXデザインやチーム開発の効率化など、勉強中です。
SHARE