Help us understand the problem. What is going on with this article?

Node.jsとはなにか?なぜみんな使っているのか?

この記事は

「JavaScriptの勉強してたらみんなNode.jsの存在を前提に話が進む。でもNode.jsってWebサーバじゃないの? なんでインストールしなきゃいけないの? なんでみんな使ってるの?」

といった疑問を解消することを目的としています。

大前提:JavaScriptの特徴

Node.jsを説明する前にJavaScriptと他のプログラミング言語の違いを知っておく必要があるので説明します。

JavaScriptはChromeやFirefoxといった「ブラウザ上」で動作するプログラミング言語です。
対してPythonRubyのような一般的なプログラミング言語は通常「パソコン上」で動作します。1

このことが生み出す違いは、OSの機能にアクセスできるかどうかです。
「OSの機能」とは例えばファイルの読み書きや、ネットワーク通信などの機能のことです。
パソコン上で動作するアプリケーション(PythonやRubyなどを含む)ではこれらの機能を扱うことができます。2

それに対し、ブラウザ上で動作するプログラム(JavaScript)がOSの機能へアクセスできてしまうと大変まずいことになります。3
あるサイトにアクセスしただけで勝手にパソコン上のファイルを読み書きされたり、プログラムのミスでうっかりパソコン上のファイルを一部消されたりしたら大問題ですよね。4

ということで、ブラウザ上で動作するJavaScriptはOSの機能にアクセスできないようになっています。
ですがOSの機能へ全くアクセスができないということは、ローカルファイルの読み込みや保存ができないのはもちろん、ユーザーがどこをクリックしたのか、キーボードのどのキーを押したのかも分からないという状態になります。それでは不便なのでブラウザが限定的にOSの機能へのアクセスを仲介してくれています。5
最近ではカメラやマイクへのアクセスの仲介もやってくれるので、ブラウザ上で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でOSの機能にアクセスするプログラムを組むことができます。6
つまりブラウザ上で動作していたときはできなかった自由なファイルの読み書きやネットワーク通信などのOSの機能を扱えます。

結果的にPythonやRubyなどと同じようにWebアプリケーションを作成することもできますが、Node.jsはWebアプリケーションのためだけのものではないということは覚えておいてください。

Node.jsはサーバサイドのJavaScript実行環境?

Node.jsはよく「サーバサイドのJavaScript実行環境」と紹介されます。
これはNode.jsの生い立ちに由来します。

Node.jsは元々(大量の同時接続をさばける)ネットワークアプリケーションの構築を目的に設計されたJavaScript環境です。
その「JavaScriptでWebアプリケーション(Webサーバ)が作れる」という特徴から(それまでブラウザ上で動作させるものだったということもあり)「Node.jsは(クライアントサイドではなく)サーバサイドのJavaScript実行環境である」という紹介がよくされました。

ところが現在、Node.jsは「クライアントサイドJavaScript」の開発環境としても広く利用されています。
これはNode.jsの「パソコン上でJavaScriptを実行できる」という特性に目を付けた人々によって、どんどんクライアントサイドJavaScriptの開発に便利なライブラリが整備されていった結果……なのだと思います。(調べがつかなかったので想像です)

経緯はともかく、現在では「Node.jsはサーバサイドのJavaScript実行環境クライアントサイドJavaScriptの開発環境として利用される」というのが誤解を与えにくいNode.jsの説明になるかと思います。(分かりやすさはともかくとして)

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を使っている人の目的のほとんどは以下の3つに分類できます。(筆者の主観的な意見です)

  1. 新しい仕様のJavaScriptまたはTypeScriptでクライアントサイドのプログラムを書きたい。
  2. Webアプリケーションを作りたい。
  3. モバイル/デスクトップ用のアプリケーションを作りたい。

目的1. 新しい仕様のJavaScriptまたはTypeScriptでクライアントサイドのプログラムを書きたい


新しい仕様(ES2015以降)のJavaScriptについては至る所で解説されているのでここでは簡潔に。TypeScriptについては割愛します。

JavaScriptは年々仕様が更新され、どんどん新しい機能が増えています。特にES2015というバージョンではそれまでにはなかった便利な機能がたくさん仲間入りしました。
しかしJavaScriptの仕様を新しくしても既存のブラウザが追いついてこれないという問題が発生します。
これを解決するために登場したのが「新しい仕様で書いたJavaScriptファイル」を機械的に「旧仕様(ES5)のJavaScriptファイル」に変換してしまう手法です。

