在浏览器端使用 JavaScript 实现 Glob 模式匹配的完整方案

酷杰小哥_2177

酷杰小哥_2177

2026-09-09

679人浏览

原创

在浏览器端使用 JavaScript 实现 Glob 模式匹配的完整方案

浏览器环境不支持原生 glob 匹配,但可通过将 glob 表达式预编译为正则表达式(或运行时动态转换)实现高效匹配,本文详解纯前端、零依赖的实践路径。

浏览器环境不支持原生 glob 匹配,但可通过将 glob 表达式预编译为正则表达式(或运行时动态转换)实现高效匹配,本文详解纯前端、零依赖的实践路径。

在浏览器中进行 glob 模式匹配(如 **/*.{eot,otf,ttf,woff,woff2})确实无法直接调用 Node.js 的 minimatch 或 glob 等模块——因为这些依赖文件系统和 CommonJS 环境。但核心思路非常清晰:glob 是一种声明式模式语法,其语义可完全映射为正则表达式(RegExp)。因此,真正的解决方案不是“在浏览器里运行 Node 工具”,而是在构建时或运行时,将 glob 转换为等价 RegExp 对象并执行 .test() 或 .match()。

✅ 推荐方案:构建时预编译(最轻量、最安全)

若你的 glob 模式是静态且已知的(例如用于字体资源白名单校验),强烈推荐在构建阶段(如 Webpack/Vite 插件、CI 脚本或本地 Node 脚本)完成转换,仅向浏览器注入最终的正则字符串:

// 构建脚本中(Node 环境)
import { globToRegExp } from 'glob-to-regexp';
const pattern = '**/*.{eot,otf,ttf,woff,woff2}';
const re = globToRegExp(pattern);
console.log(re.toString()); 
// 输出:/^.*/.*.(eot|otf|ttf|woff|woff2)$/

然后在浏览器中直接使用该正则字面量(注意:toString() 返回的字符串含 /.../flags 格式,需去除首尾斜杠并提取 flags):

// 浏览器端代码(无任何依赖)
const fontGlobRegex = new RegExp('^.*\/.*\.(eot|otf|ttf|woff|woff2)$');
console.log(fontGlobRegex.test('/assets/fonts/main.woff2')); // true
console.log(fontGlobRegex.test('/scripts/app.js'));         // false

⚠️ 注意:glob-to-regexp 默认生成的 toString() 结果包含 /^...$/ 和可能的 g 标志,实际使用 new RegExp(source, flags) 时需手动解析。更稳妥的做法是在构建时导出 re.source 和 re.flags 分离字段。

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载

⚙️ 运行时方案(需引入轻量库)

若 glob 模式需动态生成(如用户输入、API 返回),可引入极简的 glob-to-regex 库。虽然问题要求“无 npm 包”,但 glob-to-regexp 本身是 zero-dependency、UMD 兼容、仅 3KB gzip,可直接通过 <script></script> 引入或作为 ES 模块加载:

<script src="https://cdn.jsdelivr.net/npm/glob-to-regexp@2.0.0/index.js"></script>
// 浏览器中动态使用
const globToRegExp = window.globToRegExp;
const dynamicPattern = document.getElementById('pattern-input').value;
try {
  const re = globToRegExp(dynamicPattern, { globstar: true });
  const url = '/static/icons/arrow.svg';
  console.log(`"${url}" matches "${dynamicPattern}":`, re.test(url));
} catch (e) {
  console.error('Invalid glob pattern:', e.message);
}

? 关键细节与注意事项

  • ** 在 glob-to-regexp 中默认启用 globstar: true,表示匹配多级目录;若需兼容旧版行为,请显式传参。
  • {a,b,c} 语法会被正确转为 (a|b|c),但注意:花括号内不能嵌套 glob 特殊字符(如 * 或 ?),否则需自行转义。
  • 浏览器 RegExp 不支持 u(Unicode)或 s(dotAll)等较新标志,确保生成的正则兼容目标浏览器(glob-to-regexp 默认不启用这些)。
  • 性能敏感场景(如每秒匹配数百 URL)建议复用 RegExp 实例,避免重复 new RegExp() 创建开销。

✅ 总结

浏览器端 glob 匹配的本质是「模式编译」而非「文件遍历」。通过构建时预编译(推荐)或运行时轻量转换,你完全可以在零 Node 依赖、零打包工具侵入的前提下,安全、高效地实现 **/*.woff2 类型的 URL 或路径匹配逻辑。记住:把复杂留给构建过程,把简洁留给浏览器 runtime。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

4306

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

1089

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

4224

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

860

4

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

1756

5

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

2023.09.04

3125

4

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

2023.09.12

4073

6

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

2023.09.20

2620

5

java访问控制修饰符介绍
java访问控制修饰符介绍

java访问控制修饰符有四种,分别是public、protected、private、默认访问修饰符。详细介绍:1、public,public是最宽松的访问控制修饰符,被修饰的类、方法和变量可以被任何其他类访问,当一个类、方法或变量被声明为public时,它们可以在任何地方被访问,无论是同一个包中的类还是不同包中的类;2、protected修饰符等等。

2023.09.20

848

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.5万人学习