__dirname與./的區別
Node.js中,__dirname總是指向被執行js文件的絕對路徑,所以當你在/d1/d2/myScript.js文件中寫了__dirname,它的值就是/d1/d2
./會返回你執行node命令的路徑,
比如你在目錄D盤下執行d1/d2/myScript.js
__dirname是d:/d1/d2
./指的是d:/
有一個特殊情況在require()中使用./時,這時的路徑就會是含有require()的腳本文件的相對路徑
例如:
假如有如下目錄結構:
/dir1 /dir2 /pathtest.js
pathtest.js
const path=require('path'); console.log('.= %s',path.resolve('__dirname')); console.log('__dirname= %s',path.resolve('.'));
然后執行下面的代碼:
cd /dir1/dir2
node pathtest.js
結果:
. = /dir1/dir2
__dirname = /dir1/dir2
如果我們的工作目錄是dir1
cd /dir1
node dir2/pathtest.js
結果:
. = /dir1 __dirname = /dir1/dir2
此時,.指向我們的工作目錄,即/dir1,__dirname還是指向/dir1/dir2
在require中使用.
如果在dir2/pathtest.js中調用了require方法,去引入位於dir1目錄的js文件,你需要寫成
require('../pathtest.js')
因為require中的路徑總是相對於包含它的文件,跟你的工作目錄沒有關系。
path.resolve([...paths]) 根據參數解析出一個絕對路徑
傳入參數:.../paths是傳入的字符串參數,是路徑序列或者路徑片段
返回值:字符串
以應用程序為根目錄
普通字符串代表子目錄
/代表絕對路徑根目錄
使用方法:
1 path.resolve()方法可以將路徑或者路徑片段解析成絕對路徑
2 傳入的路徑從右至左被處理,后面每個path被依次解析,直到構造完成一個絕對路徑。例如:path.resolve(‘/foo’,‘/bar’,‘baz’),將返回:/bar/baz
3 如果處理完全部給定的path片段后還未生成一個絕對路徑,則當前工作目錄(絕對路徑)會被用上。
4 當傳入的參數沒有/時,將被傳入解析到當前根目錄
5 零長度的路徑將被忽略
6 如果沒有傳入參數,將返回當前根目錄
path.resolve('/foo/bar', './baz') // Returns: '/foo/bar/baz' path.resolve('/foo/bar', '/tmp/file/') // Returns: '/tmp/file' path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif') // if the current working directory is /home/myself/node, // this returns '/home/myself/node/wwwroot/static_files/gif/image.gif'
1 傳入的路徑從右向左解析,遇到第一個絕對路徑時完成解析
2 ‘../’方法向前跳了一個目錄
path.resolve()是一個修改和整合文件路徑的方法
__dirname
運行下面的代碼:
執行結果:
1.只傳入__dirname也可以自動調用path.resolve方法
2.可以拼接路徑字符串,但是不調用path.resolve()方法拼接失敗
3.__dirname代表的是當前文件(a.js)的絕對路徑
4.從右至左解析,遇到了絕對路徑/src,因此直接返回
resolve:{ //解析擴展名 extensions:[], alias:{ // 快捷訪問入口 “util”:path.resolve(__dirname,'./src/util') } }
path.join([...paths])
path.join() 方法使用平台特定的分隔符把全部給定的 path 片段連接到一起,並規范化生成的路徑。就是把多個參數字符串合並為一個路徑字符串
參考1:https://blog.csdn.net/zsensei/article/details/79094714
參考2:https://www.jianshu.com/p/76966243f27f