node-glob

802 阅读5分钟

node-glob

新学了一个库node-glob, 简单翻译了下它的README.md. 目的是为了让自己学的更扎实, 也能给大家提供方便.
原文链接

安装与使用

npm i glob
var glob = require("glob")

// options是可选的
const pattern = `used/*.js`
const options = {}
glob ("**/*.js", options, function (er, files) { 
  // files是文件名数组
  // //如果设置了`nonull`选项,并且
  //没有找到,则文件为[ "**/*.js"] 
  // er是错误对象或null.
})

说明

Globs就像是您在命令行输入ls *.js或在.gitignore文件中输入类似build/*的规则。

在解析路径部分的句型时,大括号括起来的部分会被扩展为一个集合。大括号部分以{开头并以}结尾,其中包含任意多个逗号分隔的部分。括号部分可能包含斜杠字符 /,因此a{/b/c,bcd}将扩展为a/b/cabcd

pattern

在 pattern 中使用以下字符具有特殊的“魔法含义”

  • *在单个路径部分匹配0个或更多字符
  • ?匹配1个字符
  • [...]匹配一个字符范围,类似于RegExp范围。如果范围的第一个字符是!^则它匹配所有不在范围内的字符。
  • !(pattern|pattern|pattern) 与提供的匹配规则都不匹配的所有内容。
  • ?(pattern|pattern|pattern) 匹配规则零个或一个。
  • +(pattern|pattern|pattern) 匹配规则的一个或多个。
  • *(a|b|c) 匹配提供规则零个或多个。
  • @(pattern|pat*|pat?erN) 只匹配提供的一种规则
  • **如果路径部分中只有一个globstar,则它将匹配零个或多个搜索匹配项的目录和子目录。它不对符号链接目录进行搜索匹配。

options

所有可以被传入Minimatch的参数都可以传给glob的options, 当然有些事新加入的, 也有些是glob特定的衍生物.

所有的options配置属性都默认为false, 除非另有说明.

所有的options也都被Glob对象上了.

如果你运行很多glob操作, 你可以穿一个Glob对象作为options参数作为后续工序来快捷化一些统计, 至少, 你可以设置一下共同的 symlinks, statCache, realpathCache, 以及 cache options, 因此并发的glob程序可以通过共享的关于文件系统的信息从而起到加速效果.

  • dot: boolean // default: false

如果一个文件或目录名以 . 开头, 那么除非你的path里的匹配规则也以.开头, 否则, 你将匹配不到这个文件或目录. 例如, 这个规则a/.*/c会匹配a/.b/c, 但不会匹配a/*/c, 因为*不会匹配一个.符号. 你可以在options里设置dot:true, 来使.被当作一个普通字符被匹配.

  • matchBase:boolean // default: false

如果你在options里设置matchBase: true, 并且匹配规则里没有/字符, 那么会匹配当前目录以及所有子目录的里的符合该匹配规则的文件, 例如*.js会匹配该目录以及所有子目录里的所有js文件

  • nonull:boolean // default: false

如果没有匹配到任何文件, 那么file会返回一个空数组, 在options里设置nonull:true, 可以讲原匹配规则返回

  • noext:boolean // default: false

glob.hasMagic(pattern, [options]) , 如果匹配规则pattern里有上述的“魔法含义”, 则会返回true, 否则为false
如果在options里设置noext:true, 那么pattern 为 +(a|b), 则会返回false. 但是a/{b/c,x/y}总是会返回true.

  • cwd: string // default: process.cwd(), 指定匹配的起始目录,会和pattern共同影响匹配结果.
  • root: string: // default: path.resolve(process.cwd(), "/"), 指定根目录

剩下的可以去看看原文档

glob.hasMagic(pattern, [options])

glob(pattern, [options], cb)

  • pattern {String} 匹配规则
  • options {Object}
  • cb {Function}
    • err {Error | null}
    • matches {Array<String>} 符合匹配规则的文件名数组

glob.sync(pattern, [options])

  • pattern {String} 匹配规则
  • options {Object}
  • return: {Array<String>} 符合匹配规则的文件名数组

Class: glob.Glob

创建一个实例化的glob.Glob类. 像这样

var Glob = require("glob").Glob
var mg = new Glob(pattern, options, cb)

这是一个事件触发器, 它会搜索文件系统, 并立即返回匹配到的文件

new glob.Glob(pattern, [options], [cb])

  • pattern {String} 匹配规则
  • options {Object}
  • cb {Function}
    • err {Error | null}
    • matches {Array<String>} 符合匹配规则的文件名数组

如果在options里设置sync:true, 那么匹配结果可以立即在实例的found属性里获取到

glob.Glob的实例的属性

  • minimatch: glob使用的minimatch属性

  • options: glob使用的options参数

  • aborted: boolean类型, 当实例调用abort()时会被设置为true. 这时中断以后就再也没办法再继续文件搜索里, 但是你可以使用statCache来避免重复的系统调用.

  • cache: 这时一个很方便的属性. 有以下可能的值:

    • false - 匹配路径不存在
    • true - 匹配路径存在
    • 'FILE' - 匹配路径存在, 并且不是一个路径
    • 'DIR' - 匹配路径存在, 并且是一个路径
    • [file, entries, ...] - 匹配路径存在, 是一个目录, 并且数组的值是fs.readdir的结果
    • statCache: fs.stat结果的缓存, 防止多次重复统计同一个匹配路径
    • symlinks 路径是符号链接的一个记录, 和处理 ** 的匹配规则相关.
    • realpathCache 是一个可选的对象, 通过传给fs.realpath来最小化不必要的系统调用.存储在实例化的Glob对象中, 可能会被重用.

    Events

  • end: 当匹配结束的, 所有的匹配结果都拿到的时候, 会触发这个事件. 如果options里设置了nonull: true, 并且没有匹配到任何结果, 那么matches会返回原始的匹配规则 pattern. 匹配结果matches会排好序, 除非设置了nosort.

g.on('end'(matches) => {
  console.log(matches)
})
  • match: 每一次匹配到一个结果时, 这个事件就会出发, 回调里会返回当前匹配到的结果. 不会重复也不会解析为一个realpath.
g.on('match'(file) => {
  console.log(file)
})
  • abort: 当abort()被调用, 这个事件就会被触发.
g.on('abort', () => {
  console.log('glob is aborted')
})
g.abort();

Methods

  • pause: 暂停匹配搜索
  • resume: 继续匹配搜索
  • abort: 永久停止搜索
const glob = require("glob")
const pattern = 'modules/*.js'
const options = {}
const g = new glob.Glob(pattern, options)
g.pause()
g.resume()
g.abort()