以下调用之间是否存在一些差异?
path.join(__dirname, 'app')
与
path.resolve(__dirname, 'app')
应该首选哪一个?
这两个函数以非常不同的方式处理以/
开头的段; join
将它与前一个参数连接起来,但resolve
会将其视为根目录,并忽略所有先前的路径 - 将其视为每个参数执行cd
的结果:
path.join('/a', '/b') // Outputs '/a/b'
path.resolve('/a', '/b') // Outputs '/b'
另外需要注意的是,path.resolve
将始终生成绝对URL,并将使用您的工作目录作为基础来解析此路径。但是因为__dirname
无论如何都是绝对的路径,这在你的情况下并不重要。
至于你应该使用哪一个,答案是:它取决于你想要从/
开始的段如何表现 - 它们应该简单地加入还是它们应该作为新根?
如果其他参数是硬编码的,那么实际上并不重要,在这种情况下,你应该考虑(a)这条线在将来如何变化,以及(b)它与代码中其他位置的一致性。
文件系统路径的默认操作因操作系统而异,我们需要一些抽象它的东西。 path
模块提供用于处理文件和目录路径的实用程序或API。你可以使用它将它包含在你的项目中
const path = require('path');
path.join
和path.resolve
是路径模块的两种不同方法。
这两种方法都接受一系列路径或路径段。
path.resolve()
方法将一系列路径或路径段解析为绝对路径。
path.join()
方法使用特定于平台的分隔符作为分隔符将所有给定路径段连接在一起,然后对结果路径进行标准化。
为了更好地理解和区分行为,让我用不同的场景来解释它。
1.如果我们不提供任何参数或空字符串
在我的情况下,我的文件名是index.js
,当前的工作目录是E:\MyFolder\Pjtz\node
const path = require('path');
console.log("path.join() : ", path.join());
// outputs .
console.log("path.resolve() : ", path.resolve());
// outputs current directory or equalent to __dirname of the node process
并且运行结果如下
λ node index.js
path.join() : .
path.resolve() : E:\MyFolder\Pjtz\node
上述实验的推论是,path.resolve()
方法将输出绝对路径,其中path.join()
返回。表示当前工作目录或相对路径(如果未提供任何内容)
2.添加/ path作为任何参数。
const path=require('path');
console.log("path.join() : " ,path.join('abc','/bcd'));
console.log("path.resolve() : ",path.resolve('abc','/bcd'));
结果是
λ node index.js
path.join() : abc\bcd
path.resolve() : E:\bcd
我们在这个实验中可以得到的推论是,path.join()
只将输入列表与特定于平台的分隔符连接起来,而path.resolve()
处理从右到左的路径序列,每个后续路径都被前置,直到构造出绝对路径。
path.join()
将每个参数与OS特定的分隔符连接,而path.resolve()
将使用root解析每个参数并生成输出。
1)path.resolve创建绝对路径。
该方法从右到左创建绝对路径,直到构造绝对路径。
例如:
path.resolve('/a', 'b', 'c'); // C:\a\b\c
path.resolve('/a', '/b', 'c'); // C:\b\c
path.resolve('/a', '/b', '/c'); // C:\c
如果未生成绝对路径,则使用当前工作目录的方法:
例如:
path.resolve('a', 'b', 'c'); // C:\{current_working_directory}\a\b\c
2)path.join连接所有路径并规范化结果
例如:
path.join('/a', '/b', '/c'); // \a\b\c
path.join('/a', '/b', 'c'); // \a\b\c
path.join('/a', 'b', 'c'); // \a\b\c
path.join('a', 'b', 'c'); // \a\b\c