下面的调用之间有什么区别吗?
path.join(__dirname, 'app')
vs.
path.resolve(__dirname, 'app')
应该优先选择哪一种?
下面的调用之间有什么区别吗?
path.join(__dirname, 'app')
vs.
path.resolve(__dirname, 'app')
应该优先选择哪一种?
当前回答
1)路径。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)路径。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
编辑:上面@spmdc建议的更新示例
其他回答
文件系统路径的默认操作因操作系统而异,我们需要一些抽象它的东西。 path模块提供了用于处理文件和目录的实用程序或API 路径。 您可以在项目中使用
const path = require('path');
的路径。连接和路径。解析是路径模块的两种不同方法。
这两种方法都接受路径序列或路径段。
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()将每个参数与操作系统特定的分隔符连接起来,而path.resolve()将使用根解析每个参数并产生输出。
用最简单的术语来说:
Path.resolve()只执行以下操作
从左到右-
将最右边的参数与/直接连接到根路径,以形成一个绝对路径(检查示例) 然后将任何没有/的目录连接起来
以谢尔盖为例
path.resolve('/a', 'b', 'c'); returns C:\a\b\c
path.resolve('/a', '/b', 'c'); returns C:\b\c
path.resolve('/a', '/b', '/c'); returns C:\c
而join只是将每个参数从左到右连接起来,不管它们是否存在
path.join("/a", "b", "/c", "d") simply returns "\a\b\c\d"
这两个函数以非常不同的方式处理以/开头的段;Join只会将它与前一个参数连接起来,然而resolve会将其视为根目录,并忽略所有之前的路径-将其视为执行CD每个参数的结果:
path.join('/a', '/b') // Outputs '/a/b'
path.resolve('/a', '/b') // Outputs '/b'
另一件需要注意的事情是路径。resolve将始终产生一个绝对URL,并将使用您的工作目录作为解析此路径的基目录。但由于__dirname是一个绝对路径,在你的情况下这并不重要。
至于你应该使用哪一个,答案是:这取决于你希望从/开始的段如何表现——它们应该简单地连接还是应该作为新的根?
如果其他参数是硬编码的,这真的没关系,在这种情况下,你可能应该考虑(a)这一行在未来可能会如何改变,(b)它与代码中的其他地方是否一致。
1)路径。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)路径。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
编辑:上面@spmdc建议的更新示例