Node.js util モジュール
Node.js におけるutilモジュールはコアモジュールであり、一連の実用ツール関数を提供します。これらの関数は主に、型チェック、継承の実装、デバッグ出力など、開発者が一般的なプログラミングタスクを完了するのを支援するために使用されます。utilモジュールの設計当初の目的は、JavaScript のネイティブ機能の不足を補い、開発者により多くの利便性を提供することです。
使用するにはutilモジュールは、コード内でそれを導入するだけで済みます:
const util = require('util');
util モジュールの主な機能
1. 型チェックツール
utilモジュールは型チェック用の関数をいくつか提供します。これらの関数は JavaScript のネイティブなtypeof演算子よりも正確で有用です。
util.types.isArrayBuffer(value)
指定された値が ArrayBuffer インスタンスであるかどうかを確認します。
例
console.log(util.types.isArrayBuffer(arrBuffer)); // true
console.log(util.types.isArrayBuffer([])); // false
util.types.isDate(value)
指定された値が Date インスタンスであるかどうかを確認します。
例
console.log(util.types.isDate('2023-01-01')); // false
2. 実用ツール関数
util.format(format[, ...args])
C言語の~のようなprintf関数、文字列をフォーマットするために使われる。
例
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])
オブジェクトの文字列表現を返し、主にデバッグに使用されます。深さや色などのオプションを設定できます。
例
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 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 を返す関数をコールバックスタイルの関数に変換します。
例
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キーワード。
例
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より強力です:
例
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の出力を変更できます:
例
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
注意事項
- パフォーマンスに関する考慮事項:
util.inspect大きなオブジェクトに対してはパフォーマンスに影響を与える可能性があるため、本番環境では注意して使用する必要があります。 - API の安定性:ただし
utilモジュールはコアモジュールですが、一部の API は依然として実験的機能としてマークされる場合があります。 - 現代の代替案:一部の機能(例えば
util.inherits)は現代の JavaScript においてより良い代替案があります(例えばclass構文)。 - エラー処理:~を使用する
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 開発をよりスムーズに行うことができます。