Node.js Path 模組:跨平台檔案路徑處理專家

如果你正在開發需要頻繁讀寫檔案的應用,絕對要避免手動用字串拼接路徑(例如 dir + '/' + file)。因為不同作業系統對路徑的定義不同:Windows 使用反斜線 \,而 Linux/macOS 使用斜線 /。使用內建的 path 模組能確保你的程式在任何環境下都能正常運作。

拼接路徑:join vs resolve

這兩個函式最容易被混淆,是開發者必須弄懂的核心區別:

1. path.join([...paths])

純粹的拼接。它會根據目前的作業系統自動選擇正確的分隔符,將所有片段連在一起,並修復多餘的斜線。

const path = require('path');
const result = path.join('/users', 'mike', 'docs', 'js.md');
// 輸出: '/users/mike/docs/js.md' (POSIX)

2. path.resolve([...paths])

絕對路徑解析。它會把你傳入的路徑片段「從右到左」處理,直到湊出一個完整的絕對路徑為止。如果最後仍是相對路徑,它會自動補上當前工作目錄。

// 假設你在 /home/project 目錄下執行
console.log(path.resolve('src', 'app.js'));
// 輸出: '/home/project/src/app.js'

拆解路徑獲取資訊

當你拿到一段完整路徑時,可以精確地提取各個組成部分:

const fullPath = '/var/www/site/index.html';

path.dirname(fullPath); // '/var/www/site' (父目錄)
path.basename(fullPath); // 'index.html' (檔名)
path.extname(fullPath); // '.html' (副檔名)
path.basename(fullPath, '.html'); // 'index' (不含副檔名)

萬能解析工具:path.parse()

如果你需要一次獲取所有資訊,parse() 是效率最高的選擇:

const info = path.parse('/home/user/notes.txt');
/*
{
  root: '/',
  dir: '/home/user',
  base: 'notes.txt',
  ext: '.txt',
  name: 'notes'
}
*/
// 反向操作:path.format(info) 會將其轉回字串

實用進階工具

  • path.normalize(path):清理路徑中多餘的 ... 以及重複的斜線。
  • path.relative(from, to):計算從 A 目錄到 B 目錄的相對路徑距離。
  • path.isAbsolute(path):快速檢查給定路徑是否為絕對路覽。

跨平台識別常數

  • path.sep:獲取當前作業系統的路徑分隔符(Windows 是 \,Unix 是 /)。
  • path.delimiter:環境變數的分隔符(Windows 是 ;,Unix 是 :)。

實戰最佳實務:定位專案資源

在 Node.js 中,最安全、最標準的定位方式是結合 __dirname

// 保證不管開發者在什麼路徑啟動程式,都能準確找到專案根目錄下的 assets
const assetPath = path.join(__dirname, '..', 'assets', 'logo.png');
ESM 環境提醒:在 ES Modules 中不支援 __dirname。請參考 CommonJS vs ESM 章節來獲取路徑設定的替代方案。

總結

  1. 永遠使用 path.join 進行路徑組合。
  2. 開發跨平台應用時,避免在程式碼中寫死 /\
  3. 利用 path.resolve 確保你的檔案路徑一定是穩定且唯一的絕對地址。