Node.js は、ブラウザーの外で JavaScript を動かすための実行環境です。Web サーバーを作るだけでなく、CSS や JavaScript をまとめるビルドの道具、静的サイトの生成、ちょっとした作業の自動化など、Web 制作の道具の多くが Node.js の上で動いています。登場したばかりのころは、ソースコードを取ってきて自分でコンパイル (make) して入れるのが一般的でしたが、今はその必要はありません。ここでは、インストールから、最初の HTTP サーバー、npm の使い方までを順に説明します。

インストールは LTS 版を選ぶ

Node.js の公式サイトのダウンロードのページから、使っている OS 向けのインストーラーを入手できます。版を選べるときは、「LTS」と書かれた版を選びます。LTS (Long Term Support) は長期サポート版のことで、一定の期間、不具合や脆弱性の修正が提供され続けます。新しい機能を早く試したい場合を除き、LTS 版で始めるのが安心です。

複数のプロジェクトで違う版の Node.js を使い分けたいときは、版を切り替える道具 (バージョンマネージャー) を使う方法もあります。nvm や fnm などが知られていて、公式サイトのダウンロードのページにも、これらを使った入れ方が載っています。

入れ終わったら、ターミナル (コマンドプロンプト) で版を確かめます。

node -v
npm -v

それぞれ版の番号が表示されれば、準備はできています。npm は Node.js のパッケージ (部品) を管理する道具で、Node.js と一緒に入ります。

プロジェクトを作る (npm init と package.json)

作業用のフォルダーを作り、その中で npm init を実行します。-y を付けると、質問をとばして既定の値で作ります。

mkdir hello-node
cd hello-node
npm init -y

フォルダーに package.json ができます。これはプロジェクトの名前や、使うパッケージ、よく使うコマンドを記録するファイルです。ここでは、今の JavaScript の標準のモジュールの書き方 (import) を使えるように、"type" を "module" にし、scripts に起動のコマンドを書いておきます (ほかの項目は省略しています)。

{
  "name": "hello-node",
  "version": "1.0.0",
  "type": "module",
  "scripts": {
    "start": "node server.js"
  }
}

"type" が "commonjs" の場合は、Node.js に昔からある CommonJS という形式 (require() で読み込む書き方) で扱われます。新しい版の npm では、npm init で最初から "commonjs" が書き込まれることがあるので、書き換えを忘れないようにします。

最初の HTTP サーバー

同じフォルダーに server.js を作ります。Node.js に標準で入っている node:http モジュールで、どの URL にも同じ文字を返すだけのサーバーです。

import { createServer } from "node:http";

const server = createServer((req, res) => {
  // 返す内容の種類と文字コードを伝える
  res.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" });
  res.end("こんにちは、Node.js\n");
});

server.listen(3000, "127.0.0.1", () => {
  console.log("http://127.0.0.1:3000/ で待ち受けています");
});

npm start (または node server.js) で起動し、ブラウザーで http://127.0.0.1:3000/ を開くと、文字が表示されます。止めるときは、ターミナルで Ctrl + C を押します。

createServer() に渡した関数は、ブラウザーから要求 (リクエスト) が来るたびに呼ばれます。req に要求の内容 (URL やヘッダー) が入っていて、res で応答を返します。req.url を見て返す内容を変えれば、ページごとに違う応答を返せます。

npm でパッケージを入れる

ほかの人が作ったパッケージは、npm install で入れます。例として、Markdown を HTML に変換するパッケージ marked を入れてみます。

npm install marked

package.json の dependencies にパッケージの名前と版が記録され、パッケージ本体は node_modules フォルダーに入ります。同時にできる package-lock.json には、実際に入った版が細かく記録されます。

import { marked } from "marked";

console.log(marked.parse("## 見出し\n\n本文です。"));

Git などで管理するときは、package.json と package-lock.json を記録し、node_modules は記録しません。別の場所で同じ環境を作るときは、npm ci を実行すると、package-lock.json のとおりの版が入ります。

パッケージは、入れるときや使うときに、自分のパソコンの権限でプログラムを実行します。よく使われていて、手入れが続いているものを選び、名前の打ち間違いにも気をつけます。

ブラウザーの JavaScript との違い

文法は同じですが、使える機能が違います。

  • document や window が無い。画面 (DOM) を操作するのではなく、ファイルやネットワーク、プロセスを扱う
  • node:fs でファイルを読み書きしたり、process.env で環境変数を読んだりできる。パソコンやサーバーの上で、利用者と同じ権限で動く
  • 新しい版では、fetch() や URL など、ブラウザーと同じ名前の API も使える

ブラウザーの JavaScript は、Web ページの中で安全に動くように多くの制限がありますが、Node.js にはそれがありません。そのぶんできることは多く、扱いには注意が必要です。

まとめ

  • Node.js は、公式サイトから LTS 版を入れる。版を使い分けるならバージョンマネージャーを使う
  • npm init -y で package.json を作る。import を使うなら "type": "module" にする
  • node:http の createServer() で、最初の HTTP サーバーを作れる
  • パッケージは npm install で入れる。package-lock.json は記録し、node_modules は記録しない

参考