参考文章:   githup_glob    node-glob学习

  前言: 最近在学习webpack配置, 其中有一项glob配置入口文件, 来获取对应的文件名, 达到入口entry和output文件名一致.

  那么什么是glob ? 所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*)匹配零个或多个任意字符;[abc]匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字.

  不同语言的 glob 库支持的规则会略有不同, 今天笔记重点是分析node语言中glob的用法. 这个glob工具基于javascript.它使用了 minimatch 库来进行匹配

  node-glob主要匹配规则如下:

  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 

 先举例如下 文件格式如下,  同一目录下

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

 第一部分: 

   <一>,  * 匹配该路径段中0个或多个任意字符 ( 获取js目录下的所有js文件.(不包括以'.'开头的文件) )

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' ]

  <三>,  [...] : 匹配该路径段中在指定范围内字符 ( 注意不能组合,只能是其中一个字符 )

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

    

node中glob模块总结的更多相关文章

  1. node中glob模块

    glob glob允许使用规则,从而获取对应规则匹配的文件 node的glob模块允许你使用 * 等符号,来写一个glob规则,像在shell里一样,获取匹配对应规则文件 安装 npm install ...

  2. Node中的模块系统

    加载require var 自定义变量名称 = require('模块') 两个作用: 执行被加载模块的代码 得到被加载模块中的exports导出接口对象 导出exports node中是模块作用域, ...

  3. node 中第三方模块的加载过程原理

    node 中第三方模块的加载过程原理 凡是第三方模块都必须通过 npm 来下载 使用的时候就可以通过require('包名') 的方式来进行加载才可以使用 不可能有任何一个第三方包和核心模块的名字是一 ...

  4. node中的模块

    模块 编写稍大一点的程序时一般都会将代码模块化.在NodeJS中,一般将代码合理拆分到不同的JS文件中,每一个文件就是一个模块,而文件路径就是模块名. 在编写每个模块时,都有require.expor ...

  5. Node中的模块引入机制

    1.如果模块在当前目录下,可以通过下面语句将模块引入进来,注意需要使用 "./"表示当前路径 const currency = require('./currency'); ←-- ...

  6. Node中导入模块require和import??

    转自:https://blog.csdn.net/wxl1555/article/details/80852326 S6标准发布后,module成为标准,标准的使用是以export指令导出接口,以im ...

  7. Python学习-33.Python中glob模块的一些参数

    glob模块中有一个叫glob的方法可以获取某个目录下的文件. import glob temp=glob.glob("E:\\Temp\\*.txt") print(temp) ...

  8. 使用node中mysql模块连接本地数据库

    连接数据库的方法迄今为止学了三种: cmd方式.可视化工具,今天记第三种----node端连接数据库. 一:mysql模块介绍与下载 1.mysql模块是node端专门连接数据库的第三方模块 2.下载 ...

  9. node中fs模块 - fs.open() fs.read() fs.write() fs.close()

    var fs = require('fs') fs.open('./a.txt', 'a+', function(err, fd) { // 打开文件后 创建缓冲区放置数据 ), // 读取多少字节 ...

随机推荐

  1. 【java】@SuppressWarnings

    作用:用于抑制编译器产生警告信息. 示例1——抑制单类型的警告: 示例2——抑制多类型的警告: 示例3——抑制所有类型的警告: 三.注解目标 通过 @SuppressWarnings 的源码可知,其注 ...

  2. Object.defineProperty 中的 writable 和 configurable 和 enumerable 的理解

    在现在比较新的框架中, 比如 reactjs, vuejs中用得很多的一个属性便是 Object.defineOProperty 此属性的文档在网上一搜, 其中的几个属性, 包括 存取描述符(有set ...

  3. CSS属性相关知识

    Css选择器 选择器的权重 在css中,哪个选择器的权重高,就走谁的样式. 标签选择器的权重是 1 Class选择器的权重是10 Id选择器的权重是100 行间样式的权重是1000 带有关键字 !im ...

  4. Cookie,Session,Token and Oauth

    Cookie 服务器端生成,发送给客户端,保存用户信息.下一次请求同一网站时会把该cookie发送给服务器. 应用:登录表单自动填充,同样 随着交互式Web应用的兴起,像在线购物网站,需要登录的网站等 ...

  5. 基于 HTML5 WebGL 的 3D 智慧隧道漫游巡检

    前言 这次为大家展示的是通过 HT for Web 灵活的图型化编辑工具打造的智慧隧道监控系统.通过 HTML5 技术实现了桌面和移动端的跨平台性,同时现实了可视化运维. 这次主要跟大家分享里面的漫游 ...

  6. 前端学习:HTML的学习总结(图解)

    .html 文件代码笔记 前端学习:HTML的学习总结(图解) HTML简介 HTML基本标签 HTML表单标签 HTML内联框架标签和其他

  7. 【学习笔记】C#中的泛型和泛型集合

    一.什么是泛型? 泛型是C#语言和公共语言运行库(CLR)中的一个新功能,它将类型参数的概念引入.NET Framework.类型参数使得设计某些类和方法成为可能,例如,通过使用泛型类型参数T,可以大 ...

  8. C# VB .NET生成条形码,支持多种格式类型

    条形码简单,方便印刷,因此在各个领域得到了广泛的应用.我们自己的项目里也可以将一些特定的数据以条形码的方式来展示和应用,实现一码走天下.那么如何在C#,.Net平台代码里生成条形码呢?答案是使用Sha ...

  9. net dll 重新签名

    已经有强签名的dll或exe程序无法引用无签名的dll,这时候就需要对dll进行签名,签名的步骤如下: 为没有源码的DLL文件添加强名称 如果项目中引用了其他没有源码的dll文件,并且此dll文件是没 ...

  10. Python关于多继承

    大部分面向对象的编程语言(除了C++)都只支持单继承,而不支持多继承,为什么呢?因为多继承不仅增加编程复杂度,而且容易导致莫名其妙的错误. Python虽然语法上支持多继承,但是却不推荐使用多继承,而 ...