node.jsの基本


node.jsは僕にとってはじめてお金を稼げた言語でとても特別なものなのですが、仕様を端から端まで熱心に勉強したわけではなく、壁にぶつかってはググっての繰り返しで身につけたので自分の理解をちゃんと整理するための備忘録として、また初学の人たちへ少しでも役に立てばとまとめました。

目次

node.jsとは

node.jsはサーバーサイドのイベント駆動型JavaScript環境です。イベント駆動型というのは、プログラムの実行から何かしらが起きるまで待機して、起きた事物が規定の条件を満たしたときに指定された命令を実行するプログラミングの概念です。node.jsはJavaScriptを用いてPHPやPythonなどで書くようなサーバーサイドアプリケーションを作成することができます。

Hello World

node.jsにおける最も基礎的なHello Worldです

server.js
const http = require('http')
const port = 3000
const hostName = "127.0.0.1"
const headers = {
  'Content-Type': 'text/plain'
}
http.createServer((req, res) => {
  res.writeHead(200, headers)
  res.end('Hello World!\n')
}).listen(port, hostName)

console.log('Server running at http://' + hostName ')

これを走らせます

node server.js

結果: Hello World!が http://127.0.0.1:3000へのgetリクエストに返信します

豆知識?コマンドラインで走らせたコードはCtrl + Cで終了させられます

npm (Node Package Manager)

npmはnode.jsにおけるパッケージマネージャーです。Pythonにおけるpipみたいなものでしょうか(pythonはflaskを少し触ったくらいですので間違ってたらご教授お願いします)npmはnode.jsの開発環境においてモジュールの作成、共有、再利用を可能にしてくれます。この機能はnode.jsのインストールについてきます。

モジュールのインストール方法

最も簡素な方法(例:express)

npm install express

モジュールの使い方

先程のhello worldでnode.jsにビルトインされているhttpモジュールを宣言しましたが全く同じように宣言できます。

const express = require('express')

express.jsはnode.jsにおける最も簡素なウェブフレームワークのひとつです。

server.js
const express = require('express')
const port = 3000

const server = express()

server.get('/', (req, res) => {
  res.header(200).send("Hello World!")
})

server.listen(port, () => {
  console.log('server listen on port:'+  port)
})

豆知識npm に存在するモジュールはnpmのウェブサイトにて検索できますが "npm search [module_name]" でも検索できます。

ローカルインストールとグローバルインストール

npmでインストールするモジュールには二種類の方法があります。とても重要です。

ローカルインストール

ローカルにインストールするのはつまりそのディレクトリ内のnode_modulesフォルダにそのライブラリがインストールされるということです。
インストール方法

npm install [module_name]

グローバルインストール

グローバルインストールはそのマシンの全ファイルシステムでそのモジュールを実行可能にします。先程の例に使ったexpressは自動でアプリの骨組みを作成する機能がありますので、

npm install -g express
express [app_name]

で自動でウェブアプリの雛形を作ってくれます。

node.jsの仕組み

Non-blocking I/O

IOはInputとOutputのことでコンピューターを通して入力と出力の間のデータをやりとりすることです。
入力は必ずしも人間とコンピューターとのやりとりに限りません。ウェブアプリにおけるI/Oはどんどん複雑になっています。それは単なるブラウザとサーバーのやり取りに限らず、サードパーティのAPIとのやりとり、スマホなど別のデバイスを使った認証、データベースへの多重同時接続などなど。
つまるところネットワークにおけるI/Oは複雑で詳細な予測が難しいということです。
そしてI/Oの処理にはときに長い時間がかかり、データを読み込んでいる間などに処理がそこで待機しつづけてしまうことがあります。

非同期メソッド

この問題の解決のためにはコールバックを行います。

asynchronous.js
const fs = require('fs')

fs.readFile('test.txt', (err, data) => {
  if(err){
    console.log(err)
    return
  }
  console.log(data)
})

console.log("this text should come first")

コールバックであるconsole.log(data)は"this text should come first"のあとに実行されます。なぜコードの中で下にある処理が先に実行されるのか、シングルスレッドであるnode.jsでこれを可能にしているのがイベントループです。

イベントループ

node.jsの最も重要な特徴のひとつです。イベント駆動型であるnode.jsは何かが起きるまでループを繰り返して待機し続けていて、なにかすることが出てくるとすることとコールバックをキューに追加して他の一連の処理をして、次のI/Oへその処理が終了するまで待ち続けるループを行うのがイベントループです。
この特徴を最大限活かすのがnode.jsにおける効率的なコードを書くうえで大切になります。関数はイベントループをブロックしない、時間のかかる処理は細かい処理に分割するなどなど。

その2へ続きます。

Node.jsの基本その2