目次
Node.js標準モジュールとは?
標準モジュールの位置づけ
Node.js には、インストールしただけで最初から使えるモジュール群があります。
例:
fs:ファイルシステム(File System)path:パス操作(/foo/barを組み立てたり分解したり)os:OS情報(CPU数、メモリ量、パス区切り記号など)http/https:HTTPサーバ・クライアントcrypto:暗号関連url:URL操作child_process:子プロセス起動(他のコマンド叩く)
など。
これらは 追加インストール(npm install)が不要 で、
const fs = require("fs");
const path = require("path");
const os = require("os");のように require するだけで使えます。
ここでは、Nodeのデフォルト挙動で一番素直に動く CommonJS(require)スタイル で解説します。
fs モジュール:ファイルシステム操作
役割のイメージ
fs はその名の通り、File System(ファイルシステム) を扱うモジュールです。
- ファイルの読み書き
- ディレクトリ(フォルダ)の作成・削除・列挙
- 権限・タイムスタンプなどのメタ情報取得
など、「ローカルのファイルに対するほとんどの操作」をカバーします。
const fs = require("fs");コールバック版 / Promise版 / 同期版
Nodeの歴史的な都合で、fs には3系統のAPIが共存しています。
- コールバック版(古くからある)
fs.readFile("data.txt", "utf8", (err, data) => { if (err) { console.error("読み込み失敗:", err); return; } console.log("読み込み結果:", data); }); - Promise版(
fs/promises)const fsPromises = require("fs/promises"); async function main() { try { const data = await fsPromises.readFile("data.txt", "utf8"); console.log("読み込み結果:", data); } catch (err) { console.error("読み込み失敗:", err); } } main(); - 同期版(
readFileSyncなど)const data = fs.readFileSync("data.txt", "utf8"); console.log("読み込み結果:", data);
ざっくり使い分け:
- サーバなど「他の処理を止めたくない」:
→ コールバック版 or Promise版(fs/promises)を使う - 小さなCLIスクリプトで「単発でサッと処理して終わり」なら同期版もアリ
今回は、async/await が使いやすい Promise版をメインに見ていきます。
代表的な関数(Promise版)
const fs = require("fs/promises");
async function main() {
// 読み込み
const text = await fs.readFile("input.txt", "utf8");
console.log("input.txt:", text);
// 書き込み(存在しなければ新規作成、あれば上書き)
await fs.writeFile("output.txt", "Hello Node.js\n");
// 追記(append)
await fs.appendFile("output.txt", "追記された行\n");
// ファイル・ディレクトリの存在確認をしたい場合は access を使える
try {
await fs.access("output.txt");
console.log("output.txt は存在します");
} catch {
console.log("output.txt は存在しません");
}
// ディレクトリ一覧
const entries = await fs.readdir(".");
console.log("現在のディレクトリ:", entries);
}
main().catch(console.error);よく使うもの:
readFile(path, options):ファイル全体を読み込むwriteFile(path, data, options):ファイルを書き込む(上書き)appendFile(path, data, options):追記readdir(path):ディレクトリ内のファイル名一覧mkdir(path, options):ディレクトリ作成(recursive: trueで階層ごと作成 など)stat(path):サイズや更新時刻などのメタ情報
path モジュール:パス操作
役割
path は「パス文字列を組む・分解する」ためのモジュールです。
- OSごとの区切り記号(Windowsは
\、Unix系は/)を意識せず書ける "foo", "bar", "baz.txt"を安全に連結- パスからファイル名・拡張子・親ディレクトリだけ抜き出す
const path = require("path");よく使う関数
const path = require("path");
// join: セグメントを結合(余計な/をうまく解決)
const p1 = path.join("user", "data", "file.txt");
console.log(p1); // 例: "user/data/file.txt"(OSに応じた区切り)
// resolve: 絶対パスに解決する
const p2 = path.resolve("data", "file.txt");
console.log(p2); // 例: "C:\\project\\data\\file.txt" 的な絶対パス
// dirname / basename / extname
const filePath = "/user/data/file.txt";
console.log(path.dirname(filePath)); // "/user/data"
console.log(path.basename(filePath)); // "file.txt"
console.log(path.extname(filePath)); // ".txt"
// parse: まとめて分解
console.log(path.parse(filePath));
// { root: '/', dir: '/user/data', base: 'file.txt', ext: '.txt', name: 'file' }__dirname と組み合わせる
CommonJS(require)では、モジュールファイルのディレクトリが __dirname に入ります。
const path = require("path");
const filePath = path.join(__dirname, "data", "input.txt");
console.log(filePath);- 「このファイル(スクリプト)からの相対パス」でファイルを扱いたいときの基本パターン
- CLIスクリプトを配布する場合などに多用します
(ESM 環境だと __dirname は直接使えず、import.meta.url を加工する必要があります)
os モジュール:OS情報の取得
役割
os は名前の通り Operating System(OS)関連の情報 を取得するモジュールです。
const os = require("os");よく使うもの:
os.platform():"win32","linux","darwin"(macOS)などos.type():OSの種別(”Windows_NT” など)os.homedir():ホームディレクトリ(/Users/xxxやC:\Users\xxx)os.tmpdir():一時ディレクトリos.cpus():CPUコア情報(配列)os.totalmem()/os.freemem():メモリ量(バイト単位)os.EOL:改行コード(Windowsなら\r\n、他は\n)
例:OSごとにパスや設定を変えたいとき
const os = require("os");
const path = require("path");
const home = os.homedir();
const configPath = path.join(home, ".myappconfig.json");
console.log("設定ファイルの場所:", configPath);- Windows でも macOS でも Linux でも、「ユーザーのホーム配下に置きたい」ときなどに便利
- 改行コードを明示的に合わせたいときも
os.EOLが使えます
環境変数の扱い(process.env)
process.env の基本
Node.js では、環境変数は process.env に入っています。
// node script.js を実行する前に
// API_KEY=xxxx node script.js
// のように環境変数を与えると...
console.log(process.env.API_KEY);process.envは「文字列だけが入ったオブジェクト」- 存在しないキーを参照すると
undefined
環境変数を使う典型パターン
設定値・秘密情報をコードから分離する
const apiKey = process.env.API_KEY;
if (!apiKey) {
console.error("環境変数 API_KEY が設定されていません");
process.exit(1);
}
console.log("APIキーは取得できました(実際にはログに出さない)");.envファイル+dotenvライブラリと組み合わせるのが実戦では一般的ですが、
まずは 「機密情報は環境変数から読む」 という発想だけ押さえておけばOKです。
実行モードの切り替え
const mode = process.env.NODE_ENV || "development";
if (mode === "production") {
console.log("本番モードで動作");
} else {
console.log("開発モードで動作");
}- ビルドツールやWebアプリの多くが、
NODE_ENVを見て挙動を変えています。
簡単なファイル操作スクリプト例
ここまでの fs / path / process.env を組み合わせて、
「テキストファイルを読み込んで、別ファイルに変換して書き出す」 例をイメージしてみます。
行番号付きで別ファイルに出力するCLI
// addLineNumber.js
const fs = require("fs/promises");
const path = require("path");
async function main() {
const args = process.argv.slice(2);
const inputPath = args[0];
if (!inputPath) {
console.error("使い方: node addLineNumber.js <入力ファイルパス>");
process.exit(1);
}
// 絶対パスに解決
const absInput = path.resolve(inputPath);
// 読み込み
const text = await fs.readFile(absInput, "utf8");
// 行ごとに分割して行番号を付与
const lines = text.split(/\r?\n/);
const numbered = lines
.map((line, index) => `${index + 1}: ${line}`)
.join("\n");
// 出力ファイルパス(例: input.txt → input.numbered.txt)
const dir = path.dirname(absInput);
const base = path.basename(absInput);
const outputPath = path.join(dir, base + ".numbered.txt");
// 書き込み
await fs.writeFile(outputPath, numbered, "utf8");
console.log("出力しました:", outputPath);
}
main().catch((err) => {
console.error("エラー:", err);
process.exit(1);
});実行イメージ:
node addLineNumber.js sample.txt
# => sample.txt.numbered.txt が作られるここまで来ると、
fsでファイルI/Opathでパス組み立てprocess.argvで引数処理async/awaitで非同期処理
が自然に組み合わさって、「実用っぽいツールを自作するイメージ」がかなりクリアになるはずです。
CommonJS と ES Modules でのインポート比較
CommonJS(デフォルト)
// commonjs.js
const fs = require("fs");
const fsPromises = require("fs/promises");
const path = require("path");
const os = require("os");- 何も設定していない普通の
node script.jsは、.jsを CommonJS として解釈します。
ES Modules(type: "module" or .mjs)
package.json に:
{
"type": "module"
}と書いた上で:
// esm.js
import fs from "fs";
import fsPromises from "fs/promises";
import path from "path";
import os from "os";- または、
import { readFile } from "fs/promises";など
今の時点では:
- 「Nodeの標準モジュールは、
requireでもimportでも使える」 - ただし プロジェクト設定次第でどちらが正しいか変わる
(既存プロジェクトに合わせる)
くらいの理解で十分です。
コメント