前段时间在用workbox时,在做precache时,匹配模式基于的是Glob Pattern模式,于是就看了下相关文档。
下面翻译一下node-glob的使用,原文:https://github.com/isaacs/node-glob#glob-primer
Glob
像在shell里面,用*等匹配模式来匹配文件。
Glob基于Javascript实现,使用minimatch库进行匹配。
使用
使用npm安装
npm i glob
var glob = require("glob")// options可选
glob("**/*.js", options, function (er, files) {// files是匹配到的文件数组// 如果`options`中的`nonull`为true, 当未发现时, files返回["**/*.js"]// `er`是一个错误对象或者null
})
Glob 入门
"Glob"是一种模式,类似于在命令行中输入ls *.js,或是在.gitignore文件中写build/*。
在解析路径模式时,大括号内使用逗号进行分隔,分隔部分可以包含/,所以a{/b/c,bcd}会被展开为a/b/c和abcd。
在匹配路径使用时,以下字符有一些特殊的作用:
*:匹配单路径下的 0 个或 多个 字符串。?:匹配一个字符串。[...]:匹配指定范围内的字符串,类似于正则表达式中的[]。如果[]中的第一个字符串是!或者^,则匹配不在范围内的任意字符串。!(pattern|pattern|pattern):匹配与提供模式中不匹配的内容。?(pattern|pattern|pattern):匹配提供模式中的 0次 或 1次。+(pattern|pattern|pattern):匹配提供模式中的 1次 或 多次。*(a|b|c):匹配提供模式中的 0次 或 多次。@(pattern|pat*|pat?erN):匹配与提供模式中完全匹配的。**:和*一样,可以匹配路径中的 0个 或 多个,而且**可以匹配当前目录和子目录。但无法抓去符号链接的目录。
.点
如果匹配的文件或目录部分以.开头,除非匹配的路径也以.开头,否则不会匹配任何模式。
例如 a/.*/c模式会匹配a/.b/c。然而a/*/c模式却不会进行匹配,因为*并不是以.开始的。
你可以通过设置option dot:true,让Glob把.做为正常字符串。
Basename的匹配
如果你在 option中设置matchBase:true,当模式中没有/,它会在任意目录下去匹配。例如*.js会匹配到test/simple/basic.js。
空集
如果没有匹配到任何文件,它会返回空数组[]。它与shell不一样,shell会在未匹配的情况下返回本身。例如:
$ echo a*s*d*f
a*s*d*f
可以通过设置optionnonull:true,来获得和bash shell一样的效果。
glob.hasMagic(pattern, [options])
如果pattern中有任何特殊字符串,则返回为true,否则返回为false。
注意:options会影响结果。
如果options中设置noext:true,那么+(a|b)将不会视为魔术模式。
如果模式中支持{}表达式,那么也属于Magic,例如a/{b/c,x/y}。除非option设置nobrace:true。
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来创建Glob对象。
var Glob = require("glob").Glob
var mg = new Glob(pattern, options, cb)
它是一个EventEmitter。它会立即执行遍历目录进行匹配。
new glob.Glob(pattern, [options], [cb])
pattern {String}: 匹配模式。options {Object}cb {Function}:成功或失败的回掉。err {Error | null}matches {Array<String>}: 匹配后的文件名数组。
注意 如果option设置sync标志, 那么匹配结果可以通过g.found获取。
属性
minimatch:glob使用的minimatch对象。options:传入的option对象。aborted:布尔值,在调用abort()时会设置为true。 在abort()后无法再进行全局搜索,但是可以通过重新设置statCache去避免重复系统调用。cache:Object,可能有以下值:false- 路径不存在。true- 路径存在。'FILE'- 路径存在,但不是目录。'DIR'- 路径存在,是目录。[file, entries, ...]- 路径存在,结果是数组,类似于fs.readdir的结果。
statCache:fs.stat结果缓存,避免多次计算相同路径。symlinks:记录哪些路径是符号链接,与**模式相关。realpathCache:传递给fs.realpath的可选参数,避免不必要的系统调用。存储在Glob的实例对象上,可重复使用。
事件
end:匹配完成后,收到匹配的结果。当nonull设置时,在没有匹配结果的情况下会在返回的数组中包含原匹配模式字符串,默认情况下匹配结果是被排序的, 除非设置nosort。match: 每次发现匹配结果就会触发,结果中包含匹配的信息。它不会删除重复数据和解析的真实路径。error:在发生意外错误时触发。 如果设置options.strict,那么任何fs的错误都会触发。abort:abort()调用时触发。
方法
pause:暂时停止搜索。resume:恢复搜索。abort:终止搜索。
选项
所有Minimatch的选项都可以传递给Glob去改变匹配模式,此外还添加了一些特有的glob-specific。
除非另有说明,否则所有选项默认都为false。
所有选项也会被添加到Glob对象上。
如果正在运行多个glob操作,可以通过Glob对象的传递options给后面的操作使用,方便某些stat和readdir调用。可以通过共享symlinks statCache realpathCache cache option加快并行glob操作。
cwd:要搜索的当前目录。默认process.cwd()。root:以/开始的挂载位置。默认是path.resolve(options.cwd, "/")(Unix系统是/,其他的一些Windows系统是C:\)。dot:在正常模式和**模式下包含.。注意,在模式字符串中定义的点将始终与.文件匹配。nomount:默认匹配模式中以/开始的会转到根目录的挂载点,以便返回有效的文件路径。设置debug标志关闭此行为。mark:在目录匹配中添加/。注意,这需要额外的stat调用。nosort:结果不排序。stat:设置true统计stat所有结果。它可能会降低性能,并且完全没必要, 除非readdir认为文件存在的不可靠标志。silent:读取目录遇到异常错误,并向stderr打印报警信息。设置optionsilent,关闭警告信息。strict:尝试读取目录遇到异常错误时,进行会继续搜索其他匹配项。设置strict后,当出现这些情况时会引发错误。cache可以看上同的cache属性。传入之前生成的缓存对象保存一些fs调用。statCache:文件系统信息结果的缓存,防止不必要的stat调用。 通常不需要设置它,如果你知道文件系统不会在调用中改变,你可以将statCache从一个glob()中调用传递给另一个的options对象中。symlinks已知符号链接的缓存。在解析**匹配时,你可以传入上一次生成的符号链接对象用来保存stat调用。sync弃用:使用glob.sync(pattern, opts)替代。nounique:在一些情况中,{}模式会导致同一个文件在结果中出现多次。默认情况下,它会防止结果中出现重复值。设置这个属性会关闭这个行为。nonull:设置不返回空数组,而是返回一个包含模式本身的数组。这是glob(3)中的默认值。debug:开启后会在minimatch和glob开启日志记录。nobrace:不展开大括号,如{a,b}和{1..3}。noglobstar:针对多个文件名不匹配**(即 会替换为正常的*)。noext:不去匹配+(a|b)“extglob”模式。nocase:不区分大小写的匹配。注意:在一些不区分大小写的系统中no-magic模式默认会被匹配,stat和readir将不会引发错误。matchBase:如果模式中不包含/字符串,则执行仅基于basename匹配。也就是说*.js会被视为**/*.js,会匹配所有目录下的所有js。nodir:只匹配文件,不匹配目录。 (注意:只匹配目录,只需要在模式的最后加上/)ignore:添加模式或glob模式的数组去排除匹配。注意,ignore模式下总是dot:true,其他设置无效。follow:**模式下,访问符号链接目录。注意 它可能会导致在出现循环链接时出现大量重复引用。realpath:设置为true会在所有结果中调用fs.realpath。在无法解析的符号链接下,返回匹配结果的完整绝对路径。(虽然它通常是一个失效的符号链接)absolute:设置为真,将会在匹配的结果中接收到绝对路径。与realpath不同,它也会影响match事件中的返回值。
博客名称:王乐平博客
CSDN博客地址:http://blog.csdn.net/lecepin