Node.js 運行環境提供三大全局對象,無需 require 即可直接使用。理解它們的差異與用法,是編寫健壯 Node 應用的基石。
類比瀏覽器 window,但關鍵不同:**Node 每個模塊有獨立作用域**,頂層變量不自動掛載到 global。
// module1.js global.varA = "abc"; // 显式掛載到全局 // main.js console.log(global.varA); // "abc" console.log(varA); // ReferenceError: varA is not defined (模塊作用域隔離)
console.log(__dirname); // 當前模塊絕對目錄路徑 console.log(__filename); // 當前模塊絕對文件路徑 // global.process -> 進程對象 (見下文)
module.exports / require 顯式依賴注入提供當前 Node 進程的環境、參數、標準流、生命週期事件。
| 屬性/方法 | 用途 | 示例 |
|---|---|---|
process.env | 環境變量 | process.env.NODE_ENV (development/production) |
process.argv | 命令行參數數組 | [node, script.js, arg1, arg2] |
process.cwd() | 當前工作目錄 | 進程啟動目錄,可能 ≠ __dirname |
process.pid | 進程 ID | 用於日誌標識、鎖文件 |
process.version | Node 版本 | v18.17.0 |
process.platform | 作業系統平台 | linux, darwin, win32 |
process.memoryUsage() | 內存使用詳情 | rss, heapTotal, heapUsed, external |
process.nextTick(cb) | 微任務隊列 | 比 setImmediate 更早執行 |
process.on('exit', (code) => {
console.log('進程即將退出,代碼:', code);
// 僅同步操作,異步代碼不會執行
});
process.on('uncaughtException', (err) => {
console.error('未捕獲異常:', err);
// 生產環境應記錄日誌並優雅退出,而非繼續運行
});
process.on('unhandledRejection', (reason, promise) => {
console.error('未處理的 Promise 拒絕:', reason);
});
封裝 process.stdout / process.stderr,提供多種輸出級別。
console.log('信息', {obj: 1}); // stdout
console.info('提示'); // stdout
console.warn('警告'); // stderr
console.error('錯誤', new Error()); // stderr + 堆棧
console.debug('調試'); // stdout (需 --inspect 啟用)
console.table([{a:1,b:2},{a:3,b:4}]); // 表格輸出
console.time('timer'); console.timeEnd('timer'); // 計時
console.trace('追蹤標記'); // 堆棧追蹤
console.assert(condition, '失敗信息'); // 斷言
# 標準輸出導向文件 node app.js > app.log 2>&1 # 或使用 winston/pino 等專業日誌庫,支援分級、輪轉、結構化 JSON
// calculator.js (反模式)
global.result = 0; // 污染全局
exports.add = (a,b) => global.result = a+b;
// main.js
require('./calculator');
console.log(global.result); // 強耦合、難測試、併發不安全
// calculator.js (正確)
exports.add = (a,b) => a+b;
exports.subtract = (a,b) => a-b;
// main.js
const calc = require('./calculator');
console.log(calc.add(1,2)); // 3 - 顯式依賴、可測試、可替換
| 對象 | 作用域 | 核心職責 | 濫用風險 |
|---|---|---|---|
global | 進程全局 | 極少數真正全局狀態 (如全局錯誤處理器) | 高:命名衝突、隱式依賴、測試地獄 |
process | 進程級 | 環境配置、生命週期、資源監控、信號處理 | 低:主要只讀,謹慎用 exit/kill |
console | 進程級 | 開發調試輸出,生產應替換為專業日誌庫 | 中:阻塞 I/O、無級別控制、難分析 |
Node.js 設計哲學:**顯式優於隱式,模塊化優於全局共享**。善用 require/exports,讓依賴關係清晰可見,是寫出可維護應用的關鍵。