在 Node.js 開發中,經常需要在腳本內部獲取該腳本文件所在的絕對路徑。特別是當腳本被其他模組 require 時,工作目錄可能發生變化,導致相對路徑不可靠。本文介紹兩種核心方法:__dirname 與 path.resolve() 的組合使用。
Node.js 提供了全局變量 __dirname,它總是指向當前正在執行的腳本文件所在的目錄絕對路徑。配合 path 模組的 resolve() 方法,可以安全地構建目標文件路徑。
const fs = require('fs');
const path = require('path');
// 獲取腳本所在目錄下的 settings.json 絕對路徑
const configPath = path.resolve(__dirname, 'settings.json');
fs.readFile(configPath, 'utf-8', (err, data) => {
if (err) {
console.error('讀取配置失敗:', err);
return;
}
console.log('配置內容:', data);
});
process.cwd() 或 argvprocess.cwd() 返回的是進程啟動時的工作目錄,若在其他目錄下執行 node /path/to/script.js,結果會不一致。process.argv[1] 雖能獲取入口腳本路徑,但在模組被 require 時不可靠,且無法處理符號鏈接。在 .mjs 或 "type": "module" 環境中,__dirname 不可用,可使用 import.meta.url 替代:
import { fileURLToPath } from 'url';
import { dirname, resolve } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const configPath = resolve(__dirname, 'settings.json');
path.resolve(__dirname, 'relative/path') 構建資源路徑。掌握這些技巧,能讓你的 Node.js 應用在部署、遷移、模組化引用時更加健壯可靠。