Node.js util モジュール

Node.js 組み込みモジュール


Node.js におけるutilモジュールはコアモジュールであり、一連の実用ツール関数を提供します。これらの関数は主に、型チェック、継承の実装、デバッグ出力など、開発者が一般的なプログラミングタスクを完了するのを支援するために使用されます。utilモジュールの設計当初の目的は、JavaScript のネイティブ機能の不足を補い、開発者により多くの利便性を提供することです。

使用するにはutilモジュールは、コード内でそれを導入するだけで済みます:

const util = require('util');

util モジュールの主な機能

1. 型チェックツール

utilモジュールは型チェック用の関数をいくつか提供します。これらの関数は JavaScript のネイティブなtypeof演算子よりも正確で有用です。

util.types.isArrayBuffer(value)

指定された値が ArrayBuffer インスタンスであるかどうかを確認します。

例

const arrBuffer = new ArrayBuffer(8);
console.log(util.types.isArrayBuffer(arrBuffer)); // true
console.log(util.types.isArrayBuffer([])); // false

util.types.isDate(value)

指定された値が Date インスタンスであるかどうかを確認します。

例

console.log(util.types.isDate(new Date())); // true
console.log(util.types.isDate('2023-01-01')); // false

2. 実用ツール関数

util.format(format[, ...args])

C言語の~のようなprintf関数、文字列をフォーマットするために使われる。

例

const name = 'John';
const age = 30;
console.log(util.format('My name is %s and I am %d years old', name, age));
// 出力: My name is John and I am 30 years old

util.inspect(object[, options])

オブジェクトの文字列表現を返し、主にデバッグに使用されます。深さや色などのオプションを設定できます。

例

const obj = {
  name: 'Alice',
  details: {
    age: 25,
    hobbies: ['reading', 'coding']
  }
};

console.log(util.inspect(obj, { depth: 2, colors: true }));

3. コールバックスタイルの変換

util.promisify(original)

Node.js のコールバックスタイルに従う関数を、Promise を返す関数に変換します。

例

const fs = require('fs');
const readFile = util.promisify(fs.readFile);

async function readConfig() {
  try {
    const data = await readFile('config.json', 'utf8');
    console.log(data);
  } catch (err) {
    console.error('Error reading file:', err);
  }
}

readConfig();

util.callbackify(original)

とpromisify逆に、Promise を返す関数をコールバックスタイルの関数に変換します。

例

async function asyncFunc() {
  return 'Hello World';
}

const callbackFunc = util.callbackify(asyncFunc);

callbackFunc((err, result) => {
  if (err) throw err;
  console.log(result); // Hello World
});

4. 継承ツール

util.inherits(constructor, superConstructor)

プロトタイプ継承(ES5 スタイル)を実装します。注意:ES6 では、~を使用することを推奨しますclassとextendsキーワード。

例

function Animal(name) {
  this.name = name;
}

Animal.prototype.speak = function() {
  console.log(this.name + ' makes a noise.');
};

function Dog(name) {
  Animal.call(this, name);
}

util.inherits(Dog, Animal);

Dog.prototype.speak = function() {
  console.log(this.name + ' barks.');
};

const d = new Dog('Rex');
d.speak(); // Rex barks.

util モジュールの実際の適用シナリオ

1. 複雑なオブジェクトのデバッグ

複雑なオブジェクトの構造を出力する必要があるとき、util.inspect単純なconsole.logより強力です:

例

const complexObj = {
  date: new Date(),
  regex: /test/g,
  nested: {
    array: [1, 2, 3],
    fn: function() {}
  }
};

console.log(util.inspect(complexObj, {
  showHidden: true,
  depth: null,
  colors: true
}));

2. 旧コードのモダナイゼーション

コールバックスタイルの旧コードを Promise スタイルに変換します:

例

// 古いコールバックスタイルのコード
function oldStyleFunc(param, callback) {
  // いくつかの非同期操作
  setTimeout(() => {
    callback(null, `Result for ${param}`);
  }, 100);
}

// Promise スタイルに変換
const newStyleFunc = util.promisify(oldStyleFunc);

async function useNewStyle() {
  const result = await newStyleFunc('test');
  console.log(result); // Result for test
}

useNewStyle();

3. カスタムオブジェクト検査

オブジェクトのinspectメソッドをカスタマイズし、util.inspectの出力を変更できます:

例

class CustomObject {
  constructor(value) {
    this.value = value;
  }
 
  [util.inspect.custom](depth, options) {
    return `CustomObject: ${this.value}`;
  }
}

const obj = new CustomObject('test');
console.log(util.inspect(obj)); // CustomObject: test

注意事項

  1. パフォーマンスに関する考慮事項:util.inspect大きなオブジェクトに対してはパフォーマンスに影響を与える可能性があるため、本番環境では注意して使用する必要があります。
  2. API の安定性:ただしutilモジュールはコアモジュールですが、一部の API は依然として実験的機能としてマークされる場合があります。
  3. 現代の代替案:一部の機能(例えばutil.inherits)は現代の JavaScript においてより良い代替案があります(例えばclass構文)。
  4. エラー処理:~を使用するpromisifyときは、エラーを正しく処理し、キャッチされない Promise 拒否を避けるようにしてください。

メソッドとプロパティ

