nodejs幾種檔案路徑及path模組

laihuamin發表於2017-10-26

前言

最近在寫一篇weex的webpack配置,剛剛踩坑了,weekpack中會用到path模組,而對於這個模組,我想抽離出來看一下,因為這個用到的還是比較多的,喜歡的朋友可以點個喜歡,或者去我的github點個star也行,謝謝支援,舉起小手指點一點哦?,寫的不對的地方,評論拍磚,謝謝。

node中的路徑分類

node中的路徑大致分5類,dirname,filename,process.cwd(),./,../,其中前三個都是絕對路徑

我們先來看一個簡單點的例子

假如,我有一個檔案的目錄結構如下:

editor/
  - dist/
  - src/
      - task.js複製程式碼

然後我們在task.js檔案中寫入一下程式碼

const path = require('path');
console.log(__dirname);
console.log(__filename);
console.log(process.cwd());
console.log(path.resolve('./'));複製程式碼

在editor目錄下執行node src/task.js,我們可以看到結果如下:

/Users/laihuamin/Documents/richEditor/editor/src
/Users/laihuamin/Documents/richEditor/editor/src/task.js
/Users/laihuamin/Documents/richEditor/editor
/Users/laihuamin/Documents/richEditor/editor複製程式碼

然後我們有可以在src目錄下執行這個檔案,node task.js,執行結果如下:

/Users/laihuamin/Documents/richEditor/editor/src
/Users/laihuamin/Documents/richEditor/editor/src/task.js
/Users/laihuamin/Documents/richEditor/editor/src
/Users/laihuamin/Documents/richEditor/editor/src複製程式碼

對比兩個輸出結果,我們可以歸納一下幾點:

1.__dirname:返回的是這個檔案所在資料夾的位置
2.__filename:你執行命令代表的是檔案所在的位置,不管你執行什麼命令,都是指向檔案
3.process.cwd():你執行node命令所在資料夾的位置,比如你在src目錄下執行,那麼就是輸出到src為止,下面的同理。

path

講完前面三個絕對路徑,我倒是挺想來聊聊path這個模組的,這個node模組在很多地方都有應用,所以,對於我們來說,掌握他,對我們以後的發展更有利,不用每次看webpack的配置檔案還要去查詢一下這個api是幹什麼用的,很影響我們的效率

nodeJS/path

上面那個網站有詳細的api,但是我們這裡不用都掌握吧,我就講幾個我遇到過的,我覺得webpack等工程配置中會用到的

path.normalize

這個方法就是把不規範的路徑規範化,比如看下面的例子

const path = require('path');
console.log(path.normalize('/foo/bar//baz/asdf/quux/..'));複製程式碼

輸出結果:

/foo/bar/baz/asdf複製程式碼

path.join

const path = require('path');
console.log(path.join('src', 'task.js'));

const path = require('path');
console.log(path.join('dist', 'task.js'));

const path = require('path');
console.log(path.join(''));複製程式碼

這麼兩個的輸出結果是:

src/task.js
dist/task.js
.複製程式碼

他的作用也就顯而易見,他有一下幾條規則:
1.傳入的引數是字串的路徑片段,可以是一個,也可以是多個

2.返回的是一個拼接好的路徑,但是根據平臺的不同,他會對路徑進行不同的規範化,舉個例子,Unix系統是”/“,Windows系統是”\“,那麼你在兩個系統下看到的返回結果就不一樣。

3.如果返回的路徑字串長度為零,那麼他會返回一個'.',代表當前的資料夾。

4.如果傳入的引數中有不是字串的,那就直接會報錯

path.parse

我們先來看個例子,在src目錄下的task.js寫入

const path = require('path');
console.log(path.parse('/Users/laihuamin/Documents/richEditor/editor'));複製程式碼

然後執行node src/task.js之後,輸出的結果如下:

{ 
  root: '/',
  dir: '/Users/laihuamin/Documents/richEditor',
  base: 'editor',
  ext: '',
  name: 'editor' 
}複製程式碼

他返回的是一個物件,那麼我們來把這麼幾個名詞熟悉一下:

path.parse
path.parse

這個表格應該展示的很形象,但是我們還是來解釋一下這些名詞:
1.root:代表根目錄
2.dir:代表檔案所在的資料夾
3.base:代表整一個檔案
4.name:代表檔名
5.ext: 代表檔案的字尾名

那我們根據下面的規則,來看一下下面這個例子,最好自己腦子做一遍

const path = require('path');
console.log(path.parse('/Users/laihuamin/Documents/richEditor/editor/src/task.js'));複製程式碼

輸出的結果:

{ 
  root: '/',
  dir: '/Users/laihuamin/Documents/richEditor/editor/src',
  base: 'task.js',
  ext: '.js',
  name: 'task' 
}複製程式碼

你做對了麼?0.0

path.basename

那有了前面這個鋪墊,想必這個介面猜也能猜的到了。。。。我們看下面這個例子

const path = require('path');
console.log(path.basename('/Users/laihuamin/Documents/richEditor/editor/src/task.js'));複製程式碼

輸出的結果是:

task.js複製程式碼

我們還是簡單介紹一下,接收兩個引數,一個是path,還有一個是ext(可選引數).

const path = require('path')
console.log(path.basename('/Users/laihuamin/Documents/richEditor/editor/src/task.js', '.js'));複製程式碼

輸出結果:

task複製程式碼

path.dirname

這個介面比basename還要簡單,我就不多說了,看例子,看結果

const path = require('path');
console.log(path.basename('/Users/laihuamin/Documents/richEditor/editor/src/task.js'));複製程式碼

輸出的結果:

/Users/laihuamin/Documents/richEditor/editor/src複製程式碼

注意一下,接收的引數是字串型別

path.extname

這個就是展示檔案的副檔名,我們得注意幾種情況

const path = require('path');
path.extname('index.html');
path.extname('index.coffee.md');
path.extname('index.');
path.extname('index');
path.extname('.index');複製程式碼

輸出的結果是:

.html
.md
.
''
''複製程式碼

自己注意一下這幾個情況

path.resolve

我們通過下面這幾個例子先來熟悉一下:

const path = require('path');
console.log(path.resolve('/foo/bar', '/bar/faa', '..', 'a/../c'));複製程式碼

輸出的結果是

/bar/c複製程式碼

他就相當於一堆cd操作,我們一步一步看

cd /foo/bar/    //這是第一步, 現在的位置是/foo/bar/
cd /bar/faa     //這是第二步,這裡和第一步有區別,他是從/進入的,也就時候根目錄,現在的位置是/bar/faa
cd ..       //第三步,從faa退出來,現在的位置是 /bar
cd a/../c   //第四步,進入a,然後在推出,在進入c,最後位置是/bar/c複製程式碼

但是這個操作和cd還是有區別的,這個路徑不一定要存在,而且最後的可以是檔案

path.relative

這個返回的是from到to的相對路徑,什麼意思呢,我們看下面的例子就知道了.

const path = require('path');
console.log(path.relative('src/bar/baz', 'src/aaa/bbb'));複製程式碼

輸出的結果是:

../../aaa/bbb複製程式碼

總結

這些比較實用的方法,分享給大家,自己還是老老實實去看weektool的webpack的配置檔案了,喜歡的朋友可以點個喜歡,或者去我的github點個star也行,謝謝支援,舉起小手指點一點哦?。

相關文章