以前在作webpack
配置時候屢次用到路徑相關內容,最近在寫項目的時候,有一個文件須要上傳到阿里雲oss的功能,同時本地服務器也須要保留一個文件備份。屢次用到了文件路徑相關內容以及Node核心API的path
模塊,因此係統的學習了一下,整理了這篇文章。javascript
做者簡介:koala,專一完整的 Node.js 技術棧分享,從 JavaScript 到 Node.js,再到後端數據庫,祝您成爲優秀的高級 Node.js 工程師。【程序員成長指北】做者,Github 博客開源項目 github.com/koala-codin…html
node中的路徑大體分5類,dirname
,filename
,process.cwd()
,./
,../
,其中dirname
,filename
,process.cwd()
絕對路徑前端
經過代碼對每一個分類進行說明:java
文件目錄結構以下:node
代碼pra/
- node核心API/
- fs.js
- path.js
複製代碼
path.js中的代碼webpack
const path = require('path');
console.log(__dirname);
console.log(__filename);
console.log(process.cwd());
console.log(path.resolve('./'));
複製代碼
在代碼pra目錄下運行命令 node node核心API/path.js
,咱們能夠看到結果以下:git
/koala/Desktop/程序員成長指北/代碼pra/node核心API
/koala/Desktop/程序員成長指北/代碼pra/node核心API/path.js
/koala/Desktop/程序員成長指北/代碼pra
/koala/Desktop/程序員成長指北/代碼pra
複製代碼
而後咱們有能夠在node核心API目錄下
運行這個文件,node path.js
,運行結果以下:程序員
/koala/Desktop/程序員成長指北/代碼pra/node核心API
/koala/Desktop/程序員成長指北/代碼pra/node核心API/path.js
/koala/Desktop/程序員成長指北/代碼pra/node核心API
/koala/Desktop/程序員成長指北/代碼pra/node核心API
複製代碼
對比輸出結果,暫時獲得的結論是github
爲何說上面是暫時獲得的結論,由於是有錯誤的,再看一段代碼: 咱們在path.js中加上這句代碼web
exports.A = 1;
複製代碼
以前直接經過readFile讀取文件路徑報錯,
fs.readFile('./path.js',function(err,data){
});
複製代碼
如今在剛纔報錯的fs.js裏面加這兩句代碼看看:
const test = require('./path.js');
console.log(test)
複製代碼
在代碼pra/
目錄下運行node node核心API/fs.js
,最後查看結果,說明是能夠訪問到的:
{ A: 1 }
複製代碼
那麼關於 ./
正確的結論是:
在 require()
中使用是跟__dirname
的效果相同,不會由於啓動腳本的目錄不同而改變,在其餘狀況下跟 process.cwd()
效果相同,是相對於啓動腳本所在目錄的路徑。
__dirname
: 得到當前執行文件所在目錄的完整目錄名__filename
: 得到當前執行文件的帶有完整絕對路徑的文件名process.cwd()
:得到當前執行node命令時候的文件夾目錄名./
: 不使用require時候,./
與process.cwd()
同樣,使用require
時候,與__dirname
同樣只有在 require() 時才使用相對路徑(./, ../) 的寫法,其餘地方一概使用絕對路徑,以下:
// 當前目錄下
path.dirname(__filename) + '/path.js';
// 相鄰目錄下
path.resolve(__dirname, '../regx/regx.js');
複製代碼
前面講解了路徑的相關比較,接下來單獨聊聊path這個模塊,這個模塊在不少地方比較經常使用,因此,對於咱們來講,掌握他,對咱們之後的發展更有利,不用每次看webpack的配置文件還要去查詢一下這個api是幹什麼用的,很影響咱們的效率
這是api官網地址:nodejs.org/api/path.ht…
我的認爲官網中的api沒有必要都掌握,下面會對一些經常使用的api進行講解,我常常用到的,或者做爲一個前端開發工程師在webpack等工程配置的時候常常用到的。
舉例說明
const path = require('path');
console.log(path.normalize('/koala/Desktop//程序員成長指北//代碼pra/..'));
複製代碼
規範後的結果
/koala/Desktop/程序員成長指北/代碼pra
複製代碼
做用總結
規範化路徑,把不規範的路徑規範化。
舉例說明
const path = require('path');
console.log(path.join('src', 'task.js'));
const path = require('path');
console.log(path.join(''));
複製代碼
轉化後的結果
src/task.js
.
複製代碼
做用總結
path.join([...paths])
Unix
系統是/
,Windows
系統是\
,那麼你在兩個系統下看到的返回結果就不同。.
,表明當前的文件夾。舉例說明
const path = require('path');
console.log(path.parse('/koala/Desktop/程序員成長指北/代碼pra/node核心API'));
複製代碼
運行結果
{ root: '/',
dir: '/koala/Desktop/程序員成長指北/代碼pra',
base: 'node核心API',
ext: '',
name: 'node核心API'
}
複製代碼
做用總結
他返回的是一個對象,那麼咱們來把這麼幾個名詞熟悉一下:
舉例說明
const path = require('path');
console.log(path.basename('/koala/Desktop/程序員成長指北/代碼pra/node核心API'));
console.log(path.basename('/koala/Desktop/程序員成長指北/代碼pra/node核心API/path.js', '.js'));
複製代碼
運行結果
看了上面代碼的例子,我想應該知道了basename結果,嘿嘿。
node核心API
path
複製代碼
做用總結
basename接收兩個參數,第一個是path
,第二個是ext
(可選參數),當輸入第二個參數的時候,打印結果不出現後綴名
舉例說明
const path = require('path');
console.log(path.dirname('/koala/Desktop/程序員成長指北/代碼pra/node核心API'));
複製代碼
運行結果
/koala/Desktop/程序員成長指北/代碼pra
複製代碼
做用總結
返回文件的目錄完整地址
舉例說明
const path = require('path');
path.extname('index.html');
path.extname('index.coffee.md');
path.extname('index.');
path.extname('index');
path.extname('.index');
複製代碼
運行結果
.html
.md
.
''
''
複製代碼
做用總結
返回的是後綴名,可是最後兩種狀況返回'',你們注意一下。
舉例說明
const path = require('path');
console.log(path.resolve('/foo/bar', '/bar/faa', '..', 'a/../c'));
複製代碼
輸出結果
/bar/c
複製代碼
做用總結
path.resolve([...paths])
path.resolve就至關因而shell下面的cd
操做,從左到右運行一遍cd path
命令,最終獲取的絕對路徑/文件名,這個接口所返回的結果了。可是resolve
操做和cd
操做仍是有區別的,resolve
的路徑能夠沒有,並且最後進入的能夠是文件。具體cd
步驟以下
cd /foo/bar/ //這是第一步, 如今的位置是/foo/bar/
cd /bar/faa //這是第二步,這裏和第一步有區別,他是從/進入的,也就時候根目錄,如今的位置是/bar/faa
cd .. //第三步,從faa退出來,如今的位置是 /bar
cd a/../c //第四步,進入a,而後在推出,在進入c,最後位置是/bar/c
複製代碼
舉例說明
const path = require('path');
console.log(path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb'));
console.log(path.relative('/data/demo', '/data/demo'));
console.log(path.relative('/data/demo', ''));
複製代碼
運行結果
../../impl/bbb
""
../../koala/Desktop/程序員成長指北/代碼pra/node核心API
複製代碼
做用總結
path.relative(from, to)
描述:從from路徑,到to路徑的相對路徑。
邊界:
本篇文章關於路徑的知識就說到這裏,基礎很重要的,既能節約開發時間,又能減小報錯。
今天就分享這麼多,若是對分享的內容感興趣,能夠關注公衆號「程序員成長指北」,或者加入技術交流羣,你們一塊兒討論。
進階技術路線