メソッド/プロパティ 説明 バージョン導入
util.callbackify(original) Promise を返す async 関数をコールバックスタイルの関数に変換します 8.2.0
util.debuglog(section) NODE_DEBUG 環境変数が指定されたセクションを含む場合にのみメッセージを記録する関数を作成します 0.11.3
util.deprecate(fn, msg[, code]) 関数をラップして、呼び出されたときに非推奨の警告を発するようにします 0.8.0
util.format(format[, ...args]) 最初の引数を printf に似たフォーマット文字列として使用して文字列をフォーマットします 0.5.3
util.formatWithOptions(inspectOptions, format[, ...args]) util.format() に似ていますが、inspect オプションを受け付けます 10.0.0
util.getSystemErrorName(err) エラーコード err によって表されるシステムエラー名を返します 9.7.0
util.inherits(constructor, superConstructor) あるコンストラクタのプロトタイプメソッドを別のコンストラクタに継承します(非推奨。ES6 の class と extends を使用することをお勧めします) 0.3.0
util.inspect(object[, options]) object の文字列表現を返し、デバッグに使用します 0.3.0
util.isDeepStrictEqual(val1, val2) 2 つの値が深い厳密等価であるかどうかをテストします 9.0.0
util.promisify(original) コールバックスタイルの関数を Promise を返す関数に変換します 8.0.0
util.stripVTControlCharacters(str) 文字列から ANSI エスケープコードを除去します 16.11.0
util.TextDecoder WHATWG 標準の TextDecoder 実装のエイリアス 8.3.0
util.TextEncoder WHATWG 標準の TextEncoder 実装のエイリアス 8.3.0
util.types さまざまな Node.js 型チェックを提供するツールオブジェクト 10.0.0
util.aborted(err, signal) エラーが中止シグナルによって引き起こされたかどうかを確認します 18.18.0
util.parseArgs([config]) コマンドライン引数を解析するツール関数 18.3.0

util.types が提供するメソッド

メソッド 説明
util.types.isAnyArrayBuffer(value) AnyArrayBuffer インスタンスであるかどうかを確認します
util.types.isArrayBuffer(value) ArrayBuffer インスタンスであるかどうかを確認します
util.types.isAsyncFunction(value) 非同期関数(async function)であるかどうかを確認します
util.types.isBigInt64Array(value) BigInt64Array インスタンスであるかどうかを確認します
util.types.isBigUint64Array(value) BigUint64Array インスタンスであるかどうかを確認します
util.types.isBooleanObject(value) Boolean オブジェクトであるかどうかを確認します
util.types.isBoxedPrimitive(value) ボックス化されたプリミティブ型であるかどうかを確認します
util.types.isCryptoKey(value) CryptoKey インスタンスであるかどうかを確認します
util.types.isDataView(value) DataView インスタンスであるかどうかを確認します
util.types.isDate(value) Date インスタンスであるかどうかを確認します
util.types.isExternal(value) 外部のネイティブ値であるかどうかを確認します
util.types.isFloat32Array(value) Float32Array インスタンスであるかどうかを確認します
util.types.isFloat64Array(value) Float64Array インスタンスであるかどうかを確認します
util.types.isGeneratorFunction(value) ジェネレータ関数であるかどうかを確認します
util.types.isGeneratorObject(value) ジェネレータオブジェクトであるかどうかを確認します
util.types.isInt8Array(value) Int8Array インスタンスであるかどうかを確認します
util.types.isInt16Array(value) Int16Array インスタンスであるかどうかを確認します
util.types.isInt32Array(value) Int32Array インスタンスであるかどうかを確認します
util.types.isMap(value) Map インスタンスであるかどうかを確認します
util.types.isMapIterator(value) Map イテレータであるかどうかを確認します
util.types.isModuleNamespaceObject(value) モジュール名前空間オブジェクトであるかどうかを確認します
util.types.isNativeError(value) ネイティブエラーオブジェクトであるかどうかを確認します
util.types.isNumberObject(value) Number オブジェクトであるかどうかを確認します
util.types.isPromise(value) Promise であるかどうかを確認します
util.types.isProxy(value) Proxy オブジェクトであるかどうかを確認します
util.types.isRegExp(value) RegExp オブジェクトであるかどうかを確認します
util.types.isSet(value) Set インスタンスであるかどうかを確認します
util.types.isSetIterator(value) Set イテレータであるかどうかを確認します
util.types.isSharedArrayBuffer(value) SharedArrayBuffer インスタンスであるかどうかを確認します
util.types.isStringObject(value) String オブジェクトであるかどうかを確認します
util.types.isSymbolObject(value) Symbol オブジェクトであるかどうかを確認します
util.types.isTypedArray(value) TypedArray インスタンスであるかどうかを確認します
util.types.isUint8Array(value) Uint8Array インスタンスであるかどうかを確認します
util.types.isUint8ClampedArray(value) Uint8ClampedArray インスタンスであるかどうかを確認します
util.types.isUint16Array(value) Uint16Array インスタンスであるかどうかを確認します
util.types.isUint32Array(value) Uint32Array インスタンスであるかどうかを確認します
util.types.isWeakMap(value) WeakMap インスタンスであるかどうかを確認します
util.types.isWeakSet(value) WeakSet インスタンスであるかどうかを確認します

まとめ

Node.js のutilモジュールは多くの実用的なツール関数を提供し、開発者がより効率的にコードを書くのを助けます。型チェックから非同期フロー制御、デバッグ出力に至るまで、utilモジュールは開発における多くの一般的なニーズをカバーしています。現代の JavaScript はすでに多くのネイティブソリューションを提供していますが、utilモジュールは依然として多くのシナリオで非常に有用です。特に、レガシーコードを扱う場合や特定のツール関数が必要な場合に役立ちます。

習得utilモジュールの使用を習得すると、特にデバッグやコード変換の面で、Node.js 開発をよりスムーズに行うことができます。

Node.js 組み込みモジュール