webpack及node.js基礎必會--path模塊的常見操做

前言

在沒有相關經驗的同窗,在學習webpack和使用node時,常常會遇到__dirname path.resolve 等,這時每每會一臉懵逼這些都是什麼,幹嗎的,爲何這些資料和書都徹底不提,難道就我不知道 -。-html

其實path模塊是很常見很通用的。這裏我就簡單總結一些在項目中常常會用到的方法,幫助你們儘快掌握。node

1, 獲取規範化的路徑/路徑/文件名/擴展名

  • 獲取規範化的路徑:path.normaliz(filepath)
  • 獲取路徑:path.dirname(filepath)
  • 獲取文件名:path.basename(filepath)
  • 獲取擴展名:path.extname(filepath)

1.1獲取規範化的路徑格式

  • path.normalize() 方法會規範化給定的 path,並解析 '..' 和 '.' 片斷。
  • 當發現多個連續的路徑分隔符時(如 POSIX 上的 / 與 Windows 上的 \ 或 /),它們會被單個的路徑分隔符(POSIX 上是 /,Windows 上是 \)替換。 末尾的多個分隔符會被保留。
  • 若是 path 是一個長度爲零的字符串,則返回 '.',表示當前工做目錄。
path.normalize('C:\\temp\\\\foo\\bar\\..\\');
// 返回: 'C:\\temp\\foo\\'

var myPath = path.normalize(__dirname + '/test/a//b//../c/helloWorld.js');
console.log(myPath); //windows: E:\workspace\NodeJS\app\fs\test\a\c\helloWorld.js
複製代碼

PS:webpack

  • Windows系統下,'/'和'\'都可以表示路徑,可是在網絡連接裏只能用'/'表示路徑。
  • 若是 path 不是一個字符串,則拋出 TypeError。

1.2 獲取所在路徑

例子以下:git

var path = require('path');
var filepath = '/tmp/demo/js/test.js';

// 輸出:/tmp/demo/js
console.log( path.dirname(filepath) );

var myPath = path.dirname(__dirname + '/test/util/helloWorld.js');
console.log(myPath);

//Users/cayley/Documents/webpack-demo/test/util
複製代碼

__dirname是node.js中的一個全局變量,用來獲取當前模塊文件所在目錄的完整絕對路徑web

1.3 獲取文件名

嚴格意義上來講,path.basename(filepath) 只是輸出路徑的最後一部分,並不會判斷是否文件名。windows

但大部分時候,咱們能夠用它來做爲簡易的「獲取文件名「的方法。api

var path = require('path');

// 輸出:test.js
console.log( path.basename('/tmp/demo/js/test.js') );

// 輸出:test
console.log( path.basename('/tmp/demo/js/test/') );

// 輸出:test
console.log( path.basename('/tmp/demo/js/test') );
複製代碼

若是隻想獲取文件名,單不包括文件擴展呢?能夠用上第二個參數。bash

// 輸出:test
console.log( path.basename('/tmp/demo/js/test.js', '.js') );
複製代碼

1.4 獲取文件擴展名

簡單的例子以下:網絡

var path = require('path');
var filepath = '/tmp/demo/js/test.js';

// 輸出:.js
console.log( path.extname(filepath) );
複製代碼

更詳細的規則是以下:(假設 path.basename(filepath) === B )app

  • 從B的最後一個.開始截取,直到最後一個字符。

  • 若是B中不存在.,或者B的第一個字符就是.,那麼返回空字符串。

直接看官方文檔的例子

path.extname('index.html')
// returns '.html'

path.extname('index.coffee.md')
// returns '.md'

path.extname('index.')
// returns '.'

path.extname('index')
// returns ''

path.extname('.index')
// returns ''
複製代碼

2, 路徑組合

  • path.join([...paths])

  • path.resolve([...paths])

2.1 path.join([...paths])

path.join() 方法使用平臺特定的分隔符把所有給定的 path 片斷鏈接到一塊兒,並規範化生成的路徑。 長度爲零的 path 片斷會被忽略。 若是鏈接後的路徑字符串是一個長度爲零的字符串,則返回 '.',表示當前工做目錄。

參數說明: ...paths <string> 一個路徑片斷的序列。 返回:

paths拼起來,而後再normalize一下。意思就是會先把路徑拼接在一塊兒,而後進行規範化,返回正確的路徑。

例子以下:

var path = require('path');

// 輸出 '/foo/bar/baz/asdf'
path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
複製代碼

path定義的僞代碼以下:

module.exports.join = function(){
  var paths = Array.prototye.slice.call(arguments, 0);
  return this.normalize( paths.join('/') );
};
複製代碼

