寻找可检测Glob模式包含关系的Node.js npm工具
嘿,刚好有几个专门解决这个需求的npm库,完全不用去实际遍历文件,纯靠glob模式的语法分析就能判断它们之间的包含关系!下面给你推荐几个靠谱的:
推荐工具库及用法
1. glob-superset
这个库就是为判断glob模式的超集关系而生的——直白点说,就是能告诉你「模式A匹配的所有路径,是不是都能被模式B匹配」,全程不需要碰文件系统。
上手步骤:
先安装:
npm install glob-superset
然后在代码里用起来:
const { isSuperset } = require('glob-superset'); // 判断"pathB/**/*"是不是"pathA/*.js"的超集(也就是pathA的所有匹配项都被pathB覆盖) const isBContainsA = isSuperset('pathB/**/*', 'pathA/*.js'); console.log(isBContainsA); // 如果符合包含关系,会返回true // 反过来判断子集:pathA是不是被pathB包含 const isASubsetOfB = isSuperset('pathA/*.js', 'pathB/**/*'); console.log(isASubsetOfB); // 这里会返回false,因为pathA的范围更小
它支持绝大多数标准glob语法,比如*、**、?、字符集[abc]这些常用的,应付日常场景完全没问题。
2. glob-compare
这个库的功能更丰富,除了包含关系,还能判断两个glob模式是否相等、有没有交集,甚至能计算模式的差集,适合需要复杂模式分析的场景。
用法示例:
先安装:
npm install glob-compare
代码里的基本操作:
const globCompare = require('glob-compare'); // 判断"**/*.js"是否包含"src/*.js" const isIncluded = globCompare.includes('**/*.js', 'src/*.js'); console.log(isIncluded); // true,所有src下的js文件都被全局js模式覆盖 // 判断两个模式有没有交集 const hasOverlap = globCompare.intersects('src/*.js', 'lib/*.js'); console.log(hasOverlap); // false,这两个模式的匹配范围完全不重叠
3. micromatch(间接实现)
虽然micromatch主要是用来做路径匹配的,但你可以借助它把glob转成正则表达式,再通过正则的包含关系来间接判断glob模式的覆盖范围。不过这个方法需要你对正则有一定了解,不如前面两个专门的库直接,适合已经在用micromatch的项目,不想额外加依赖的情况。
简单示例:
const micromatch = require('micromatch'); // 把glob模式转成正则对象 const reGlobalJS = micromatch.makeRe('**/*.js'); const reSrcJS = micromatch.makeRe('src/*.js'); // 思路:如果所有匹配reSrcJS的字符串都匹配reGlobalJS,说明src/*.js是**/*.js的子集 // 你可以测试几个代表性路径来验证,比如: console.log(reGlobalJS.test('src/index.js')); // true console.log(reGlobalJS.test('lib/utils.js')); // true console.log(reSrcJS.test('lib/utils.js')); // false
总结一下:如果只需要简单的包含/被包含判断,glob-superset最轻便;如果需要更多模式关系分析,选glob-compare;如果已经在用micromatch,可以用它的正则转换功能间接实现。这些库都是纯语法分析,完全不用穷举文件,完美符合你的需求。
内容的提问来源于stack exchange,提问作者ffConundrums
相关产品推荐
相关产品推荐

