参考文章:   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后台)

    文章导读 一.回眸过去-- 闲扯的话-- 零碎的技术 二.经验总结-- 沟通交流-- 贵在坚持-- 合理规划 三.展望未来-- 积累行业背景-- 学习清单 四.最后补充 一. 回牟过去 1.闲扯的话 ...

  2. T430 Linux Setting Memo

    touchpad:xinput listxinput --disable 11 dns setting:/etc/resolv.conf vpn:@Darkduck19XX yum-config-ma ...

  3. 数据结构——链栈(link stack)

    /* linkStack.c */ /* 链栈 */ #include <stdio.h> #include <stdlib.h> #include <stdbool.h ...

  4. NLP之关键词提取(TF-IDF、Text-Rank)

    1.文本关键词抽取的种类: 关键词提取方法分为有监督.半监督和无监督三种,有监督和半监督的关键词抽取方法需要浪费人力资源,所以现在使用的大多是无监督的关键词提取方法. 无监督的关键词提取方法又可以分为 ...

  5. [LeetCode] 221. Maximal Square 最大正方形

    Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and ret ...

  6. [LeetCode] 34. Find First and Last Position of Element in Sorted Array 在有序数组中查找元素的第一个和最后一个位置

    Given an array of integers nums sorted in ascending order, find the starting and ending position of ...

  7. zlib: 不同语言,比如go, php, python 压缩的结果可能不同

    1.这个是实际工作中发现的问题,一边用了go语言对一个文件进行了zlib压缩,然后我用 php 写了个脚本对同一个文件进行zlib压缩,但是生成的两个文件不同,当时一直以为是压缩参数选择错了,后来经过 ...

  8. JVM系列之五:垃圾回收

    . jdk1.7的堆内存 1. 堆(Java堆) 堆是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域, 在JVM启动时创建,该内存区域存放了对象实例(包括基本类型的变量及 ...

  9. vue.js三种安装方式

    Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易于上手 ...

  10. 每个php程序员都应该知道的15个最佳PHP库

    PHP是一种功能强大的web站点脚本语言,通过PHP,web网站开发者可以更容易地创建动态的引人入胜的web页面.开发人员可以使用PHP代码与一些网站模板和框架来提升功能和特性.然而,编写PHP代码是 ...