この変換を行うツール(トランスコンパイラ)の現在の主流がBabelであり、それを動かすための環境として現在よく選ばれているのがNode.jsです。

つまりかなり乱暴な言い方をすると

みんなconstimportなどを使ってクライアントサイドのJSを書きたい

でも古いブラウザは対応していない

Babelを使えば新しい仕様で書いても古いブラウザに対応したJSファイルに変換できる

BabelはNode.js上で動かすことができる

みんなNode.jsを使って開発するようになる

ということです。

目的2. Webアプリケーションを作りたい

Ruby + RailsやPython + Djangoなどで作るようなWebアプリケーションをNode.jsで作ることも可能です。

わかりやすくするためにこの場合に対応する項目を表で書くと

実行環境 言語 Webフレームワーク
Ruby Ruby Ruby on Railsなど
Python Python Djangoなど
Node.js JavaScript Expressなど

となります。

またNode.jsの特徴として「Webサーバの役割もNode.jsがこなす」という点があります。(というかNode.jsの目的を考えるとWebサーバとしての役割がメインです)
元々Node.jsは大量の同時接続をさばけるようなネットワークアプリケーションを構築することを目的として設計されています。
そのため、Webサーバとしての機能から一貫してNode.jsが受け持ち、効率的に処理できるようになっています。
要するに通常使われるApachenginxのようなWebサーバの代わりにNode.jsが直接HTTPリクエストを受け取り、処理をするということです。
(実際にはNode.jsのみだとWebサーバとしては少し機能が物足りないので、その前段にApacheやnginxをリバースプロキシとして置く構成が多いようです。)

フロントエンドしかやったことがない人がサーバサイドも書くことになったときにJavaScriptしかできないからNode.jsを選ぶなんて言われたりしますが、正直Node.js+Expressを勉強する労力と、Ruby+RailsやPython+Djangoの勉強をする労力はあまり変わらないと思いますので、言語にとらわれずにそれぞれの特徴をよく調べてから選択するのがいいかと思います。

目的3. モバイル/デスクトップ用のアプリケーションを作りたい

Node.jsではモバイルアプリケーションデスクトップアプリケーションの開発ができます。
フレームワークはモバイルアプリケーションであればReact Nativeが、デスクトップアプリケーションであればElectronが使われることが多いです。

React Nativeは使ったことがなく知識も少ないので、以下Electronのみについて説明します。悪しからず。

ElectronJavaScript+HTML+CSSを使用してデスクトップアプリケーションを作成するためのフレームワークです。

JavaScriptは元々ウェブサイト用の言語ですのでUIの操作に使われることが多く、そういったライブラリやフレームワークは洗練され、成熟しています。その財産を利用してWebサイトと同じようにUIが構築できるというのは大きなメリットになります。

また、Electronでは同じコードでWindows/Mac/Linuxのアプリが作成(クロスプラットフォーム開発)できます。

Visual Studio CodeSlackDiscordTwitchSkypeといったデスクトップアプリがこのElectronでできています。

目的4. その他

他にもウェブサイトのアセットをバンドル(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で書きたいだけなのになんでインストールしなきゃいけないの?」みたいなよくある疑問が解消できたら幸いです。


  1. 「JavaScriptはブラウザ上で動作してる。つまりパソコン上のブラウザ上で動作してるってことだから……結局パソコン上で動作してるのでは?」と思ってしまった方は、本文中の「パソコン上で動作」を「パソコン(OS)上で直接動作」と読み替えて読んでください。 

  2. 昨今ではOSのセキュリティがしっかりしているのでインストールしたアプリケーションであっても自由に全てのOSの機能を使えるわけではなく、アプリケーションが特定の機能にアクセスしようとしてきたら、ユーザーに「これ本当に大丈夫?」と許可を求めることが多いです。 

  3. ActiveXとかいうのはこれができちゃいますが。 

  4. JavaScriptは関係ないですけど実際昔HDDバースト事件なんてのがありました。 

  5. ブラウザはインストールされたアプリケーションなので当然OSの機能へアクセスできます 

  6. 「JavaScriptでOSの機能にアクセスできる」と書きましたが、実はこれは微妙な表現で、実際にOSの機能にアクセスするにはC++でNode.jsの拡張機能を作る必要があります。ほとんどの場合、標準ライブラリやサードパーティライブラリが用意されていますが。 

non_cal
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away