Node.js Util 模組:核心開發者必備的輔助工具箱

Node.js 的 util 模組是一個大雜燴式的工具箱,裡面存放了許多內部使用的輔助函式。雖然它不像 fshttp 那麼常被放在第一線,但在除錯、格式化字串與特定邏輯開發時,它能省下你不少寫髒 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 等)。

總結

  1. util.inspect 是除錯時最好的朋友。
  2. isDeepStrictEqual 解決了繁瑣的物件比對問題。
  3. parseArgs 讓編寫小型系統腳本變得更輕鬆且無依賴。