淺析 NodeJs 的幾種文件路徑
一、挖坑 & 掉坑:
緣起一段這樣的代碼:
fs.readFile('./docs/use.md', function (err, buffer) { if (err) { return console.log('error: ', err); } console.log('OK'); });
本地運(yùn)行時(shí)一切 OK,線上部署時(shí)卻死活找不到 ./docs/use.md 這個(gè)文件,后來(lái)才發(fā)現(xiàn)是因?yàn)榫€上啟動(dòng)應(yīng)用時(shí)不是從當(dāng)前目錄啟動(dòng)了,不過(guò)為什么啟動(dòng)腳本的位置也會(huì)影響這個(gè)路徑呢,且往下看。
二、填坑:
Node 中的文件路徑大概有 __dirname, __filename, process.cwd(), ./ 或者 ../,前三個(gè)都是絕對(duì)路徑,為了便于比較,./ 和 ../ 我們通過(guò) path.resolve(‘./')來(lái)轉(zhuǎn)換為絕對(duì)路徑。
先看一個(gè)簡(jiǎn)單的栗子:
假如我們有這樣的文件結(jié)構(gòu):
app/ -lib/ -common.js -model -task.js -test.js
在 task.js 里編寫(xiě)如下的代碼:
var path = require('path'); console.log(__dirname); console.log(__filename); console.log(process.cwd()); console.log(path.resolve('./'));
在 model 目錄下運(yùn)行 node task.js 得到的輸出是:
/Users/guo/Sites/learn/app/model.js /Users/guo/Sites/learn/app/model.js/task.js /Users/guo/Sites/learn/app/model.js /Users/guo/Sites/learn/app/model.js
然后在 app 目錄下運(yùn)行 node model/task.js,得到的輸出是:
/Users/guo/Sites/learn/app/model.js /Users/guo/Sites/learn/app/model.js/task.js /Users/guo/Sites/learn/app /Users/guo/Sites/learn/app
那么,不好意思不是問(wèn)題來(lái)了~T_T,我們可以得出一些膚淺的結(jié)論了:
__dirname: 總是返回被執(zhí)行的 js 所在文件夾的絕對(duì)路徑
__filename: 總是返回被執(zhí)行的 js 的絕對(duì)路徑
process.cwd(): 總是返回運(yùn)行 node 命令時(shí)所在的文件夾的絕對(duì)路徑
./: 跟 process.cwd() 一樣、一樣、一樣的嗎?
我明明記得在 require(‘../lib/common') 里一直都是各種相對(duì)路徑寫(xiě),也沒(méi)見(jiàn)報(bào)什么錯(cuò)啊,我們還在再來(lái)個(gè)栗子吧,還是上面的結(jié)構(gòu),'model/task.js' 里的代碼改成:
var fs = require('fs'); var common = require('../lib/common'); fs.readFile('../lib/common.js', function (err, data) { if (err) return console.log(err); console.log(data); });
在 model 目錄下運(yùn)行 node task.js,一切 Ok,沒(méi)有報(bào)錯(cuò)。然后在 app 目錄下運(yùn)行 node model/task.js,然后很果斷滴報(bào)錯(cuò)了:
那么這下問(wèn)題真的都是來(lái)了,按照上面的理論,在 app 下運(yùn)行時(shí),../lib/common.js 會(huì)被轉(zhuǎn)成 /Users/guo/Sites/learn/lib/common.js,這個(gè)路徑顯然是不存在的,但是從運(yùn)行結(jié)果可以看出 require(‘../lib/common') 是 OK 的,只是 readFile 時(shí)報(bào)錯(cuò)了。
那么關(guān)于 ./ 正確的結(jié)論是:
在 require() 中使用是跟 __dirname 的效果相同,不會(huì)因?yàn)閱?dòng)腳本的目錄不一樣而改變,在其他情況下跟 process.cwd() 效果相同,是相對(duì)于啟動(dòng)腳本所在目錄的路徑。
三、總結(jié):
只有在 require() 時(shí)才使用相對(duì)路徑(./, ../) 的寫(xiě)法,其他地方一律使用絕對(duì)路徑,如下:
// 當(dāng)前目錄下 path.dirname(__filename) + ‘/test.js'; // 相鄰目錄下 path.resolve(__dirname, ‘../lib/common.js');
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Node.js?全局變量無(wú)法掛載問(wèn)題解決分析
這篇文章主要為大家介紹了Node.js?全局變量無(wú)法掛載問(wèn)題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04node.js中module.exports與exports用法上的區(qū)別
Node.js 引入了模塊(Module)概念,一個(gè)模塊可以通過(guò)module.exports 或 exports 將函數(shù)、變量等導(dǎo)出,以使其它 JavaScript 腳本通過(guò)require() 函數(shù)引入并使用。那么node.js中module.exports與exports有什么區(qū)別呢?下面小編給大家解答下2016-09-09Node.js API詳解之 util模塊用法實(shí)例分析
這篇文章主要介紹了Node.js API詳解之 util模塊用法,結(jié)合實(shí)例形式分析了node.js API中util模塊基本功能與相關(guān)函數(shù)使用技巧,需要的朋友可以參考下2020-05-05node.js的exports、module.exports與ES6的export、export default深入詳解
這篇文章主要給大家介紹了關(guān)于node.js中的exports、module.exports與ES6中的export、export default到時(shí)是什么的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10node.js降低版本的方式詳解(解決sass和node.js沖突問(wèn)題)
這篇文章主要介紹了node.js降低版本的方式(解決sass和node.js沖突),本文是因?yàn)閟ass版本和node版本不匹配(可以找一下對(duì)應(yīng)的版本),本文給大家詳細(xì)講解,需要的朋友可以參考下2023-02-02NodeJS?基于?Dapr?構(gòu)建云原生微服務(wù)應(yīng)用快速入門(mén)教程
Dapr?是一個(gè)可移植的、事件驅(qū)動(dòng)的運(yùn)行時(shí),它使任何開(kāi)發(fā)人員能夠輕松構(gòu)建出彈性的、無(wú)狀態(tài)和有狀態(tài)的應(yīng)用程序,并可運(yùn)行在云平臺(tái)或邊緣計(jì)算中,它同時(shí)也支持多種編程語(yǔ)言和開(kāi)發(fā)框架,本文重點(diǎn)介紹NodeJS云原生微服務(wù)應(yīng)用,感興趣的朋友一起看看吧2022-07-07