Node.js 什么';path.resolve和path.join之间的区别是什么?
以下调用之间有什么区别吗Node.js 什么';path.resolve和path.join之间的区别是什么?,node.js,Node.js,以下调用之间有什么区别吗 path.join(__dirname, 'app') vs 哪一个应该是首选的?这两个函数以非常不同的方式处理以/开头的段join只会将其与上一个参数连接起来,但是resolve会将其视为根目录,并忽略所有以前的路径-将其视为对每个参数执行cd的结果: path.join('/a', '/b') // Outputs '/a/b' path.resolve('/a', '/b') // Outputs '/b' 另一件需要注意的事情是,path.resolve将
path.join(__dirname, 'app')
vs
哪一个应该是首选的?这两个函数以非常不同的方式处理以
/
开头的段join
只会将其与上一个参数连接起来,但是resolve
会将其视为根目录,并忽略所有以前的路径-将其视为对每个参数执行cd
的结果:
path.join('/a', '/b') // Outputs '/a/b'
path.resolve('/a', '/b') // Outputs '/b'
另一件需要注意的事情是,path.resolve
将始终生成一个绝对URL,并将使用您的工作目录作为解析此路径的基础。但由于\uuu dirname
是一条绝对路径,无论如何,这在您的情况下并不重要
至于您应该使用哪一个,答案是:这取决于您希望以/
开头的段的行为-它们应该简单地连接起来还是作为新根
如果其他参数都是硬编码的,这并不重要,在这种情况下,你应该考虑(a)这条线将来可能如何变化,以及(b)它与代码中其他地方的一致性。
< P>文件系统路径的默认操作根据操作系统而不同,我们需要一些抽象的操作。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。添加/路径作为任何参数。
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()
const path=require('path');
console.log("path.join() : " ,path.join('abc','/bcd'));
console.log("path.resolve() : ",path.resolve('abc','/bcd'));
该方法从右向左创建绝对路径,直到构建绝对路径为止
例如:
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
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
如果未生成绝对路径,则使用当前工作目录的方法:
例如:
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
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
2)path.join连接所有路径,并规范化结果
例如:
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
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
用最简单的术语:
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"
如果您仍然没有得到它:path.join('/a','/b',c')
将返回/a/b/c
,而path.resolve('/a','/b',c')
将返回/b/c
。resolve
的名称不是最清楚的,path.cd([starting dir],[final dir])
会更加直观。认为它是每个参数执行cd的结果
使我最终理解了它。Thanks@JoãoPimentelFerreira,我已经更新了上面的答案,因为你提出了一个有效的观点:因此path.resolve=>将工作目录作为路径起点来解析路径?path.resolve()
与\uu dirname
不等效。第一个返回工作目录,第二个返回当前文件的路径。@EmileBergeron在我看来,它们都是路径上的函数。我认为,你们可以尝试下面的代码片段来检查两者是否相同<代码>常量路径=要求('path');console.log(path.resolve())console.log(\uu dirname)console.log(path.resolve()==\uu dirname)
只有当正在运行的文件在当前工作目录中时,它们才碰巧是相同的。@emilebergron我同意。但是我仍然不清楚我在哪里指定了path.resolve()相当于uuu dirname
@emilebergron我已经更新了注释,我认为这将解决混淆问题。这个问题在最后一个连接示例路径上。连接('a','b','c')
应该导致a\b\c
。