Node.js Util 模組:核心開發者必備的輔助工具箱
Node.js 的 util 模組是一個大雜燴式的工具箱,裡面存放了許多內部使用的輔助函式。雖然它不像 fs 或 http 那麼常被放在第一線,但在除錯、格式化字串與特定邏輯開發時,它能省下你不少寫髒 code 的時間。
深度除錯:util.inspect()
當你有一個複雜、深層且可能包含自引用(Circular Reference)的物件時,console.log 的預設輸出往往會被截斷(顯示 [Object])。inspect 可以幫你完整展開。
const util = require('util');
const complexData = {
user: { name: 'Mike', tags: ['node', 'backend'] },
metadata: { timestamp: new Date(), version: '1.0.0' },
};
// colors: 開啟終端機著色, depth: null 代表不限深度全部展開
console.log(util.inspect(complexData, { colors: true, depth: null }));
精準字串格式化:util.format()
如果你懷念 C 語言的 printf,那這就是你的救星。它支援佔位符替換,產生可讀性極高的字串。
// %s: 字串, %d: 數字, %j: JSON
const greeting = util.format('哈囉 %s!歡迎來到 v%d 的世界。', 'Node.js', 22);
console.log(greeting); // 哈囉 Node.js!歡迎來到 v22 的世界。
深度相等判斷:util.isDeepStrictEqual()
在原生 JS 中,兩個內容相同但記憶體位址不同的物件並不相等({} === {} 為 false)。當你需要遞迴比對整個物件樹的內容時,請直接使用這個內建方法,不再需要載入外部套件如 Lodash。
const objA = { x: 1, y: { z: 2 } };
const objB = { x: 1, y: { z: 2 } };
console.log(util.isDeepStrictEqual(objA, objB)); // true
現代 CLI 參數解析:util.parseArgs()
在 Node.js 18.3+ 中,官方終於內建了輕量級的命令行參數解析工具,讓你不用再依賴 yargs 或 commander 來處理簡單的 flag。
const { parseArgs } = require('util');
const options = {
port: { type: 'string', short: 'p' },
verbose: { type: 'boolean' },
};
const { values } = parseArgs({ options });
console.log(values.port); // node app.js -p 8080 -> 8080
模組橋接:promisify 與 callbackify
這又是銜接新舊非同步標準的關鍵工具:
util.promisify():將 Error-First Callback 函數轉為 Promise 風格。util.callbackify():將現代 Promise 函數轉回 Callback 風格。
廢棄提醒與現代替代方案
隨者 JavaScript 標準的進化,util 模組中有些舊方法已被標記為 Deprecated(即將廢棄),請優先改用原生方式:
- ❌
util.isArray(arr)-> ✅Array.isArray(arr) - ❌
util.isRegExp(re)-> ✅re instanceof RegExp - ❌
util.isDate(d)-> ✅d instanceof Date
util 模組中還有一個 util.types 子模組,提供了更精確的內建對象類型檢測(如 isPromise, isAsyncFunction 等)。總結
util.inspect是除錯時最好的朋友。isDeepStrictEqual解決了繁瑣的物件比對問題。parseArgs讓編寫小型系統腳本變得更輕鬆且無依賴。