node.jsの基本操作 サーバー作成と依存関係その2

Node.js / npm

Node.jsはGoogleのV8エンジン上で動作する、サーバーサイドJavaScriptランタイムです。これにより、クライアントとサーバーで同じJavaScriptを使用でき、開発効率が向上します。非同期・イベント駆動モデルを採用し、高スループットと低レイテンシーを実現するため、リアルタイムアプリケーションに最適です。

Node.jsのシングルスレッド構造は、イベントループを活用して多くのリクエストを効率的に処理します。さらに、インストール時にはnpmやnpxも含まれ、特にnpxは一時的なツール利用を簡素化する便利なコマンドです。Node.jsの柔軟な環境で、シンプルで高性能な開発を始めましょう!

基本操作

Node.js プロジェクトの作成から基本操作、依存関係の管理方法までを解説します。

プロジェクトの作成と初期化

まず、任意の場所にプロジェクト用のフォルダを作成します。プロジェクトとは、単にフォルダを作成することを意味します。

例として、D:\my-node-server\ というフォルダを作成しました。

次に「初期化」を行います。package.json ファイルを生成します。以下どちらかのコマンドを使用します。

npm init
npm init -y
Bash

-y オプションを付けると、すべての質問がスキップされ、デフォルト設定で初期化されます。

初期化時の設定内容

以下は、初期化中に入力を求められる内容の説明です。

  • package name: パッケージの名前(例: my-server)。
  • version: パッケージのバージョン番号(例: 1.0.0)。
  • description: パッケージの説明(空欄可)。
  • entry point: エントリーポイントファイル(通常は index.js)。
  • test command: テストコマンド(デフォルトは設定なし)。
  • git repository: Git リポジトリ URL(空欄可)。
  • keywords: キーワード(検索で見つけやすくするため)。
  • author: 作者情報。
  • license: パッケージのライセンス(デフォルトは ISC)。

生成された package.json の例

{
  "name": "my-server",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "description": ""
}
Bash

サーバーの作成

次に、index.js ファイルを作成し、以下のコードを記述します。
公式サイトにテンプレートがリンク公開されています。

const http = require('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!\n');
});

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

以下のコマンドでサーバーを起動します。

D:\my-node-server>node index.js
Server running at http://127.0.0.1:3000/
Bash

ブラウザで http://127.0.0.1:3000/ にアクセスすると、Hello World! が表示されます。サーバーを終了するには Ctrl+C を押します。

HTTPS サーバーの作成

HTTP 接続ではなく HTTPS 接続を使用したい場合は、以下のコードを使用します。その前に、openssl コマンドで SSL 鍵と証明書を生成してください(ここでは割愛します)。

openssl req -nodes -new -x509 -keyout server-key.pem -out server-cert.pem -days 365
Bash
const https = require('https');
const url = require('url');
const fs = require('fs');

const options = {
  key: fs.readFileSync('server-key.pem'),
  cert: fs.readFileSync('server-cert.pem')
};

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

const server = https.createServer(options, (req, res) => {
  const parsedUrl = url.parse(req.url, true);
  const query = parsedUrl.query;

  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');

  if (query.name) {
    res.end(`Hello, ${query.name}! This is HTTPS server.\n`);
  } else {
    res.end('Hello, World! This is HTTPS server.\n');
  }
});

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

Node.js プロジェクトの依存関係管理

依存関係の追加

Node.js プロジェクトを構築する際には、依存関係の管理が非常に重要です。以下では、依存関係の追加、package.json や package-lock.json の役割、node_modules フォルダの機能について説明します。

依存関係を追加するには、npm install <パッケージ名> コマンドを使用します。このコマンドを実行すると以下の処理が行われます。

  1. パッケージがローカルにインストールされる
    • node_modules フォルダ内に依存パッケージが保存されます。
  2. package.json に記録される
    • dependencies フィールドにパッケージ情報が追加されます。

プロジェクトに依存関係を追加するには、以下のコマンドを使用します。

npm install <パッケージ名>
Bash

例として、express パッケージをインストールする場合。

npm install express
Bash

上記のコマンドを実行すると、package.json に以下のように記録されます。

"dependencies": {
  "express": "^4.21.2"
}
Bash

これにより、プロジェクトで express を利用できるようになります。

  • package-lock.json の生成または更新
    正確なバージョン情報と依存関係の解決先が記録されます。
  • node_modules フォルダへの追加
    プロジェクトで使用されるすべての依存パッケージがここに格納されます。

package.json の役割

主なフィールド

  • main: プロジェクトのエントリーポイント(例: index.js)。
  • dependencies: プロジェクトが使用する必須パッケージ。
  • scripts: カスタムスクリプトの一覧。

スクリプト例

package.json の scripts フィールドには、以下のようなコマンドを定義できます。

   "scripts": {
    "start": "node index.js",           // プロジェクトを起動する
    "dev": "nodemon index.js",          // 開発用にサーバーを起動し、変更を監視する
    "test": "jest",                     // ユニットテストや統合テストを実行する
    "lint": "eslint .",                 // コードの静的解析を行う
    "build": "webpack",                 // プロジェクトをビルドする
    "prepublish": "npm run build"       // npmパッケージを公開する前にビルドを実行する
  }
JSON

npm run <スクリプト名> で実行可能です。

package-lock.json の役割

package-lock.json は、以下の情報を記録する重要なファイルです。

  • 正確なバージョン:インストールされたパッケージの正確なバージョン。
  • 依存関係の解決先 URL
  • 整合性を保証するチェックサム

このファイルにより、チーム開発やデプロイ環境間で同じ依存関係を再現することができます。

node_modules フォルダの役割

node_modules フォルダには、プロジェクトで使用されるすべてのパッケージがインストールされます。このフォルダには以下が含まれます。

  1. 直接インストールしたパッケージ(例: express)。
  2. そのパッケージが依存している他のモジュール(例: express が依存する body-parser など)。

これにより、プロジェクト内で必要なモジュールがすべてローカルに保存され、実行時に参照されます。

まとめ

  1. package.json → package-lock.json
    • package.json で定義された依存パッケージの情報が、package-lock.json に詳細として記録される。
    • 必要なパッケージのリストを管理。
  2. package-lock.json → node_modules
    • package-lock.json の情報をもとに、node_modules に依存パッケージがインストールされる。
    • パッケージのバージョンや構造の詳細を記録し、一貫性を保証。
  3. node_modules は直接 package.json を参照しない
    • node_modules の生成は、package-lock.json が存在する場合はそちらが優先される。
    • 実際に使用するパッケージが格納される。

これら3つは連携して動作し、プロジェクト全体の一貫性と再現性を維持します。

Node.jsでは、package.json、package-lock.json、node_modules の3つが連携してプロジェクトの依存関係を管理します。package.jsonは必要なパッケージを定義し、package-lock.jsonはその詳細情報(バージョンや構造)を記録、node_modulesには実際のパッケージがインストールされます。

package-lock.jsonは正確なバージョン管理を可能にし、異なる環境での一貫性を確保します。これらを通じて、開発者は簡単に依存関係を管理し、高い再現性を持ったプロジェクト運用が可能となります。npm installやnpm ciを適切に使い分けることで効率的な開発を進めましょう。

コメント

タイトルとURLをコピーしました