在前端學習過程中,涉及到路徑的問題非常多,相對路徑,絕對路徑等。有時候明明覺得沒問題,但是還是會出錯。或者說線下沒問題,但是到了線上就出現問題,因此弄懂路徑問題,非常關鍵。我們需要知道為什麼這個地方既可以使用相對路徑,又可以使用絕對路徑,為什麼有些地方只能使用絕對路徑。 一、Node.js中載入模塊 ...
在前端學習過程中,涉及到路徑的問題非常多,相對路徑,絕對路徑等。有時候明明覺得沒問題,但是還是會出錯。或者說線下沒問題,但是到了線上就出現問題,因此弄懂路徑問題,非常關鍵。我們需要知道為什麼這個地方既可以使用相對路徑,又可以使用絕對路徑,為什麼有些地方只能使用絕對路徑。
一、Node.js中載入模塊的路徑設置
const myClass = require('./myclass')
上面這段代碼是我們在使用Node.js中經常會使用到的代碼-引入模塊。我們都知道如果載入的是核心模塊,直接require(模塊名)即可。但是使用本地模塊,必須加上路徑,這是為什麼了?這與模塊的查找順序有關:
node 在查找模塊的時候:
- 它會先在當前目錄的node_modules中查找,是否含有該模塊,如果有則直接使用
- 如果沒有則去上一級目錄的node_modules中查找,如果有則使用,如果沒有則會一直往上查找,一直到磁碟的根目錄,如果還沒有則報錯
從上面node查找模塊的順序,我們可以知道他會一直在node_modules中查找,但是我們自定義模塊都不在node_modules中,因此如果我們想要使用自定義模塊,必須加上路徑,使得它查找模塊直接到我們指定的路徑中進行查找。(ps:這是我個人研究的一點看法,可能並不正確,歡迎大家指正。)
二. 關於__dirname和__filename
有些時候,你需要打開一些不在模塊系統中的文件來載入數據,但你需要通過當前腳本的路徑來找到那個文件。這時候__dirname和__filename變數在這種場景下非常有用。這些變數保存著當前腳本的絕對路徑。
__dirname:當前文件的目錄的絕對路徑,通俗的來說是當前文件的上一級。註意它的路徑始終是固定的,與你的游標所在的位置無關(也就是說與你在哪個路徑運行node無關)
如上圖所示:index.js文件中console.log(__dirname),最終得到的絕對路徑是:
xxx\Node.js_in_practice\chapter two\group
最終路徑到上一級group為止。
__filename:當前文件的絕對路徑,包含當前文件的文件名。
如上圖所示:在index.js中的文件路徑應該是:
xxx\Node.js_in_practice\chapter two\group\index.js
最終的路徑包含文件名。其路徑同樣與在哪裡運行node無關。