天天看点

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。这两种接口,在处理跨平台的文件路径时候,有很大作用。