前段时间在用workbox时,在作precache时,匹配模式基于的是Glob Pattern模式,因而就看了下相关文档。node
下面翻译一下node-glob的使用,原文:github.com/isaacs/node…git
像在shell里面,用*
等匹配模式来匹配文件。github
Glob基于Javascript实现,使用minimatch
库进行匹配。正则表达式
使用npm
安装shell
npm i glob
复制代码
var glob = require("glob")
// options可选
glob("**/*.js", options, function (er, files) {
// files是匹配到的文件数组
// 若是`options`中的`nonull`为true, 当未发现时, files返回["**/*.js"]
// `er`是一个错误对象或者null
})
复制代码
"Glob"是一种模式,相似于在命令行中输入ls *.js
,或是在.gitignore
文件中写build/*
。npm
在解析路径模式时,大括号内使用逗号进行分隔,分隔部分能够包含/
,因此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个 或 多个,并且**
能够匹配当前目录和子目录。但没法抓去符号连接的目录。.
点若是匹配的文件或目录部分以.
开头,除非匹配的路径也以.
开头,不然不会匹配任何模式。bash
例如 a/.*/c
模式会匹配a/.b/c
。然而a/*/c
模式却不会进行匹配,由于*
并非以.
开始的。异步
你能够经过设置option dot:true
,让Glob把.
作为正常字符串。
若是你在 option中设置matchBase:true
,当模式中没有/
,它会在任意目录下去匹配。例如*.js
会匹配到test/simple/basic.js
。
若是没有匹配到任何文件,它会返回空数组[]
。它与shell不同,shell会在未匹配的状况下返回自己。例如:
$ echo a*s*d*f
a*s*d*f
复制代码
能够经过设置optionnonull:true
,来得到和bash shell同样的效果。
若是pattern
中有任何特殊字符串,则返回为true
,不然返回为false
。
注意:options
会影响结果。 若是options中设置noext:true
,那么+(a|b)
将不会视为魔术模式。 若是模式中支持{}
表达式,那么也属于Magic,例如a/{b/c,x/y}
。除非option设置nobrace:true
。
pattern {String}
: 匹配模式。options {Object}
cb {Function}
err {Error | null}
matches {Array<String>}
: 匹配模式后的文件名数组。执行异步全局搜索。
pattern {String}
:匹配模式。options {Object}
return: {Array<String>}
:匹配模式下的文件名。执行异步全局搜索。
经过实例化glob.Glob
来建立Glob
对象。
var Glob = require("glob").Glob
var mg = new Glob(pattern, options, cb)
复制代码
它是一个EventEmitter
。它会当即执行遍历目录进行匹配。
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博客地址:blog.csdn.net/lecepin