node中glob模塊總結

  參考文章:   githup_glob    node-glob學習javascript

  前言: 最近在學習webpack配置, 其中有一項glob配置入口文件, 來獲取對應的文件名, 達到入口entry和output文件名一致.html

  那麼什麼是glob ? 所謂的 glob 模式是指 shell 所使用的簡化了的正則表達式。星號(*)匹配零個或多個任意字符;[abc]匹配任何一個列在方括號中的字符(這個例子要麼匹配一個 a,要麼匹配一個 b,要麼匹配一個 c);問號(?)只匹配一個任意字符;若是在方括號中使用短劃線分隔兩個字符,表示全部在這兩個字符範圍內的均可以匹配(好比 [0-9] 表示匹配全部 0 到 9 的數字.java

  不一樣語言的 glob 庫支持的規則會略有不一樣, 今天筆記重點是分析node語言中glob的用法. 這個glob工具基於javascript.它使用了 minimatch 庫來進行匹配node

  node-glob主要匹配規則以下:webpack

  1. * 匹配任意0或多個任意字符
  2. ? 匹配任意一個字符
  3. [...] 如字符在中括號中, 則匹配; 如以 ! 或 ^ 開頭, 如字符不在中括號中, 則匹配
  4. !( pattern | pattern | pattern ) 不知足括號中的全部模式則匹配
  5. ?( pattern | pattern | pattern ) 知足0或1括號中的模式則匹配
  6. +( pattern | pattern | pattern )知足1或更多括號中的模式則匹配
  7. *( a | b | c )知足0或更多括號中的模式則匹配
  8. @( pattern | pat* | pat?erN ) 知足1個括號中的模式則匹配
  9. ** 跨路徑匹配任意字符
  10. 在解析路徑模型的時候, 大括號裏用多個逗號隔開的內容會被展開, 裏面的部分也能夠包含"/" ,好比  a{/b/c, bcd}  會被展開成 a/b/c 和 abcd 

 先舉例以下 文件格式以下,  同一目錄下git

├── app.js // 入口文件
├── js
│   ├── a1.js
│   ├── c.js
│   ├── c_231.js
│   ├── d.js
│   ├── e5.js
│   └── f_icon.js
├── node_modules // 配置文件

  第一部分: github

   <一>,  * 匹配該路徑段中0個或多個任意字符 ( 獲取js目錄下的全部js文件.(不包括以'.'開頭的文件) )web

glob("./js/*.js",{},function (err,files) {
    // 若是 `nonull` 選項被設置爲true, 並且沒有找到任何文件,那麼files就是glob規則自己,而不是空數組
    console.log(files);

});

/*    [ './js/a1.js',
        './js/c_231.js',
        './js/c.js',
        './js/d.js',
        './js/e5.js',
        './js/f_icon.js' ]
*/

  <二>,  ? : 匹配該路徑段中1個任意字符 ( 獲取js目錄下全部名字只有1個字的js. )正則表達式

glob("./js/?.js",{},function (err,files) {
    console.log(files);

});

// [ './js/c.js', './js/d.js' ]

  <三>,  [...] : 匹配該路徑段中在指定範圍內字符 ( 注意不能組合,只能是其中一個字符 )shell

glob("./js/*[0-9].js",{},function (err,files) {
    console.log(files);

});

// [ './js/a1.js', './js/c_231.js', './js/e5.js' ]

  <四>, *(pattern|pattern|pattern) : 匹配括號中多個模型的0個或多個或任意個的組合, 注意先後不能有空格.

glob("./js/*(c|d|f_|e|5|i|c|o|n).js",{},function (err,files) {
console.log(files);

});

// [ './js/c.js', './js/d.js', './js/e5.js', './js/f_icon.js' ]

  <五>, !(pattern|pattern|pattern) : 匹配不包含任何模型   ( 獲取js目錄下名字中不包含c,也不包含d, 也不包好e5的全部文件. ) 

glob("./js/!(c|d|e5).js",{},function (err,files) {
    console.log(files);

});

// [ './js/a1.js', './js/c_231.js', './js/f_icon.js' ]

  <六>, ?(pattern|pattern|pattern) : 匹配多個模型中的0個或任意1個. 它和 <四> 的區別是,不能夠組合.必須徹底匹配 ( 獲取js目錄下c.js,d.js ) 

glob("./js/?(c|d|f_|e|5|i|c|o|n).js",{},function (err,files) {
    console.log(files);

});

// [ './js/c.js', './js/d.js' ]

  <七>, +(pattern|pattern|pattern) : 匹配多個模型中的1個或多個, 能夠組合

   它和 4 的區別是,必須有一個,爲空不匹配

glob("./js/+(c|d|f_|e|5|i|c|o|n).js",{},function (err,files) {
    console.log(files);

});

// [ './js/c.js', './js/d.js', './js/e5.js', './js/f_icon.js' ]

  <八>, @(pattern|pat*|pat?erN) : 匹配多個模型中的任意1個

glob("./js/@(c|d|f_|e|5|i|c|o|n).js",{},function (err,files) {
    console.log(files);

});

// [ './js/c.js', './js/d.js' ]

   <九>, ** : 和 1 同樣,能夠匹配任何內容,但**不只匹配路徑中的某一段,並且能夠匹配 'a/b/c' 這樣帶有'/'的內容,因此,它還能夠匹配子文件夾下的文件. 

  第二部分: 

  到此爲止, 以上九種方法都是異步獲取, 對於node同一種方法, 既有異步也有同步,

  若是須要同步的獲取文件列表,能夠這樣作:

var files = glob.sync(pattern, [options])

  第三部分: 

  經過實例化一個glob.Glob類,能夠得到一個glob對象:

  1. 實例glob, 和異步參數方法同樣.

const Glob = require('glob');

let mg = new Glob("./js/*.js", {}, function (err,files) {
    console.log(files);
});

  2. 實例對應事件, 方法,屬性彙總

  2.1 方法

  • end :  end事件會在文件匹配結束,找出全部匹配結果的時候觸發,它接受的參數就是找到的文件的數組
  • match :  match事件會在每次匹配到一個文件的時候觸發,它接受的參數就是匹配到的文件
  • error :  error事件會在匹配遇到錯誤的時候觸發.接受的參數就是錯誤信息
  • abort :  當實例調用了.abort()方法時,abort事件被觸發

  2,2 方法

  • pause 暫停匹配搜索
  • resume 繼續匹配搜索
  • abort 永遠中止匹配搜索,不能繼續

  2.3 屬性

  • minimatch glob所使用的minimatch對象.
  • options 傳遞給函數的options選項.
  • aborted 調用過abort()函數後它的值就是true.
  • cache
  • statCache
  • symlinks
  • realpathCache 

  舉例說明

 

const Glob = require('glob');

let mg = new Glob("./js/*.js", {}, function (err,files) {
    // console.log(files);
});

mg.on('end',function (files) {
    console.log(files, 'end');
});
mg.on('match',function (file) {
    console.log(file,'match');
});
mg.on('error',function (err) {
    console.log(err,'err');
});
mg.on('abort',function () {
    console.log('abort');
});

mg.pause();
mg.resume();
mg.abort();

  打印結果

./js/a1.js match
./js/c.js match
./js/c_231.js match
./js/d.js match
./js/e5.js match
./js/f_icon.js match
[ './js/a1.js',
  './js/c_231.js',
  './js/c.js',
  './js/d.js',
  './js/e5.js',
  './js/f_icon.js' ] 'end'
yuyayongdeMacBook-Air:stu_03 yuyayong$ node app.js
abort

  3. options參數請參照官網  glob-options

相關文章
相關標籤/搜索