为何Jest默认testMatch配置使用.[jt]s?(x)而非.[jt]sx?
Jest testMatch 默认匹配规则的设计逻辑
很多人容易把Jest的testMatch规则当成正则表达式,其实它用的是glob匹配语法(基于node-glob实现,支持extglob扩展),这也是你产生疑惑的核心原因。
为什么s是必须出现的?
原规则里的s没有加任何可选修饰,是必填项——因为Jest要匹配的是js/jsx/ts/tsx这类合法脚本后缀,这些后缀都包含s。.j或.t根本不是有效的脚本文件后缀,完全没必要纳入匹配范围,所以s必须写死为必填。
为什么把x放在?(x)分组里?
在extglob语法中,?(x)的作用是匹配0个或1个x,正好对应我们需要的“有无x都可以”的场景。
如果换成你说的.[jt]sx?,在glob语法里?的语义是必须匹配恰好一个任意字符,这就会出问题:它会把.jsa/.jsb这类不符合测试文件规范的后缀也匹配进来,而无法匹配不带x的.js/.ts(因为?要求最后必须有一个字符)。
用?(x)就能精准实现我们要的效果:既可以匹配带x的jsx/tsx,也能匹配不带x的js/ts。
关于你测试时的匹配异常
你用regex101测试的是正则语法,但Jest用的是glob,两者语法规则差异很大,所以测试结果自然不符合预期。比如正则里的s?(x)会允许s可选(匹配.j这种无效后缀),但glob里的.[jt]s?(x)中s是必填的,只会匹配带s的合法脚本后缀。
内容的提问来源于stack exchange,提问作者mengda
相关产品推荐
相关产品推荐

