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

首頁 > 開發(fā) > JS > 正文

淺析 NodeJs 的幾種文件路徑

2024-05-06 16:37:41
字體:
供稿:網(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è)文件,后來才發(fā)現(xiàn)是因?yàn)榫€上啟動(dòng)應(yīng)用時(shí)不是從當(dāng)前目錄啟動(dòng)了,不過為什么啟動(dòng)腳本的位置也會(huì)影響這個(gè)路徑呢,且往下看。

二、填坑:

Node 中的文件路徑大概有 __dirname, __filename, process.cwd(), ./ 或者 ../,前三個(gè)都是絕對(duì)路徑,為了便于比較,./ 和 ../ 我們通過 path.resolve(‘./')來轉(zhuǎn)換為絕對(duì)路徑。

先看一個(gè)簡單的栗子:

假如我們有這樣的文件結(jié)構(gòu):

app/ -lib/ -common.js -model -task.js -test.js 

在 task.js 里編寫如下的代碼:

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

那么,不好意思不是問題來了~T_T,我們可以得出一些膚淺的結(jié)論了:

__dirname: 總是返回被執(zhí)行的 js 所在文件夾的絕對(duì)路徑

__filename: 總是返回被執(zhí)行的 js 的絕對(duì)路徑

process.cwd(): 總是返回運(yùn)行 node 命令時(shí)所在的文件夾的絕對(duì)路徑

./: 跟 process.cwd() 一樣、一樣、一樣的嗎?

我明明記得在 require(‘../lib/common') 里一直都是各種相對(duì)路徑寫,也沒見報(bào)什么錯(cuò)啊,我們還在再來個(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,沒有報(bào)錯(cuò)。然后在 app 目錄下運(yùn)行 node model/task.js,然后很果斷滴報(bào)錯(cuò)了:

那么這下問題真的都是來了,按照上面的理論,在 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ì)路徑(./, ../) 的寫法,其他地方一律使用絕對(duì)路徑,如下:

// 當(dāng)前目錄下 path.dirname(__filename) + ‘/test.js'; // 相鄰目錄下 path.resolve(__dirname, ‘../lib/common.js'); 

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JavaScript/Ajax教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 莎车县| 钟祥市| 迁西县| 博爱县| 石城县| 博湖县| 庆云县| 合阳县| 临夏县| 甘南县| 旌德县| 聂拉木县| 商洛市| 平谷区| 休宁县| 藁城市| 潼南县| 乌拉特前旗| 凤山县| 屏东县| 禹城市| 中方县| 沾益县| 昌图县| 七台河市| 仲巴县| 金堂县| 中西区| 师宗县| 荥阳市| 涿州市| 镇坪县| 古浪县| 延津县| 衡水市| 延寿县| 鸡东县| 榆林市| 化州市| 永仁县| 江都市|