1、node命令路徑與js文件路徑
node命令路徑為node命令所執(zhí)行的目錄,js文件路徑指的是你要運(yùn)行的js所在的目錄。

如上圖所示:
server.js路徑為E:\zyp; node命令路徑我們可以選擇 E:\或 E:\node,即:
E:\zpy>node server.js
E:\>node zpy/server.js
后續(xù)我們將通過以上兩個(gè)不同的node命令來運(yùn)行server.js文件,分別對本文標(biāo)題所涉及的一些概念進(jìn)行測試,畢竟計(jì)算機(jī)是不是說慌的!
2、相對地址轉(zhuǎn)絕對地址
我們可以通過引入path內(nèi)置模塊,并使用其resolve()方法將相對路徑轉(zhuǎn)換為絕對路徑。
server.js:
const path = require("path");
console.log(path.resolve("./"));
運(yùn)行:
E:\zpy>node server.js
結(jié)果:
E:\zpy
E:\
3、比較__dirname、__filename以及./
server.js內(nèi)容:
const path = require("path");
console.log("__dirname: "+__dirname);
console.log("__filename: "+__filename);
console.log("./: "+path.resolve("./"));
E:\zpy>運(yùn)行命令:
E:\zpy>node server.js
運(yùn)行結(jié)果:
__dirname: E:\zpy
__filename: E:\zpy\server.js
./: E:\zpy
E:\>運(yùn)行命令:
E:\>node zpy/server.js
運(yùn)行結(jié)果:
__dirname: E:\zpy
__filename: E:\zpy\server.js
./: E:\
小結(jié):
- __dirname: 返回
js所在文件夾的絕對路徑 - __filename: 返回被執(zhí)行的
js的絕對路徑 - ./: 返回執(zhí)行
node命令的絕對路徑
4、再來看一個(gè)問題:
在server同級創(chuàng)建一個(gè)名字為mo.js的文件,該文件內(nèi)容:
module.exports.siteUrl = "http://www.zhangpeiyue.com";
server.js內(nèi)容修改如下:
const mo = require("./mo");
console.log(mo.siteUrl);
目前目錄結(jié)構(gòu)如下:

E:\zpy>運(yùn)行命令:
E:\zpy>node server.js
運(yùn)行結(jié)果:
http://www.zhangpeiyue.com
E:\>運(yùn)行命令:
E:\>node zpy/server.js
運(yùn)行結(jié)果:
http://www.zhangpeiyue.com
通過以上命令運(yùn)行結(jié)果,你會(huì)驚訝的發(fā)現(xiàn):在兩種不同的node命令路徑下,request引入地址采用相對地址"./"的情況下,不僅沒有發(fā)生異常,而且都可以調(diào)用到mo.js!
那是因?yàn)?code>request中的路徑總是相對于包含它的文件,跟你的工作目錄是沒有半毛錢關(guān)系的。
總結(jié):"./"在 require() 中使用與__dirname 的效果相同,不會(huì)因?yàn)檫\(yùn)行腳本的目錄不同而發(fā)生改變。
5、建議
使用require() 時(shí)可采用相對路徑(./, ../) 的寫法,其他務(wù)必使用絕對路徑。例如:
// 與當(dāng)前文件同目錄下的server.js
path.dirname(__filename) + '/server.js';
// 當(dāng)前目錄的上一級下的zpy文件中的server.js
path.resolve(__dirname, '../zpy/server.js');