Open1

Node.js をざっくりキャッチアップ

zuribozuribo

Node.js とは

https://nodejs.org

Node.js は、ソースコードが公開されていて (open-source)、様々なプラットフォームで動作できる (cross-platform) JavaScript の実行環境 (runtime environment) である。

https://nodejs.org/en/learn/getting-started/introduction-to-nodejs

Node.js は、Google Chrome のコア部分である V8 JavaScript エンジンを、ブラウザ外で動作させるものである。

Node.js アプリは、単一のプロセスとして動作し、リクエストごとに新しいスレッドを作成しない。

Node.js には、標準ライブラリに非同期 I/O を行うためのプリミティブが用意されており、基本的にノンブロッキング I/O を使う。スレッドをブロックしたり busy loop で CPU サイクルを無駄することはせずに、ネットワーク I/O やデータベースやファイルシステムへのアクセスのように、レスポンスが返ってきてから操作を再開する。

上記の特徴によって、Node.js は並列するスレッドの管理をする必要がなく、1つのサーバーで数千の接続を並列処理することができる。

以上から、元々動的な Web サイトを実現するためにフロントエンドで使用されていた JavaScript を、サーバーサイドでも使えるようになった。

インストール方法

https://nodejs.org/en/learn/getting-started/how-to-install-nodejs

様々な方法でインストールすることができるが、複数の Node.js のバージョンを使えるように、バージョンマネージャーを使うのが良い。Node.js の有名なバージョンマネージャーとしては、以下がある。

以下の例では、M1 MacBook Pro で nodebrew をインストールし、安定版の nodejs をインストールしている。

$ brew install nodebrew
$ nodebrew install stable
$ nodebrew use stable

以下のようなものがインストールされる。

  • node: Node.js ランタイム
  • npm (Node Package Manager): Node.js におけるパッケージマネージャー
  • npx (Node Package Execute): Node.js パッケージの実行を一時的に行うための CLI ツール
    • 使いたいパッケージのインストール + 実行 + アンインストールをまとめて行ってくれ、環境を汚さずに Node.js パッケージの実行を可能にする。
$ node -v
v20.10.0

$ npm -v
10.2.3

$ npx -v
10.2.3

Hello World!

$ node
Welcome to Node.js v20.10.0.
Type ".help" for more information.
> console.log("Hello World!")
Hello World!
undefined

初めての Node.js プロジェクト

プロジェクト用のディレクトリを作成して、npm init を実行する。

$ mkdir my-first-app
$ cd my-first-app
$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help init` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (my-first-app)
version: (1.0.0)
description: This is my first app using Node.js
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Volumes/workplace/test/my-first-app/package.json:

{
  "name": "my-first-app",
  "version": "1.0.0",
  "description": "This is my first app using Node.js",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

Is this OK? (yes)

これで package.json というファイルが生成された。

entry point に index.js を指定したので、index.js を作成する。

console.log("Hello World!");

実行してみる。

$ node index.js
Hello World!

これを npm 経由で実行できるように、package.jsonstart コマンドを追加する。

{
  "name": "my-first-app",
  "version": "1.0.0",
  "description": "This is my first app using Node.js",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

これによって npm start で、実行できるようになる。

$ npm start

> my-first-app@1.0.0 start
> node index.js

Hello World!

初めての Web アプリ

Node.js はサーバーサイドで使われることも多く、Web アプリを実際に作成してみる。

先ほどのプロジェクトの index.js を以下のように変更する。


const http = require('node:http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello World!');
});

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}`);
})

実行する。

$ npm start

> my-first-app@1.0.0 start
> node index.js

Server running at http://127.0.0.1:3000

ブラウザから http://127.0.0.1:3000 にアクセスしてみると、"Hello World!" が無事表示される。