You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[...]: 字符合集与正则表达式中的[]意思一样,[!] or [^]表示取反,不再这个集合内,比如src/index.[jt]s 匹配src/index.js or src/index.ts,src/index.[^jt]s 匹配除src/index.js or src/index.ts之外的其它字符s文件
目录
背景
封装了一个基于
rollup
的构建工具,在多entry
场景下,只需要写一个简单的glob语句就行,而不用自己遍历或者手动写上所有的entry路径,但是在使用的过程中,总是受到.d.ts
及__tests__
目录下的文件干扰,所以在解决了问题之后,总结一下,方便后面在有类似问题的时候可以快速解决glob语法
理解glob语法的两个关键点
src/**/*.js
这里有三个路径片段,分别是src
、**
、*.js
*
: 在单个路径片段中匹配0个或者多个字符,比如src/*.js
,*.js
就可以匹配src目录下的index.js、app.js、任何.js文件?
: 匹配单个路径片段中的单个字符,比如src/index.??
,index.??
可与匹配src目录下的index.js、index.ts等,任意两个字符结尾的文件[...]
: 字符合集与正则表达式中的[]意思一样,[!] or [^]表示取反,不再这个集合内,比如src/index.[jt]s
匹配src/index.js
orsrc/index.ts
,src/index.[^jt]s
匹配除src/index.js
orsrc/index.ts
之外的其它字符s文件!(pattern|pattern|pattern)
: 匹配非给定的模式,比如src/!(index|app).ts
匹配src/index.ts
与src/app.ts
之外的其它ts文件?(pattern|pattern|pattern)
: 匹配括号内的模式0次or1次,比如'src/*.[tj]s?(x)'
匹配src下的ts
、js
、tsx
、jsx
结尾的文件+(pattern|pattern|pattern)
: 匹配括号内的模式1次or多次*(a|b|c)
: 匹配括号内的模式0次or多次@(pattern|pat*|pat?erN)
: 严格匹配括号内给定的模式**
: 在单独的一个路径片断,则匹配零级或多级目录,不会搜索符号链接目录,比如src/**/*.ts
,这里的**
,则会匹配src/test、src/test/fixtures、src/utils等,src下任意层级的目录{}
: 匹配大括号内的所有模式,模式之间用逗号进行分隔,支持大括号嵌套,支持用 .. 匹配连续的字符,即{start..end}
语法,比如a.{png,jp{,e}g}
匹配a.png
、a.jpg
、a.gpeg
glob匹配看了下大概的源码是通过对传入的
glob
语句,按照/
来split
,然后在根据cwd
参数,通过fs.readdirSync
一步步来读取对应的目录与文件,所以理解路径片段很重要上面的特殊字符其实挺多的,但是只要记一些关键词就可以,比如
*
、**
、?
、!?+*@()
、{}
、[]
这五类就可以更多内容及使用参数,参考文档
常用应用场景
以下面的文件结构作为测试目录
文件目录结构
匹配src目录下所有的ts文件,不包括子目录
注意
'/src/*.ts'
这种写法匹配不到结果,'./src/.ts'这种写法与'src/.ts'写法匹配到的结果是等价的,但是传入ignore参数的时候就会有区别了,推荐使用'src/*.ts',不使用相对路径的写法匹配src目录下所有的ts、js文件,不包括子目录
匹配src目录下所有的ts、js、tsx、jsx文件,不包括子目录
匹配src目录下除以js结尾的其它符号s结尾的文件,不包括子目录
匹配src目录下除index.ts与abc.ts之外的其它.ts文件,不包括子目录
src目录下abc.tsx or ab任意字符.ts结尾的文件,不包括子目录
src目录及所有子目录下的以ts结尾的文件
src目录下以ts结尾的文件,及子目录__test__下以ts结尾的文件,不包括其它src下的子目录
src除__tests__之外二级目录下以.ts结尾的文件,不包含三级及以上目录
src除__tests__之外二级及二级以上目录下以.ts结尾的文件
匹配src一级目录及除__tests__之外二级及二级以下目录下除.d.ts之外以.ts结尾的文件
匹配不了任何文件
匹配cwd目录下任何
__tests__
目录下的任何目录及文件匹配cwd目录下任何
__tests__
子目录下的任何目录及文件匹配cwd目录下任何
__tests__
子目录下的任何目录及文件匹配cwd目录下任何
__tests__
目录匹配cwd目录下所有.ts结尾的文件
匹配cwd目录下除node_modules之外一级目录下的以.ts结尾的文件
匹配所有.d.ts文件及test相关目录下的ts文件
匹配src下的所有目录及文件
总结
glob语法在很多前端工具中都有用到,比如
prettier
、eslint
、stylelint
、babel
、typescript
等,都是作为查找输入文件的语法,虽然语法上可能会有差异,但是大同小异,掌握了之后基本上可以快速写出符合要求的glob语句,而不用每次想要的时候再去找文档,记这个的原因也是,下次有场景不记得了,直接来这里找下The text was updated successfully, but these errors were encountered: