
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.3.8 路径
编写命令行相关模块代码时几乎离不开对路径的处理:首先要获取当前文件和目录所在位置,还要获取当前终端执行路径,另外要获取当前系统用户主目录。
当前文件和目录所在位置
__dirname表示当前文件的所在位置,在一个模块中,它属于“全局”变量。dirname表示行代码所在的路径。《狼书(卷1)》中讲过Node.js模板定义,涉及__dirname的用法,示例如下。

上面代码中的参数是在模块加载之前注入的全局变量,可以在代码中随意使用。也就是说,我们可以在任意地方使用__dirname和__filename。

之所以要讲__dirname和__filename,主要是因为,要想获取安装后的文件目录,这是最好的方式。在express-generator源码中,通过path.join(__dirname,'..','templates')来确定项目模板目录的所在位置,是一个非常典型的做法。
当前终端执行路径
获取当前终端执行路径时,可以使用process.cwd()方法,代码如下。

这个Node.js内置的API和Linux里的pwd命令是一样的,非常常用。
当前系统用户主目录
获取当前系统用户主目录的方法很简单,主要是通过环境变量进行判断,代码如下。

除了上述方法,还可以使用os-homedir这样的Node.js模块,该模块可以兼容所有操作系统。os-homedir模块的核心是针对不同操作系统给出不同的实现代码,示例如下。


使用系统用户主目录的好处是,我们不需要在意缓存存储的相对位置,因为只要系统用户不变,缓存的目录位置就是固定的。这一点在多个项目共用缓存时是非常便利的。笔者曾经编写过MongoDB的启动脚本,实现全局启动时用的就是系统用户主目录。