前段时间在用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