本节我们来学习 Gulp
中的 globs
的匹配规则。glob
是由普通字符或通配字符组成的字符串,用于匹配文件路径。我们可以使用一个或多个 glob
匹配规则在文件系统中定位文件。
gulp.src()方法
src()
方法需要一个 glob
字符串或一个 glob
字符串组成的数组来作为参数,确定哪些文件需要被操作。
gulp.src(globs[, options])
globs
:文件匹配模式,类似于正则表达式,用来匹配文件路径。options
:可选参数,通常情况不需要用到。
示例:
gulp.src('./js/*.js') // * 匹配js文件夹下所有.js格式的文件
gulp.src('./js/**/*.js') // ** 匹配js文件夹的0个或多个子文件夹
gulp.src(['./js/*.js','!./js/index.js']) // ! 匹配除了index.js之外的所有js文件
gulp.src('./js/**/{omui,common}.js') // {} 匹配{}里的文件名
匹配模式
gulp
内部使用了 node-glob
模块来实现其文件匹配功能。我们可以使用下面这些特殊的字符来匹配我们想要的文件。
单匹配模式:
匹配符 | 描述 |
---|---|
* | 匹配文件路径中的 0 个或多个字符,但不会匹配路径分隔符,除非路径分隔符出现在末尾 |
** | 匹配路径中的 0 个或多个目录及其子目录 |
? | 匹配方括号中出现的字符中的任意一个 |
[...] | 匹配方括号中出现的字符中的任意一个 |
多匹配模式,同时使用多种匹配:
表达式 | 描述 | ||
---|---|---|---|
!(pattern\ | pattern\ | pattern) | 匹配任何与括号中给定的任一模式都不匹配的 |
?(pattern\ | pattern\ | pattern) | 匹配括号中给定的任一模式0次或1次 |
+(pattern\ | pattern\ | pattern) | 匹配括号中给定的任一模式至少1次 |
*(pattern\ | pattern\ | pattern) | 匹配括号中给定的任一模式0次或多次 |
@(pattern\ | pattern\ | pattern) | 匹配括号中给定的任一模式1次 |
数组
如果有多种匹配模式时,我们可以在 src()
方法中使用数组。
- 使用数组的方式来匹配多种文件,例如下面代码匹配
js
、css
、html
三种文件:
gulp.src(['js/*.js', 'css/*.css', '*.html'])
- 使用数组的方式还有一个好处就是可以很方便的使用排除模式,在数组中的单个匹配模式前加上
!
符号即是排除模式,,它会在匹配的结果中排除这个匹配,要注意一点的是不能在数组中的第一个元素中使用排除模式
gulp.src([*.js,'!b*.js']) // 匹配所有js文件,但排除掉以b开头的js文件
gulp.src(['!b*.js',*.js]) // 不排除任何文件,因为排除模式不能出现在数组的第一个元素中
此外,还可以使用展开模式。展开模式以花括号 {}
作为定界符,根据它里面的内容,会展开为多个模式,最后匹配的结果为所有展开的模式相加起来得到的结果。
展开的例子如下:
a{b,c}d
: 会展开为abd
,acd
。a{b,}c
:会展开为abc
,ac
。a{0..3}d
:会展开为a0d
,a1d
,a2d
,a3d
。a{b,c{d,e}f}g
:会展开为abg
,acdfg
,acefg
。a{b,c}d{e,f}g
:会展开为abdeg
,acdeg
,abdeg
,abdfg
。
字符串片段与分隔符
字符串片段是指两个分隔符之间的所有字符组成的字符串,在 globs
中,分隔符永远是 /
字符,不区分操作系统,即使是在采用 \\
作为分隔符的 Windows
操作系统中也是如此。在 globs
中,\\
字符被保留作为转义字符使用。
示例:
如果 *
符号被转义,那么 *
将被作为一个普通字符使用,而不再是通配符:
'glob_with_uncommon_\\*_character.js'
避免使用 Node
的 path
类方法来创建 globs
,例如 path.join
。
在 Windows
中,由于 Node
使用 \\
字符作为路径分隔符,因此将会产生一个无效的 globs
。还要避免使用 __dirname
和 __filename
全局变量,由于同样的原因,process.cwd()
方法也要避免使用。
const invalidGlob = path.join(__dirname, 'src/*.js');
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。