国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 桓台县| 阿克苏市| 墨玉县| 华容县| 黑龙江省| 忻城县| 南康市| 高平市| 全州县| 鄱阳县| 运城市| 屯昌县| 彭泽县| 辽源市| 南投县| 梧州市| 苗栗县| 本溪市| 重庆市| 全南县| 中西区| 临高县| 海口市| 嘉鱼县| 绿春县| 万荣县| 专栏| 哈密市| 张家川| 环江| 衡阳县| 儋州市| 密山市| 尖扎县| 延津县| 永年县| 图们市| 长兴县| 新建县| 通化市| 湟中县|