path.join 定義
path.join([path1][, path2][, ...])
用于連接路徑。會把全部給定的 path 片段連接到一起,并規(guī)范化生成的路徑。
path.join('/foo', 'bar', './baz');
// '/foo/bar/baz'
path.join('/foo', 'bar', '/baz', '..');
// '/foo/bar'
要點:如果連接后的路徑字符串是一個長度為零的字符串,則返回 '.',表示當(dāng)前工作目錄。
如果我當(dāng)前工作目錄是 E:\nodejs
path.join('');
// 'E:\nodejs'
path.resolve定義
path.resolve() 方法將路徑或路徑片段的序列解析為絕對路徑
它可以接受多個參數(shù),依次表示所要進入的路徑,直到將最后一個參數(shù)轉(zhuǎn)為絕對路徑。如果根據(jù)參數(shù)無法得到絕對路徑,就以當(dāng)前所在路徑作為基準(zhǔn)。除了根目錄,該方法的返回值都不帶尾部的斜杠。
是不是覺得很難理解?官方大白話都是如此。最好結(jié)合代碼理解,如下代碼:
1.console.log(path.resolve()); //E:\nodejs
2.console.log(path.resolve('')); //E:\nodejs
3.console.log(path.resolve('.')); //E:\nodejs
4.console.log(path.resolve(__dirname)); //E:\nodejs
5.console.log(path.resolve('js/common','test')); //E:\nodejs\js\common\test
6.console.log(path.resolve('./js/common','test')); //E:\nodejs\js\common\test
7.console.log(path.resolve('js/common','./test')); //E:\nodejs\js\common\test
8.console.log(path.resolve('./js/common','./test')); //E:\nodejs\js\common\test
9.console.log(path.resolve('/js/common','test')); //E:\js\common\test
10.console.log(path.resolve('js/common','/test')); //E:\test
11.console.log(path.resolve('/js/common','/test')); //E:\test
12.console.log(path.resolve('/js/common','../test')); //E:\js\test
13.console.log(path.resolve('js/common','../test')); //E:\nodejs\js\test
上面代碼的已知條件:我當(dāng)前工作目錄是 E:\nodejs
理解要點:
1、從右往左依次解析(很重要,很重要,很重要?。。?br>
2、代碼里序號1-4的幾種寫法會返回當(dāng)前工作目錄。
3、代碼里序號5-8中,’test’ 等價于 ‘./test’ :是相對路徑,假如相對路徑片段在最右側(cè),則需要向前拼接,
直到遇到以斜杠(/)開頭的參數(shù)結(jié)束,假如直到解析到第一個參數(shù)仍然沒有遇到以斜杠開頭的,則直接拼接到你當(dāng)前工作目錄(也就是 E:\nodejs)。
4、 代碼里序號10-11說明的是參數(shù)從右至左,遇到第一個以斜杠開頭的參數(shù)停止解析,無論前面是否還有參數(shù)。
5、 ‘../test’ 解析之后就是test的上一級。如代碼里序號12,前面是'/js/common',帶有'/',所以會以'E:\js\common'作為根目錄去拼接'../test',即為'E:\js\test'。
6、代碼里序號13跟12之所以不同是因為序號13里的‘js/common’不帶‘/’。