[JavaScript講座] Node.js標準モジュール

当ページのリンクには広告が含まれています。
目次

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が共存しています。

  1. コールバック版(古くからある) fs.readFile("data.txt", "utf8", (err, data) => { if (err) { console.error("読み込み失敗:", err); return; } console.log("読み込み結果:", data); });
  2. Promise版(fs/promisesconst 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();
  3. 同期版(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/xxxC:\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/O
  • path でパス組み立て
  • 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 でも使える」
  • ただし プロジェクト設定次第でどちらが正しいか変わる
    (既存プロジェクトに合わせる)

くらいの理解で十分です。


<<前へ(Node.jsの基本)

>>次へ(イテレータ・ジェネレータ)

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次