此前一直保留着一个错误的认知:node执行的层级不同,但是执行相同一份脚本,结果是相同的。
然而实际上:在不同的目录层级下,执行相同的一份脚本,其结果不一定相同。它取决于你在这份脚本中,是否使用了一些相对路径;如果使用了相对路径,那么你可能要注意执行的位置。
一、错误示范
假设我们的文件夹目录结构是下面这样的:
├─ example
│ ├─ bat.js
│ └─ dir
│ ├─ server.js
│ └─ test.md
我们的 bat.js 内容
const fs = require('fs')
fs.readFile('./dir/test.md', 'utf-8', (err, data) => {
console.log(err)
if (err) return
console.log('data', data)
})
- 执行方式一
cd example
node bat.js
结果:
- 执行方式二
node example/bat.js
结果:
二、结论 & 解决方案
显而易见的是,当我们的脚本使用了相对路径的时候;程序执行的结果与我们的层级是相关的。
但是,如同我们对需求文档的追求一样,我们希望需求是明确的,不希望对一份需求能够作出两种不同的解释。
所以,我们也希望我们程序的执行是完全如同我们所预期的,它不会因为执行环境的变化而产生不同。
解决方法是,我们使用绝对路径(如果使用了相对路径的,我们也想办法让它变成绝对路径)。
三、其他node路径相关API
process.cwd() — 当前入口脚本的目录
在哪个位置执行脚本,则返回脚本所在的位置
bat.js
console.log(process.cwd())
__dirname — 绝对路径,当前文件所在目录
__filename — 绝对路径,当前文件所在目录+文件本身
可以发现,我们在不同的执行位置下,得出的结果是相同的。 很多时候,我们要的就是这种效果。
path.resolve — 用于拼接路径,最后得到绝对路径。
如果根据参数无法得到绝对路径,则会以当前执行路径为基础拼接。
通常我们配合 __dirname 使用,这样通常都能得到合理的绝对路径。
可以看到,仅仅只凭 ‘,/‘ 来拼接绝对路径,还是不行的。我们需要一个绝对的路径帮我们定位。