Node.js中path.resolve與path.join的區(qū)別與作用詳解
前言:
講解之前,大致的講解一下所涉及的知識點(diǎn);
path 模塊:用于處理文件和目錄的路徑的實(shí)用工具,使用前需先引入模塊;
path.join():用于鏈接路徑,并且會自動轉(zhuǎn)換當(dāng)前系統(tǒng)路徑的分隔符"/"或"\";
path.resolve():也是用于鏈接路徑,但卻和path.join()方法卻很多不同,而且path.resolve()方法本身就自帶一個(gè)to的絕對路徑參數(shù),也會自動轉(zhuǎn)換分隔符,在某些場景用起來也方便很多;
__dirname:是node的一個(gè)全局變量,獲得當(dāng)前文件所在目錄的完整目錄名,搭配path一起使用;
話不多說,下面直接開始演示,演示完畢后有總結(jié)他們的特性。
關(guān)于 path.resolve() 的使用
語法:path.resolve([from ...], to)
案例一:
演示當(dāng)"path"路徑為空時(shí),得到結(jié)果是當(dāng)前文件所在的絕對路徑,類似 __dirname ;
// 引入path模塊 const path = require('path'); // 此處直接打印 console.log(path.resolve()); console.log(path.resolve('')); console.log(path.resolve(__dirname); // 輸出:E:\Berlin-Case\path // 輸出:E:\Berlin-Case\path // 輸出:E:\Berlin-Case\path
案例二:
演示字符以 ./ 開頭或者沒有字符時(shí),得到的結(jié)果是加不加 ./ 都不影響路徑的拼接;
// 引入path模塊 const path = require('path'); // 此處直接打印 console.log(path.resolve()); console.log(path.resolve('a')); console.log(path.resolve('a','b')); console.log(path.resolve('c','b','a')); console.log(path.resolve('./a')); console.log(path.resolve('a','./b')); console.log(path.resolve('./c','b','./a')); // 輸出:E:\Berlin-Case\path // 輸出:E:\Berlin-Case\path\a // 輸出:E:\Berlin-Case\path\a\b // 輸出:E:\Berlin-Case\path\c\b\a // 輸出:E:\Berlin-Case\path\a // 輸出:E:\Berlin-Case\path\a\b // 輸出:E:\Berlin-Case\path\c\b\a
案例三:
演示字符以 / 開頭,path.resolve()的特點(diǎn)之一就是碰到"/"斜桿則會直接跳轉(zhuǎn)到E盤的根路徑(在哪個(gè)盤運(yùn)行就是哪個(gè)盤),這里跟在終端輸出cd /是一樣的原理,也會跳轉(zhuǎn)到E盤的根路徑;
// 引入path模塊 const path = require('path'); // 此處直接打印 console.log(path.resolve()); console.log(path.resolve('/a')); console.log(path.resolve('/a','b','c')); console.log(path.resolve('a','/b','c')); console.log(path.resolve('c','b','/a')); // 輸出:E:\Berlin-Case\path // 輸出:E:\a // 輸出:E:\a\b\c // 輸出:E:\b\c // 輸出:E:\a
案例四:
演示字符以../開頭,也就是上一層的意思,path.resolve()會把下個(gè)要拼接的"path"路徑給覆蓋掉;
// 引入path模塊 const path = require('path'); // 此處直接打印 console.log(path.resolve()); console.log(path.resolve('../')); console.log(path.resolve('../a')); console.log(path.resolve('../a','b')); console.log(path.resolve('a','../b')); console.log(path.resolve('c','b','../a')); console.log(path.resolve('../c','b','a')); // 輸出:E:\Berlin-Case\path // 輸出:E:\Berlin-Case\ // 輸出:E:\Berlin-Case\a // 輸出:E:\Berlin-Case\a\b // 輸出:E:\Berlin-Case\path\b // 輸出:E:\Berlin-Case\path\c\a // 輸出:E:\Berlin-Case\c\b\a
案例五:
演示path.resolve()搭配__dername變量
// 引入path模塊 const path = require('path'); // 此處直接打印 console.log(path.resolve(__dirname,'a')); console.log(path.resolve('a','b',__dirname)); console.log(path.resolve(__dirname,'./a','b')); console.log(path.resolve(__dirname,'/a','b')); console.log(path.resolve(__dirname,'../a','b')); console.log(path.resolve(__dirname,'a','../b')); console.log(path.resolve('a','/b',__dirname)); // 輸出:E:\Berlin-Case\path\a // 輸出:E:\Berlin-Case\path // 輸出:E:\Berlin-Case\path\a\b // 輸出:E:\a\b // 輸出:E:\Berlin-Case\a\b // 輸出:E:\Berlin-Case\path\b // 輸出:E:\Berlin-Case\path
從案例五例子可以看出,__dirname變量需放在第一個(gè),否則會覆蓋在它之前的'path'路徑,包括斜杠' / ',還有個(gè)要注意的點(diǎn),__dirname之后也不能出現(xiàn)' / ',不然也覆蓋之前的路徑;
總結(jié):
path.resolve("./path")的特性有以下幾點(diǎn):
- 從右往左讀取"path"路徑,并開始拼接,本身就自帶絕對路徑參數(shù) "to" ;
- 當(dāng)"path"路徑為空時(shí),則會直接獲取當(dāng)前文件所在的絕對路徑;
- 當(dāng)遇到字符以 ./ 開頭或者沒有字符,則正常拼接,所以可省略不加字符;
- 當(dāng)遇到字符以 / 開頭,則不會拼接到前面的路徑并以自身所在盤為根路徑加以拼接;
- 當(dāng)遇到字符以 ../ 開頭,則會將下一個(gè)要拼接"path"路徑給覆蓋,然后繼續(xù)往左拼接;
- 搭配__dirname時(shí),需將放置第一位,且與 ' / ' 有互相覆蓋的沖突;
關(guān)于 path.join() 的使用
語法:path.join([path1][, path2][, ...])
案例一:
演示當(dāng)"path"路徑為無或空時(shí),得到的結(jié)果是" . ",只有傳入__dirname的時(shí)候,才能得到絕對路徑
// 引入path模塊 const path = require('path'); // 此處直接打印 console.log(path.join()); console.log(path.join('')); console.log(path.join(__dirname)); // 輸出:. // 輸出:. // 輸出:E:\Berlin-Case\path
案例二:
演示字符以 ./ 開頭或者 / 和沒有字符,得到的結(jié)果是加不加都不影響路徑的拼接,此時(shí)你應(yīng)該發(fā)現(xiàn)跟path.resolve()的有所不同了,因?yàn)閞esolve()只會單純的去拼接你寫入的"path"路徑,而不會像path.resolve()那樣用cd去運(yùn)作;
// 引入path模塊 const path = require('path'); // 此處直接打印 console.log(path.join()); console.log(path.join('a')); console.log(path.join('a','b')); console.log(path.join('c','b','a')); console.log(path.join('./a')); console.log(path.join('a','./b')); console.log(path.join('./c','b','./a')); console.log(path.join('/a')); console.log(path.join('a','/b')); console.log(path.join('/c','b','/a')); // 輸出:. // 輸出:a // 輸出:a\b // 輸出:c\b\a // 輸出:a // 輸出:a\b // 輸出:c\b\a // 輸出:\a // 輸出:a\b // 輸出:\c\b\a
案例三:
演示以 ../ 開頭的字符,此時(shí)你會發(fā)現(xiàn)join()不僅是單純的去拼接路徑,而且也是從右到左去拼接的,../之后還有"path"路徑的話,也是會被覆蓋掉;
// 引入path模塊 const path = require('path'); // 此處直接打印 console.log(path.join()); console.log(path.join('../')); console.log(path.join('../a')); console.log(path.join('../a','b')); console.log(path.join('a','../b')); console.log(path.join('c','b','../a')); console.log(path.join('../c','b','a')); // 輸出:. // 輸出:..\ // 輸出:..\a // 輸出:..\a\b // 輸出:b // 輸出:c\a // 輸出:..\c\b\a
案例四:
演示path.join()搭配__dername變量,為什么一定要把它放在第一位?
// 引入path模塊 const path = require('path'); // 此處直接打印 console.log(path.join(__dirname,'a')); console.log(path.join('a',__dirname)); // 輸出:E:\Berlin-Case\path\a // 輸出:a\E:\Berlin-Case\path
看出區(qū)別了嗎?對的,沒錯(cuò),join會不管對錯(cuò),直接把你寫入的路徑都拼接到一塊,這也是為什么要放在第一位的原因,當(dāng)然resolve()就沒這種問題,接下來繼續(xù)演示,與字符的搭配;
// 引入path模塊 const path = require('path'); // 此處直接打印 console.log(path.join(__dirname,'/a')); console.log(path.join(__dirname,'./a')); console.log(path.join(__dirname,'../')); console.log(path.join(__dirname,'../a')); console.log(path.join(__dirname,'../a','b')); // 輸出:E:\Berlin-Case\path\a // 輸出:E:\Berlin-Case\path\a // 輸出:E:\Berlin-Case\ // 輸出:E:\Berlin-Case\a // 輸出:E:\Berlin-Case\a\b
以上示例可以看出,'/' './' 這兩個(gè)字符在path.join()的方法中是不起作用的,不加也是一樣的效果,只有 '../ ' 才有返回上級目錄的作用,所以使用path.join()時(shí),加個(gè)__dirname,拼上你要的"path"路徑即可;(不加會很麻煩哦)
總結(jié):
- 在path.join()方法中,'/' 與 './' 一般情況下可以不用(特殊情況的拼接除外哈);
- 在path.join()方法中,最好與__dirname變量搭配使用;
- path.join()方法也是從右到左依次被解析排列組成路徑的;
path.resolve與path.join的區(qū)別
結(jié)合上面兩個(gè)方法的演示后的總結(jié),它們之間的區(qū)別如下:
- path.resolve()自帶to參數(shù),也就是當(dāng)前輸出文件的路徑,而path.join()沒有;
- path.resolve()遇到 ' / ' 則會跳轉(zhuǎn)到根目錄(E:\),而path.join()則沒效果;
- path.resove()搭配__dirname變量使用時(shí),就算__dirname在最右邊,resolve()會把左邊的"path"路徑給覆蓋掉,形成正確的路徑,而path.join()正常拼接,無論對錯(cuò);
到此這篇關(guān)于Node.js中path.resolve與path.join的區(qū)別與作用的文章就介紹到這了,更多相關(guān)Node.js path.resolve與path.join內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解nodejs 開發(fā)企業(yè)微信第三方應(yīng)用入門教程
這篇文章主要介紹了詳解nodejs 開發(fā)企業(yè)微信第三方應(yīng)用入門教程,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03Node.js連接MySQL數(shù)據(jù)庫的操作步驟
在現(xiàn)代 Web 開發(fā)中,與數(shù)據(jù)庫的交互是不可避免的一部分,Node.js提供了許多庫和模塊,使得連接和操作 MySQL 數(shù)據(jù)庫變得相對簡單,本文將介紹如何使用Node.js連接MySQL數(shù)據(jù)庫,并進(jìn)行一些基本的操作,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11使用 NodeJS+Express 開發(fā)服務(wù)端的簡單介紹
這篇文章主要介紹了使用 NodeJS+Express 開發(fā)服務(wù)端的簡單介紹,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04從零開始學(xué)習(xí)Node.js系列教程四:多頁面實(shí)現(xiàn)的數(shù)學(xué)運(yùn)算示例
這篇文章主要介紹了Node.js多頁面實(shí)現(xiàn)的數(shù)學(xué)運(yùn)算,涉及nodejs請求響應(yīng)、數(shù)值傳遞、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2017-04-04