<CodeLearn/>
Node.js レッスン2

モジュールシステム

CommonJS、ESModules、npmでコードを整理しよう

CommonJS(require / module.exports)

Node.jsのデフォルトのモジュールシステムはCommonJSです。require()で他のファイルを読み込み、module.exportsで公開します。

// === math.js(モジュールを作成) ===
function add(a, b) {
  return a + b;
}

function subtract(a, b) {
  return a - b;
}

function multiply(a, b) {
  return a * b;
}

// 複数の関数をエクスポート
module.exports = { add, subtract, multiply };

// または個別にエクスポート
// exports.add = add;
// exports.subtract = subtract;

// === app.js(モジュールを使用) ===
const math = require('./math');

console.log(math.add(2, 3));       // 5
console.log(math.subtract(10, 4)); // 6
console.log(math.multiply(3, 7));  // 21

// 分割代入で必要な関数だけ取り出す
const { add, multiply } = require('./math');
console.log(add(1, 2));      // 3
console.log(multiply(4, 5)); // 20

ESModules(import / export)

モダンなJavaScriptではESModulesが標準です。 Node.jsでESModulesを使うには、ファイル拡張子を.mjsにするか、package.json"type": "module"を追加します。

// === utils.mjs(名前付きエクスポート) ===
export function formatDate(date) {
  return date.toLocaleDateString('ja-JP');
}

export function capitalize(str) {
  return str.charAt(0).toUpperCase() + str.slice(1);
}

// デフォルトエクスポート
export default class Logger {
  log(message) {
    console.log(`[${new Date().toISOString()}] ${message}`);
  }
}

// === app.mjs(モジュールを使用) ===
// デフォルトインポート + 名前付きインポート
import Logger, { formatDate, capitalize } from './utils.mjs';

const logger = new Logger();
logger.log('アプリ起動');

console.log(formatDate(new Date()));  // 2026/3/29
console.log(capitalize('hello'));      // Hello

// すべてをまとめてインポート
import * as utils from './utils.mjs';
console.log(utils.formatDate(new Date()));

CommonJS vs ESModules

  • require()は同期的に読み込む / importは非同期的
  • require()は条件分岐内で使える / importはトップレベルのみ
  • ESModulesはTree Shaking(未使用コードの除去)に対応
  • 新しいプロジェクトではESModulesが推奨

組み込みモジュール

Node.jsにはインストール不要で使える組み込みモジュールが 多数用意されています。ファイル操作、パス操作、HTTP通信など、サーバー開発に必要な機能が揃っています。

// fs: ファイルシステム操作
const fs = require('fs');

// ファイルの読み書き
fs.writeFileSync('hello.txt', 'こんにちは!');
const content = fs.readFileSync('hello.txt', 'utf8');
console.log(content); // こんにちは!

// path: パス操作
const path = require('path');

console.log(path.join('/users', 'docs', 'file.txt'));
// => /users/docs/file.txt
console.log(path.basename('/users/docs/file.txt'));
// => file.txt
console.log(path.extname('image.png'));
// => .png

// os: OS情報
const os = require('os');

console.log(os.platform());  // darwin / linux / win32
console.log(os.homedir());   // /Users/username
console.log(os.cpus().length); // CPUコア数

// url: URL解析
const { URL } = require('url');

const myUrl = new URL('https://example.com/path?name=taro&age=25');
console.log(myUrl.hostname);              // example.com
console.log(myUrl.pathname);              // /path
console.log(myUrl.searchParams.get('name')); // taro

npm入門

npm(Node Package Manager)は、Node.jsのパッケージ管理ツールです。 世界中の開発者が公開したライブラリを簡単にインストールして使えます。

# プロジェクトの初期化(package.json を生成)
$ npm init -y

# パッケージのインストール
$ npm install express        # 本番用の依存関係
$ npm install -D nodemon     # 開発用の依存関係(-D = --save-dev)

# グローバルインストール(CLIツール等)
$ npm install -g typescript

# パッケージの削除
$ npm uninstall express

# インストール済みパッケージの更新
$ npm update

# 脆弱性チェック
$ npm audit

package.jsonは プロジェクトの設定ファイルです。依存関係やスクリプトが記録されます。

{
  "name": "my-app",
  "version": "1.0.0",
  "description": "私のNode.jsアプリ",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "dev": "nodemon index.js",
    "test": "jest"
  },
  "dependencies": {
    "express": "^4.18.2"
  },
  "devDependencies": {
    "nodemon": "^3.0.0",
    "jest": "^29.7.0"
  }
}

人気のnpmパッケージ

Node.jsの強みは豊富なエコシステムです。よく使われるパッケージを紹介します。

Webフレームワーク

  • express — 定番のWebフレームワーク
  • fastify — 高速なWebフレームワーク
  • koa — Express作者の新フレームワーク

データベース

  • prisma — モダンなORM
  • mongoose — MongoDB用ODM
  • pg — PostgreSQLクライアント

ユーティリティ

  • dotenv — 環境変数の管理
  • zod — バリデーション
  • dayjs — 日付操作

開発ツール

  • nodemon — ファイル変更時に自動再起動
  • jest — テストフレームワーク
  • eslint — コードの静的解析

まとめ

  • CommonJS(require/module.exports)はNode.jsのデフォルトモジュール形式
  • ESModules(import/export)はモダンなJavaScript標準で、新規プロジェクトに推奨
  • fspathosなどの組み込みモジュールはインストール不要で使える
  • npmでパッケージを管理し、package.jsonで依存関係を記録する
  • node_modulesフォルダにはインストールしたパッケージが保存される(Gitには含めない)