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は記録しない