国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

關(guān)于Node.js的__dirname,__filename,process.cwd(),./文件路

harryhappy / 2414人閱讀

摘要:先把當(dāng)成文件,依次查找當(dāng)前目錄下的,找到了,就返回該文件,不再繼續(xù)執(zhí)行。那么關(guān)于正確的結(jié)論是在中使用是跟的效果相同,不會因為啟動腳本的目錄不一樣而改變,在其他情況下跟效果相同,是相對于啟動腳本所在目錄的路徑。

起因

原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關(guān)注最新動態(tài),大家一起多交流學(xué)習(xí),共同進步,以學(xué)習(xí)者的身份寫博客,記錄點滴。

最近在學(xué)習(xí)Node.js里面的fs模塊,遇到了一個比較詭異的現(xiàn)象,踩到了坑,就是讀取當(dāng)前目錄下的一個文件,死活讀取不到,由于之前對于Node.js里面的path模塊也不太熟悉,也沒系統(tǒng)研究過,所以今天就踩了這個坑,記錄踩坑的過程,防止以后踩坑和大家也踩坑。

說一下當(dāng)時的情形:

我納悶的很半天,我明明就是讀取當(dāng)前目錄下的1.findLargest.js,為什么提示找不到這個文件,運行了幾遍,死活找不到1.findLargest.js這個文件。

后來才發(fā)現(xiàn)是因為運行這個文件不是從當(dāng)前目錄運行了,從圖中可以看出,當(dāng)前的目錄是/Users/jawil/Desktop/nodejs/demo/ES6-lottery/syntax/nodejs,而我運行這個腳本的目錄是/Users/jawil/Desktop/nodejs/demo/ES6-lottery;這就是問題的所在了。不過為什么運行腳本的位置也會影響這個路徑呢,且往下看。

探索

計算機不會欺騙人,一切按照規(guī)則執(zhí)行,說找不到這個文件,那肯定就是真的找不到,至于為什么找不到,那就是因為我們理解有偏差,我最初理解的"./"是當(dāng)前執(zhí)行js文件所在的文件夾的絕對路徑,然后Node.js的理解卻不是這樣的,我們慢慢往下看。

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

簡單說一下這幾個路徑的意思,:

__dirname:    獲得當(dāng)前執(zhí)行文件所在目錄的完整目錄名
__filename:   獲得當(dāng)前執(zhí)行文件的帶有完整絕對路徑的文件名
process.cwd():獲得當(dāng)前執(zhí)行node命令時候的文件夾目錄名 
./:           文件所在目錄

先看一看我電腦當(dāng)前的目錄結(jié)構(gòu):

syntax/
    -nodejs/
        -1.findLargest.js
        -2.path.js
        -3.fs.js
    -regs
        -regx.js
        -test.txt

在 path.js 里面我們寫這些代碼,看看輸出是什么:

const path = require("path")
console.log("__dirname:", __dirname)
console.log("__filename:", __filename)
console.log("process.cwd():", process.cwd())
console.log("./:", path.resolve("./"))

在當(dāng)前目錄下也就是nodejs目錄運行 node path.js,我們看看輸出結(jié)果:

__dirname:     /Users/jawil/Desktop/nodejs/demo/ES6-lottery/syntax/nodejs
__filename:    /Users/jawil/Desktop/nodejs/demo/ES6-lottery/syntax/nodejs/2.path.js
process.cwd(): /Users/jawil/Desktop/nodejs/demo/ES6-lottery/syntax/nodejs
./:            /Users/jawil/Desktop/nodejs/demo/ES6-lottery/syntax/nodejs

然后在 項目根目錄ES6-lottery 目錄下運行 node syntax/nodejs/2.path.js,我們再來看看輸出結(jié)果:

__dirname:     /Users/jawil/Desktop/nodejs/demo/ES6-lottery/syntax/nodejs
__filename:    /Users/jawil/Desktop/nodejs/demo/ES6-lottery/syntax/nodejs/2.path.js
process.cwd(): /Users/jawil/Desktop/nodejs/demo/ES6-lottery
./:            /Users/jawil/Desktop/nodejs/demo/ES6-lottery

答案顯而易見?我們可以通過上面的例子對比,暫時得出表面的結(jié)論:

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

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

process.cwd(): 總是返回運行 node 命令時所在的文件夾的絕對路徑

./: 跟 process.cwd() 一樣,返回 node 命令時所在的文件夾的絕對路徑

但是,我們再來看看這個例子,我們在上面的例子加幾句代碼,然后:

我們在1.findLargest.js先加這句代碼

exports.A = 1;

再來在剛才報錯的3.fs.js里面加這兩句代碼看看:

const test = require("./1.findLargest.js");

console.log(test)

運行node syntax/nodejs/3.fs.js,最后看看結(jié)果:

再次疑惑

為什么都是讀取./1.findLargest.js文件,一樣的路徑,為什么require能獲取到,而readFile讀取不到呢?

于是查了不少資料,看到了一些關(guān)于require引入模塊的機制,從中學(xué)到了不少,也明白了為什么是這樣。

