zoukankan      html  css  js  c++  java
  • node中glob模块总结

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

        

  • 相关阅读:
    hihocoder 1142 三分·三分求极值(三分)
    poj 3304 Segments(计算直线与线段之间的关系)
    poj 1269 Intersecting Lines(判断两直线关系,并求交点坐标)
    poj 2398 Toy Storage(计算几何 点线关系)
    poj 2318 TOYS(计算几何 点与线段的关系)
    计算几何基础(模板)
    Jmeter-基本组成
    java-面向对象
    性能测试基础
    java-多线程
  • 原文地址:https://www.cnblogs.com/yyy6/p/9384829.html
Copyright © 2011-2022 走看看