摘要:前言之前在做配置時候多次用到路徑相關內容,最近在寫項目的時候,有一個文件需要上傳到阿里云的功能,同時本地服務器也需要保留一個文件備份。如果返回的路徑字符串長度為零,那么他會返回一個,代表當前的文件夾。
前言
之前在做webpack配置時候多次用到路徑相關內容,最近在寫項目的時候,有一個文件需要上傳到阿里云oss的功能,同時本地服務器也需要保留一個文件備份。多次用到了文件路徑相關內容以及Node核心API的path模塊,所以系統(tǒng)的學習了一下,整理了這篇文章。
node中的路徑分類node中的路徑大致分5類,dirname,filename,process.cwd(),./,../,其中dirname,filename,process.cwd()絕對路徑
通過代碼對每個分類進行說明:
文件目錄結構如下:
代碼pra/ - node核心API/ - fs.js - path.js
path.js中的代碼
const path = require("path"); console.log(__dirname); console.log(__filename); console.log(process.cwd()); console.log(path.resolve("./"));
在代碼pra目錄下運行命令 node node核心API/path.js,我們可以看到結果如下:
/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
對比輸出結果,暫時得到的結論是
__dirname: 總是返回被執(zhí)行的 js 所在文件夾的絕對路徑
__filename: 總是返回被執(zhí)行的 js 的絕對路徑
process.cwd(): 總是返回運行 node 命令時所在的文件夾的絕對路徑
./: 跟 process.cwd() 一樣,返回 node 命令時所在的文件夾的絕對路徑
為什么說上面是暫時得到的結論,因為是有錯誤的,再看一段代碼:
我們在path.js中加上這句代碼
exports.A = 1;
之前直接通過readFile讀取文件路徑報錯,
fs.readFile("./path.js",function(err,data){ });
現(xiàn)在在剛才報錯的fs.js里面加這兩句代碼看看:
const test = require("./path.js"); console.log(test)
在代碼pra/目錄下運行node node核心API/fs.js,最后查看結果,說明是可以訪問到的:
{ A: 1 }
那么關于 ./ 正確的結論是:
在 require() 中使用是跟 __dirname 的效果相同,不會因為啟動腳本的目錄不一樣而改變,在其他情況下跟 process.cwd() 效果相同,是相對于啟動腳本所在目錄的路徑。
路徑知識總結:__dirname: 獲得當前執(zhí)行文件所在目錄的完整目錄名
__filename: 獲得當前執(zhí)行文件的帶有完整絕對路徑的文件名
process.cwd():獲得當前執(zhí)行node命令時候的文件夾目錄名
./: 不使用require時候,./與process.cwd()一樣,使用require時候,與__dirname一樣
只有在 require() 時才使用相對路徑(./, ../) 的寫法,其他地方一律使用絕對路徑,如下:
// 當前目錄下 path.dirname(__filename) + "/path.js"; // 相鄰目錄下 path.resolve(__dirname, "../regx/regx.js");path
前面講解了路徑的相關比較,接下來多帶帶聊聊path這個模塊,這個模塊在很多地方比較常用,所以,對于我們來說,掌握他,對我們以后的發(fā)展更有利,不用每次看webpack的配置文件還要去查詢一下這個api是干什么用的,很影響我們的效率
這是api官網(wǎng)地址:https://nodejs.org/api/path.html
個人認為官網(wǎng)中的api沒有必要都掌握,下面會對一些常用的api進行講解,我經(jīng)常用到的,或者作為一個前端開發(fā)工程師在webpack等工程配置的時候經(jīng)常用到的。
path.normalize舉例說明
const path = require("path"); console.log(path.normalize("/koala/Desktop//程序員成長指北//代碼pra/.."));
規(guī)范后的結果
/koala/Desktop/程序員成長指北/代碼pra
作用總結
規(guī)范化路徑,把不規(guī)范的路徑規(guī)范化。
path.join舉例說明
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])
傳入的參數(shù)是字符串的路徑片段,可以是一個,也可以是多個
返回的是一個拼接好的路徑,但是根據(jù)平臺的不同,他會對路徑進行不同的規(guī)范化,舉個例子,Unix系統(tǒng)是/,Windows系統(tǒng)是,那么你在兩個系統(tǒng)下看到的返回結果就不一樣。
如果返回的路徑字符串長度為零,那么他會返回一個.,代表當前的文件夾。
如果傳入的參數(shù)中有不是字符串的,那就直接會報錯
path.parse舉例說明
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" }
作用總結
他返回的是一個對象,那么我們來把這么幾個名詞熟悉一下:
root:代表根目錄
dir:代表文件所在的文件夾
base:代表整一個文件
name:代表文件名
ext: 代表文件的后綴名
path.basename舉例說明
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接收兩個參數(shù),第一個是path,第二個是ext(可選參數(shù)),當輸入第二個參數(shù)的時候,打印結果不出現(xiàn)后綴名
path.dirname舉例說明
const path = require("path"); console.log(path.dirname("/koala/Desktop/程序員成長指北/代碼pra/node核心API"));
運行結果
/koala/Desktop/程序員成長指北/代碼pra
作用總結
返回文件的目錄完整地址
path.extname舉例說明
const path = require("path"); path.extname("index.html"); path.extname("index.coffee.md"); path.extname("index."); path.extname("index"); path.extname(".index");
運行結果
.html .md . "" ""
作用總結
返回的是后綴名,但是最后兩種情況返回"",大家注意一下。
path.resolve舉例說明
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操作還是有區(qū)別的,resolve的路徑可以沒有,而且最后進入的可以是文件。具體cd步驟如下
cd /foo/bar/ //這是第一步, 現(xiàn)在的位置是/foo/bar/ cd /bar/faa //這是第二步,這里和第一步有區(qū)別,他是從/進入的,也就時候根目錄,現(xiàn)在的位置是/bar/faa cd .. //第三步,從faa退出來,現(xiàn)在的位置是 /bar cd a/../c //第四步,進入a,然后在推出,在進入c,最后位置是/bar/cpath.relative
舉例說明
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路徑的相對路徑。
邊界:
如果from、to指向同個路徑,那么,返回空字符串。
如果from、to中任一者為空,那么,返回當前工作路徑。
總結本篇文章關于路徑的知識就說到這里,基礎很重要的,既能節(jié)約開發(fā)時間,又能減少報錯。
今天就分享這么多,如果對分享的內容感興趣,可以關注公眾號「程序員成長指北」,或者加入技術交流群,大家一起討論。
進階技術路線
加入我們一起學習吧!
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/110060.html
摘要:在他的重學前端課程中提到到現(xiàn)在為止,前端工程師已經(jīng)成為研發(fā)體系中的重要崗位之一。大部分前端工程師的知識,其實都是來自于實踐和工作中零散的學習。一基礎前端工程師吃飯的家伙,深度廣度一樣都不能差。 開篇 前端開發(fā)是一個非常特殊的行業(yè),它的歷史實際上不是很長,但是知識之繁雜,技術迭代速度之快是其他技術所不能比擬的。 winter在他的《重學前端》課程中提到: 到現(xiàn)在為止,前端工程師已經(jīng)成為研...
摘要:在他的重學前端課程中提到到現(xiàn)在為止,前端工程師已經(jīng)成為研發(fā)體系中的重要崗位之一。大部分前端工程師的知識,其實都是來自于實踐和工作中零散的學習。一基礎前端工程師吃飯的家伙,深度廣度一樣都不能差。開篇 前端開發(fā)是一個非常特殊的行業(yè),它的歷史實際上不是很長,但是知識之繁雜,技術迭代速度之快是其他技術所不能比擬的。 winter在他的《重學前端》課程中提到: 到現(xiàn)在為止,前端工程師已經(jīng)成為研發(fā)體系...
摘要:由于文章內容較長,所以我把它分成兩篇小文章,在第一篇優(yōu)秀架構師必須掌握的架構思維中,我會先介紹抽象分層分治和演化這四種應對復雜性的基本思維。另外,上面的算法是兩路歸并,也可以采用多路歸并,甚至是采用堆排序進行優(yōu)化,但是總體分治思路沒有變化。 showImg(https://segmentfault.com/img/bVbeYpP?w=642&h=400); 介紹 架構的本質是管理復雜性...
摘要:由于文章內容較長,所以我把它分成兩篇小文章,在第一篇優(yōu)秀架構師必須掌握的架構思維中,我會先介紹抽象分層分治和演化這四種應對復雜性的基本思維。另外,上面的算法是兩路歸并,也可以采用多路歸并,甚至是采用堆排序進行優(yōu)化,但是總體分治思路沒有變化。 showImg(https://segmentfault.com/img/bVbeYpP?w=642&h=400); 介紹 架構的本質是管理復雜性...
閱讀 1203·2021-11-15 18:00
閱讀 1798·2021-10-08 10:15
閱讀 763·2021-09-04 16:48
閱讀 2388·2021-09-04 16:48
閱讀 1321·2019-08-29 18:40
閱讀 976·2019-08-29 13:08
閱讀 2997·2019-08-26 14:06
閱讀 1119·2019-08-26 13:35