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)); // 20ESModules(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')); // taronpm入門
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 auditpackage.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— モダンなORMmongoose— MongoDB用ODMpg— PostgreSQLクライアント
ユーティリティ
dotenv— 環境変数の管理zod— バリデーションdayjs— 日付操作
開発ツール
nodemon— ファイル変更時に自動再起動jest— テストフレームワークeslint— コードの静的解析
まとめ
- CommonJS(
require/module.exports)はNode.jsのデフォルトモジュール形式 - ESModules(
import/export)はモダンなJavaScript標準で、新規プロジェクトに推奨 fs、path、osなどの組み込みモジュールはインストール不要で使える- npmでパッケージを管理し、
package.jsonで依存関係を記録する node_modulesフォルダにはインストールしたパッケージが保存される(Gitには含めない)