この記事は
「JavaScriptの勉強してたらみんなNode.jsの存在を前提に話が進む。でもNode.jsってWebサーバじゃないの? なんでインストールしなきゃいけないの? なんでみんな使ってるの?」
といった疑問を解消することを目的としています。
大前提:JavaScriptの特徴
Node.jsを説明する前にJavaScriptと他のプログラミング言語の違いを知っておく必要があるので説明します。
JavaScriptはChromeやFirefoxといった「ブラウザ上」で動作するプログラミング言語です。
対してPythonやRubyのような一般的なプログラミング言語は通常「パソコン上」で動作します。1
このことが生み出す違いは、OSの機能にアクセスできるかどうかです。
「OSの機能」とは例えばファイルの読み書きや、USB接続された周辺機器へのアクセス、ネットワーク通信などの機能のことです。2
パソコン上で動作するアプリケーション(PythonやRubyなどを含む)ではこれらの機能を扱うことができます。3
(図だとPythonだから自由にアクセスできるみたいにも見えますが、パソコン上で動作するアプリケーションだから自由にアクセスできるという方が正しいですね)
それに対し、ブラウザ上で動作するプログラム(JavaScript)がOSの機能へアクセスできてしまうと大変まずいことになります。4
あるサイトにアクセスしただけで勝手にパソコン上のファイルを読み書きされたり、プログラムのミスでうっかりパソコン上のファイルを一部消されたりしたら大問題ですよね。5
ということで、ブラウザ上で動作するJavaScriptはOSの機能にアクセスできないようになっています。
ですがOSの機能へ全くアクセスができないということは、ローカルファイルの読み込みや保存ができないのはもちろん、ユーザーがどこをクリックしたのか、キーボードのどのキーを押したのかも分からないという状態になります。それでは不便なのでブラウザが限定的にOSの機能へのアクセスを仲介してくれています。6
最近ではカメラやマイクへのアクセスの仲介もやってくれるので、ブラウザ上でWeb会議できたりしますよね。
Node.jsって何者?
そんなブラウザ上という制限された環境でしか動けなかったJavaScriptを、PythonやRubyのようにパソコン上で動かせるようにしてくれるのが「Node.js」です。
誤解されることが多いのですが、Node.jsはWebサーバでもなければRailsやDjangoのようなWebフレームワークでもありません。JavaScript実行環境です。
WindowsにPythonをインストールすると「python.exe」ができるように、Node.jsをインストールすると「node.exe」ができます。
python.exeがPythonコードを実行するアプリケーションであるように、node.exeはJavaScriptコードを実行するアプリケーション(つまりJavaScript実行環境)です。
さて、冒頭からここまで「ブラウザ上」と「パソコン上」という表現を何回か出しましたが、これをかっこよく言いかえたのが「クライアントサイド」と「サーバサイド」です。
Node.jsはよく「サーバサイドのJavaScript実行環境」と紹介されます。
よく誤解されますが、この「サーバ」というのは「Webサーバ」のことではなく「パソコン」のことです。7サーバサイドのJavaScript実行環境
= パソコン上でJavaScriptを実行する環境
ということです。
つまりNode.jsは(ブラウザ上ではなく)パソコン上でJavaScriptを動かすための環境であるといえます。
Node.jsではJavaScriptでOSの機能にアクセスするプログラムを組むことができます。
つまりブラウザ上で動作していたときはできなかった自由なファイルの読み書きなどができるようになります。
結果的にPythonやRubyなどと同じようにWebサーバやWebアプリケーションを作成することもできますが、Node.jsはWebサーバやWebアプリケーションのためだけのものではないということは覚えておいてください。
npmって何者?
ちょっと話はそれますが一応npmのことも解説しておきます。
npmはNode.jsのパッケージ管理ツールです。
Pythonにおけるpip、Rubyにおけるgem(RubyGems)、Debianにおけるapt、MacにおけるHomebrew、Rustにおけるcargo。だいたいそんな感じです。
たまにyarnというのが出てきますがnpmと同じことができる物だと思って大丈夫です。
「パッケージ」というのはライブラリやフレームワークのことです。
つまりVueやReact, webpack, jQueryなどのことです。
Node.jsで使いたいライブラリがある場合、jsファイルをダウンロードしてきて<script src="xxx.js"></script>
って書いて……とかはせずにnpmを使ってインストールします。
Node.jsってなんでみんな使ってるの?
Node.jsによって枷を外されたJavaScriptは色々なことができるようになりました。
その用途は多種多様ですが、現在、Node.jsを使っている人の目的のほとんどは以下の4つに分類できます。(筆者の主観的な意見です)
- 新しい仕様のJavaScriptまたはTypeScriptでクライアントサイドのプログラムを書きたい。
- Webサーバを作りたい。
- Webアプリケーションを作りたい。
- モバイル/デスクトップ用のアプリケーションを作りたい。
目的1. 新しい仕様のJavaScriptまたはTypeScriptでクライアントサイドのプログラムを書きたい
おそらくNode.jsを使っている人の目的としてはこれが一番多いです。
新しい仕様(ES2015以降)のJavaScriptについては至る所で解説されているのでここでは簡潔に。TypeScriptについては割愛します。
JavaScriptは年々仕様が更新され、どんどん新しい機能が増えています。特にES2015というバージョンではそれまでにはなかった便利な機能がたくさん仲間入りしました。
しかしJavaScriptの仕様を新しくしても既存のブラウザが追いついてこれないという問題が発生します。
これを解決するために登場したのが「新しい仕様で書いたJavaScriptファイル」を機械的に「旧仕様(ES5)のJavaScriptファイル」に変換してしまう手法です。
この変換を行うツール(トランスコンパイラ)の現在の主流がBabelであり、それを動かすための環境として現在よく選ばれているのがNode.jsです。
つまりかなり乱暴な言い方をすると
みんな
const
やimport
などを使ってクライアントサイドのJSを書きたい
↓
でも古いブラウザは対応していない
↓
Babelを使えば新しい仕様で書いても古いブラウザに対応したJSファイルに変換できる
↓
BabelはNode.js上で動かすことができる
↓
みんなNode.jsを使って開発するようになる
ということです。
目的2. Webサーバを作りたい
Node.jsの登場でJavaScriptでWebサーバを構築できるようになったので話題になりました。
元々Node.jsはスケーラブルなネットワークアプリケーション(大量の同時接続をさばけるWebサーバ)の構築を目的として設計されました。
つまりApacheやnginxのようなWebサーバをNode.jsを利用して作れるということです。
実際にはNode.jsのみで企業などの運用に耐えうるWebサーバを構築するのは難しいので、その前段にApacheやnginxをリバースプロキシとして置く構成が多いようです。
目的3. Webアプリケーションを作りたい
Ruby + RailsやPython + Djangoなどで作るようなWebアプリケーションをNode.jsで作ることも可能です。
わかりやすくするためにこの場合に対応する項目を表で書くと
実行環境 | 言語 | Webフレームワーク |
---|---|---|
Ruby | Ruby | Ruby on Railsなど |
Python | Python | Djangoなど |
Node.js | JavaScript | Express.jsなど |
となります。
フロントエンドしかやったことがない人がサーバサイドも書くことになったときにJavaScriptしかできないからNode.jsを選ぶなんて言われたりしますが、正直Node.js+Express.jsを勉強する労力と、Ruby+RailsやPython+Djangoの勉強をする労力はあまり変わらないと思いますので、言語にとらわれずにそれぞれの特徴をよく調べてから選択するのがいいかと思います。
目的4. モバイル/デスクトップ用のアプリケーションを作りたい
Node.jsではモバイルアプリケーションやデスクトップアプリケーションの開発ができます。
フレームワークはモバイルアプリケーションであればReact Nativeが、デスクトップアプリケーションであればElectronが使われることが多いです。
React Nativeは使ったことがなく知識も少ないので、以下Electronのみについて説明します。悪しからず。
ElectronはJavaScript+HTML+CSSを使用してデスクトップアプリケーションを作成するためのフレームワークです。
JavaScriptは元々ウェブサイト用の言語ですのでUIの操作に使われることが多く、そういったライブラリやフレームワークは洗練され、成熟しています。その財産を利用してWebサイトと同じようにUIが構築できるというのは大きなメリットになります。
また、Electronでは同じコードでWindows/Mac/Linuxのアプリが作成(クロスプラットフォーム開発)できます。
Visual Studio Code、Slack、Discord、Twitch、SkypeといったデスクトップアプリがこのElectronでできています。
目的5. その他
他にもウェブサイトのアセットをバンドル(webpack)するためにNode.jsを使ったり、SassをCSSに変換(node-sass)するためにNode.jsを使ったり、テストツール(Jest)やコード検証ツール(ESLint)を使うためにNode.jsを使ったり、開発用の簡易Webサーバ(webpack-dev-server)をローカルで立てるためにNode.jsを使ったり、静的サイトをビルド(Gatsby)するためにNode.jsを使ったりと、Node.jsは様々な用途で使われています。
最後に
Node.jsは他のプログラミング言語と同じような大きな可能性をJavaScriptにもたらしてくれました。(話が複雑になるので本文中では言及を避けましたがV8 JavaScriptエンジンのおかげでもあります)
ちまたで言われるように、たしかにJavaScriptは(その出自のせいもあり)他の言語に比べて設計が甘い部分もあります。それで同じ土俵に立たれてもなあ……という意見もわかります。
ですがこんなに若い層の使用人口が多く、ライブラリなども含めて物凄い勢いで進化していき、トレンドが走馬灯のように移り変わるプログラミング言語は他にありません。
jQueryなんてもはや歴史的遺物みたいな扱いになっていますが、誕生したのはRailsやDjangoより後ですからね。物凄いスピード感です。
この時代に生まれ、このスリリングなJavaScriptの進化の波に乗れるのはワクワクできて楽しいことだと個人的には思います。
最後に、冒頭でも言いましたが、この記事で「Node.jsってWebサーバじゃないの?ES2015で書きたいだけなのになんでインストールしなきゃいけないの?」みたいなよくある疑問が解消できたら幸いです。
「JavaScriptはブラウザ上で動作してる。つまりパソコン上のブラウザ上で動作してるってことだから……結局パソコン上で動作してるのでは?」と思ってしまった方は、本文中の「パソコン上で動作」を「パソコン(OS)上で直接動作」と読み替えて読んでください。 ↩
パソコンが行える全ての機能といってもいいです。 ↩
昨今ではOSのセキュリティがしっかりしているのでインストールしたアプリケーションであっても自由に全てのOSの機能を使えるわけではなく、アプリケーションが特定の機能にアクセスしようとしてきたら、ユーザーに「これ本当に大丈夫?」と許可を求めることが多いです。 ↩
ActiveXとかいうのはこれができちゃいますが。 ↩
JavaScriptは関係ないですけど実際昔HDDバースト事件なんてのがありました。 ↩
ブラウザはインストールされたアプリケーションなので当然OSの機能へアクセスできます ↩
正確には「何らかのサーバ機能を稼働させているコンピュータ」のことです(サーバ機能を稼働させていればパソコンも含まれます。もちろんサーバ専用機なども含まれます) ↩