国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

淺析 NodeJs 的幾種文件路徑

2019-11-19 16:24:36
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一、挖坑 & 掉坑:

緣起一段這樣的代碼:

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í)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 南投市| 黄大仙区| 都昌县| 湘潭市| 宁津县| 广东省| 托克逊县| 临高县| 嘉祥县| 特克斯县| 海林市| 永修县| 梓潼县| 论坛| 丽江市| 酒泉市| 乌鲁木齐市| 东台市| 宝丰县| 东乌珠穆沁旗| 金门县| 安新县| 济宁市| 靖西县| 开鲁县| 柳州市| 集贤县| 崇仁县| 石泉县| 阿勒泰市| 河间市| 塔城市| 宁津县| 青州市| 东光县| 舞钢市| 长宁县| 襄汾县| 义马市| 民县| 吴江市|