path 模块提供了用来处理目录和文件路径的工具方法。
目前主流的操作系统有 Windows,Mac OS 和 Linux。其中后两者都是类Unix系统,因此他们的文件系统是类似的。这两类系统在处理目录和文件路径时存在一定差异:
- Windows:使用\ 、\作为路径分隔符
- Linux/Mac OS:使用 /作为路径分隔符
如果我们在 Windows 系统上编写了程序,放到 Linux 上去运行,就有可能因为路径而出现问题。
使用 path 模块,帮助处理路径,就能避免这个问题。除了解决因差异化造成的问题,该模块还可以提供了一些常用的封装,比如要获取文件的扩展名,可以调用path.extname方法。
一:path.join
用于拼接路径。
const path = require('path')
// 使用操作系统的路径分隔符,将路径拼接起来
path.join('a', 'b', 'index.js') // a\b\index.js
path.join('/a', 'b', 'index.js') // \a\b\index.js
// 会处理待拼接路径中的关系
path.join('/a', 'b', '..', 'index.js') // \a\index.js
二:path.resolve
返回一个绝对路径。
// 不传参数时,返回 node 命令执行时所在的目录的绝对路径,并非是当前文件模块所在的目录路径。
// 比如在 /a目录下,执行 `node index.js` 则返回 `/a`
// 若是在 /b 目录下,执行 `node /a/index.js`,返回的则是 `/b`
path.resolve()
// 由于上面的特性,在使用该方法时,通常都会加上一个全局变量 __dirname,表示当前目录的绝对路径。
// 这样就能拼接出一个我们想要的路径了
path.resolve(__dirname, 'index.js');
如何区分 join 和 resolve,两个方法都用来解析处理路径:
- join:重点在拼接。将已知的路径拼接成一个标准的路径。
- resolve:重点在绝对路径。将已有的路径处理成一个标准的绝对路径。
三:path.basename
返回路径中的基础名字,也就是最后一个分隔符后面的部分。
如果是目录,则返回目录名。若是文件名,默认返回带扩展名的文件名。通过指定参数 ext 决定是否带扩展名。
// 如果目录后也带分隔符,会被忽略掉
path.basename('src/utils') // utils
path.basename('src/utils/format.js') // format.js
// 通过指定第二个参数,若匹配上,则输出不带后缀的文件名
path.basename('src/utils/format.js', '.js') // format
四:path.dirname
获取路径目录名,也就是路径最后一部分的上级目录路径。
path.dirname('src/utils/format.js') // src/utils
path.dirname('src/utils) // src
五:path.extname
获取路径的扩展名。
path.dirname('src/utils/format.js') // .js
// 如果路径是一个目录
path.dirname('src/utils/) // 返回空
// 如果带有多个扩展名,只获取最后一个
path.dirname('src/utils/format.cjs.js) // .js
六:path.parse
将路径信息转换为一个对象。
path.parse('/root/hello/index.js');
{
root: '/',
dir: '/root/hello',
base: 'index.js',
ext: '.js',
name: 'index'
}
可见,它把我们上面通过 basename,dirname,extename 方法获得的结果就解析好了。
七:path.format
和上一个方法的作用相反,将路径对象转换成路径字符串。
path.format({
root: '/',
dir: '/root/hello',
base: 'index.js',
ext: '.js',
name: 'index'
})
'/root/hello/index.js'