更多例子:

path.join('/foo', 'bar', 'baz/asdf', 'quux', '.');          // 返回 /foo/bar/baz/asdf/quux, "."和"/"沒什麼影響
path.join('/foo', './bar', 'baz/asdf', '.', 'quux');        // 返回 /foo/bar/baz/asdf/quux
path.join('/foo', './bar', './baz/asdf', 'quux', '..');     // 返回 /foo/bar/baz/asdf
path.join('/foo', 'bar', 'baz/asdf', '.', '.');             // 返回 /foo/bar/baz/asdf
path.join('/foo', 'bar', 'baz/asdf', 'quux');               // 返回 /foo/bar/baz/asdf/quux
path.join('/foo', 'bar', 'baz/asdf', '..', '..');           // 返回 /foo/bar 
複製代碼

2.2 path.resolve([...paths])

智能解析絕對路徑 path.resolve() 方法會把一個路徑或路徑片斷的序列解析爲一個絕對路徑。層級關係是從左到右的.

規則:
1\. 給定的路徑的序列是從右往左被處理的,後面每一個 path 被依次解析,直到構造完成一個絕對路徑。
2\. 若是處理徹底部給定的 path 片斷後還未生成一個絕對路徑,則當前工做目錄會被用上。
3\. 生成的路徑是規範化後的,且末尾的斜槓會被刪除,除非路徑被解析爲根目錄。
4\. 長度爲零的 path 片斷會被忽略。
5\. 若是沒有傳入 path 片斷,則 path.resolve() 會返回當前工做目錄的絕對路徑。
6\. path.resolve將以/開始的路徑片斷做爲根目錄,在此以前的路徑將會被丟棄,就像是在terminal中使用cd命令同樣。而path.join只是簡單的將該路徑片斷進行拼接
複製代碼

好比 path.resolve('/foo/bar', './baz') 能夠當作下面命令的結果

cd /foo/bar
cd ./baz
複製代碼

更多對比例子以下:

var path = require('path');

// 假設當前工做路徑是 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path

// 輸出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path
console.log( path.resolve('') )

// 輸出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path
console.log( path.resolve('.') )

// 輸出 /foo/bar/baz
console.log( path.resolve('/foo/bar', './baz') );

// 輸出 /foo/bar/baz
console.log( path.resolve('/foo/bar', './baz/') );

// 輸出 /tmp/file
console.log( path.resolve('/foo/bar', '/tmp/file/') );

// 輸出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path/www/js/mod.js
console.log( path.resolve('www', 'js/upload', '../mod.js') );
複製代碼

更多例子:

// 當前工做目錄與當前文件路徑(F:/1/2/task6/test/dist)有區別
path.resolve();                               // F:/1/2/task6/test 當前工做目錄的絕對路徑
path.resolve('./a');                          // F:/1/2/task6/test/a 
path.resolve('../a');                         // F:/1/2/task6/a
path.resolve('.');                            // F:/1/2/task6/test 
path.resolve('..');                           // F:/1/2/task6
path.resolve('/'));                           // F:/
path.resolve('./a','../c/d');                 // F:/1/2/task6/test/c/d
path.resolve('./a','./c/d');                  // F:/1/2/task6/test/a/c/d
path.resolve('/a','../c/d');                  // F:c/d
path.resolve('/a','./c/d');                   // F:/a/c/d
path.resolve('./a','/b','./c/d');             // F:/b/c/d
path.resolve('a','b','c/d');                  // F:/1/2/task6/test/a/b/c/d
path.resolve('./a','./b','c/d');              // F:/1/2/task6/test/a/b/c/d
path.resolve('./a','/b','c/d');               // F:/b/c/d
path.resolve('./a/b','..','c/d');             // F:/1/2/task6/test/a/c/d
path.resolve('./a','..','c/d');               // F:/1/2/task6/test/c/d 
複製代碼

3, 獲取相對路徑

接口:path.relative(from, to)

描述:從from路徑,到to路徑的相對路徑。

邊界:

  • 若是fromto指向同個路徑,那麼,返回空字符串。

  • 若是fromto中任一者爲空,那麼,返回當前工做路徑。

上例子:

var path = require('path');

var p1 = path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb');
console.log(p1);  // 輸出 "../../impl/bbb"

var p2 = path.relative('/data/demo', '/data/demo');
console.log(p2);  // 輸出 ""

var p3 = path.relative('/data/demo', '');
console.log(p3);  // 輸出 "../../Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path"
複製代碼

參考及感謝

Node入門教程(8)第六章:path 模塊詳解

相關文章
相關標籤/搜索