我們先了解一下require() 的基本用法:

下面的內(nèi)容來自require() 源碼解讀,由阮一峰翻譯自《Node使用手冊》。

我們從第(2)小條的a部分可以看出:

(2)如果 X 以 "./" 或者 "/" 或者 "../" 開頭 
  a. 根據(jù) X 所在的父模塊,確定 X 的絕對路徑。
  b. 將 X 當(dāng)成文件,依次查找下面文件,只要其中有一個存在,就返回該文件,不再繼續(xù)執(zhí)行。

const test = require("./1.findLargest.js")按照上面規(guī)則翻譯一遍就是:

根據(jù)1.findLargest.js所在的父模塊,確定1.findLargest.js的絕對路徑為/Users/jawil/Desktop/nodejs/demo/ES6-lottery/syntax/nodejs,關(guān)于其中的尋找細(xì)節(jié)這里不做探討。

先把1.findLargest.js當(dāng)成文件,依次查找當(dāng)前目錄下的1.findLargest.js,找到了,就返回該文件,不再繼續(xù)執(zhí)行。

根據(jù)require的基本規(guī)則,對于上面出現(xiàn)的情形也就不足為奇了,更多require的機制和源碼解讀,請移步:
require() 源碼解讀

那么關(guān)于 ./ 正確的結(jié)論是:
在?require()?中使用是跟?__dirname?的效果相同,不會因為啟動腳本的目錄不一樣而改變,在其他情況下跟?process.cwd()?效果相同,是相對于啟動腳本所在目錄的路徑。

總結(jié):

__dirname: 獲得當(dāng)前執(zhí)行文件所在目錄的完整目錄名

__filename: 獲得當(dāng)前執(zhí)行文件的帶有完整絕對路徑的文件名

process.cwd():獲得當(dāng)前執(zhí)行node命令時候的文件夾目錄名

./: 不使用require時候,./與process.cwd()一樣,使用require時候,與__dirname一樣

只有在?require()?時才使用相對路徑(./, ../) 的寫法,其他地方一律使用絕對路徑,如下:

// 當(dāng)前目錄下
 path.dirname(__filename) + "/path.js"; 
// 相鄰目錄下
 path.resolve(__dirname, "../regx/regx.js");

最后看看改過之后的結(jié)果,不會報錯找不到文件了,不管在哪里執(zhí)行這個腳本文件,都不會出錯了,防止以后踩坑。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/112005.html

相關(guān)文章

  • 關(guān)于Node.js__dirname__filenameprocess.cwd(),./文件

    摘要:先把當(dāng)成文件,依次查找當(dāng)前目錄下的,找到了,就返回該文件,不再繼續(xù)執(zhí)行。那么關(guān)于正確的結(jié)論是在中使用是跟的效果相同,不會因為啟動腳本的目錄不一樣而改變,在其他情況下跟效果相同,是相對于啟動腳本所在目錄的路徑。 起因 原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關(guān)注最新動態(tài),大家一起多交流學(xué)習(xí),共同進步,以學(xué)習(xí)者的身份寫博...

    pumpkin9 評論0 收藏0
  • 作為一個前端工程師也要掌握幾種文件徑知識

    摘要:前言之前在做配置時候多次用到路徑相關(guān)內(nèi)容,最近在寫項目的時候,有一個文件需要上傳到阿里云的功能,同時本地服務(wù)器也需要保留一個文件備份。如果返回的路徑字符串長度為零,那么他會返回一個,代表當(dāng)前的文件夾。 showImg(https://segmentfault.com/img/bVbwElJ?w=480&h=204); 前言 之前在做webpack配置時候多次用到路徑相關(guān)內(nèi)容,最近在寫項...

    wslongchen 評論0 收藏0
  • Node.js新手上——動手?jǐn)]一個靜態(tài)資源服務(wù)器

    摘要:簡介本文介紹了一個簡單的靜態(tài)資源服務(wù)器的實例項目,希望能給初學(xué)者帶來幫助。作為一個靜態(tài)資源服務(wù)器,我們當(dāng)然要加上這個功能。聲明腳本執(zhí)行類型在文件的開頭加上否則上運行會報錯。 簡介 本文介紹了一個簡單的靜態(tài)資源服務(wù)器的實例項目,希望能給Node.js初學(xué)者帶來幫助。項目涉及到http、fs、url、path、zlib、process、child_process等模塊,涵蓋大量常用api;...

    chemzqm 評論0 收藏0
  • node Express 框架

    哈。github的地址已經(jīng)更換,求starthttps://github.com/mySoul8012 繼續(xù)~Express框架 簡單介紹一下 Express事實上Node內(nèi)置的http模塊上構(gòu)建的一層抽象。理論上所有Express實現(xiàn)的功能都能用Node實現(xiàn)核心特征; 設(shè)置中間件響應(yīng)http請求 定義路由表,執(zhí)行不同的http請求 先模板傳遞參數(shù),來動態(tài)的渲染html文件 一些網(wǎng)址 npm的...

    supernavy 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<