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/c和abcd。
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, 以及cacheoptions, 因此并发的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()