天天看點

NodeJS子產品研究 - path

讀了

path

子產品的文檔,研究了幾個有意思的問題:

  • ?️ 路徑片段分隔符 vs 路徑定界符
  • ?️

    path.join()

    vs

    path.resolve()

  • ?️ Windows vs Posix
引用/轉載 請聲明出處:原文連結: xxoo521.com

路徑片段分隔符 vs 路徑定界符

path.sep

,是路徑片段分隔符。它在 Windows 上是

\

,在 Unix 上是

/

。它用于指定檔案(夾)的路徑中。

path.delimiter

,是路徑定界符。它在 Windows 上是

;

,在 Unix 上是

:

。它用于分割多個路徑。因為在系統變量裡,多個路徑是被拼接為一個字元串存儲(不是數組集合)。

例如,如果想擷取所有可執行程式的搜尋路徑,代碼如下:

const path = require("path");

/**
 * @return {string[]}
 */
function getAllPaths() {
    const paths = process.env.PATH.split(path.delimiter);
    return paths;
}           

複制

path.join()

vs

path.resolve()

兩者的相同點是:都會使用系統的分隔符将“路徑片段”進行拼接。

兩者的不同點在于:

path.join()

隻是拼接路徑,

path.resolve()

會将拼接好的路徑轉換成絕對路徑。

const path = require("path");

console.log("工作目錄是:", process.cwd());
console.log("目前工作目錄下的tmp.js路徑", path.join(".", "tmp.js"));
console.log("目前工作目錄下的tmp.js絕對路徑", path.resolve(".", "tmp.js"));           

複制

上面這段代碼的的結果是:

工作目錄是: /Users/yuanxindong/Desktop/articles/xxoo521
目前工作目錄下的tmp.js路徑 tmp.js
目前工作目錄下的tmp.js絕對路徑 /Users/yuanxindong/Desktop/articles/xxoo521/tmp.js           

複制

Windows vs Posix

POSIX: Portable Operating System Interface,可移植作業系統接口。是 IEEE 為要在各種 UNIX 作業系統上運作軟體,而定義 API 的一系列互相關聯的标準的總稱。Linux 基本實作 POSIX 相容,Windows 部分實作。(來源:維基百科:可移植作業系統接口)

Posix 的主要目的是在源碼層面提供給開發者統一的作業系統 API。它本身是一個規範,但是系統沒保證一定落實(類似 ES6 規範和 IE 的關系)。

由于在 Windows 和 Posix 上,針對 path 的一些規範不相同(例如分隔符),是以相同的 api+相同的參數,在兩種平台上的調用結果可能不一樣。

為了解決這個問題,nodejs 也提供了

path.win32

path.posix

來解決這個問題。

例如,我在我的 mac 上想解析一段 windows 路徑格式的資料,拿到它的 basename。代碼如下:

const path = require("path");

console.log(path.basename("C:\\temp\\myfile.html")); // output: C:\temp\myfile.html
console.log(path.win32.basename("C:\\temp\\myfile.html")); // output: myfile.html           

複制

對比結果,第一種是錯誤的,因為本機是 mac。這兩種接口,在處理跨平台的檔案路徑時候,有很大作用。