参考文章: 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
先举例以下 文件格式以下, 同一目录下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 方法
2,2 方法
pause
暂停匹配搜索resume
继续匹配搜索abort
永远中止匹配搜索,不能继续2.3 属性
minimatch
glob所使用的minimatch对象.options
传递给函数的options选项.aborted
调用过abort()
函数后它的值就是true.cache
举例说明
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