前言
上文讲解了 Node.js 的 CommonJS 规范,它主要用来解决模块化的问题。从本文开始将会介绍 Node.js 常用的模块,包括内置模块以及好用,好玩的第三方模块。
本篇简单介绍下 path
模块的用法。
path 模块
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'
path.normalize
将路径格式化为符合当前操作平台的正常的路径。
path.normalize('/a\\b///c/d'); // \a\b\c\d
path.isAbsolute
判断路径是否是绝对路径。返回一个布尔值。
path.isAbsolute('/root'); true
path.isAbsolute('./root'); false
path.sep
获取平台的文件路径分隔符。
path.sep; // win: '\' linux: '/'
path.delimiter
获取平台的分隔符。
path.delimiter) // win: ';' linux: ':'
小结
本篇总结了一些 path
模块的常用方法。其中最常用的就是 path.join
和 path.resolve
了。还有一些不常用的,也无需特意去记忆,在用到的时候去查阅官方文档就行了。