概述
读了 path
模块的文档,研究了几个有意思的问题:
- 🤔️ 路径片段分隔符 vs 路径定界符
- 🤔️
path.join()
vspath.resolve()
- 🤔️ Windows vs Posix
路径片段分隔符 vs 路径定界符
path.sep
,是路径片段分隔符。它在 Windows 上是\
,在 Unix 上是/
。它用于指定文件(夹)的路径中。
path.delimiter
,是路径定界符。它在 Windows 上是 ;
,在 Unix 上是:
。它用于分割多个路径。因为在系统变量里,多个路径是被拼接为一个字符串存储(不是数组集合)。
例如,如果想获取所有可执行程序的搜索路径,代码如下:
1 | const path = require("path"); |
path.join()
vs path.resolve()
两者的相同点是:都会使用系统的分隔符将“路径片段”进行拼接。
两者的不同点在于:path.join()
只是拼接路径,**path.resolve()
******** 会将拼接好的路径转换成绝对路径**。
1 | const path = require("path"); |
上面这段代码的的结果是:
1 | 工作目录是: /Users/yuanxindong/Desktop/articles/xxoo521 |
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。代码如下:
1 | const path = require("path"); |
对比结果,第一种是错误的,因为本机是 mac。这两种接口,在处理跨平台的文件路径时候,有很大作用。