Node.js解释器与代码中glob执行结果不一致问题咨询
问题分析与解决
现象是否正常?
这个现象不正常,属于glob在ES模块导入场景下的路径解析异常,并非工具的预期行为。
操作是否有误?
大概率是导入方式或路径解析的细节问题,常见误区:
- 导入方式错误:若使用glob 10+版本,ES模块需通过
import { glob } from 'glob'导入;旧版本glob的ES模块支持不完善,若误用默认导入后直接调用,会导致ignore等参数未被正确处理。 - 工作目录差异:代码文件的运行目录与REPL启动目录不一致?比如REPL在
dir1启动,而代码文件从其他目录执行,部分旧版本glob的ES模块模式会错误地以当前运行目录为基准解析路径,而非你指定的绝对匹配路径。
是否需要额外参数?
需要,建议添加以下参数明确路径规则:
- 指定
cwd参数:在glob选项里明确设置匹配根目录,同时将匹配模式改为相对路径,避免路径解析混淆:import { glob } from 'glob'; const files = await glob('**/*.{feature,feature.md}', { cwd: '/User/username/workspace/dir2', ignore: ['**/node_modules/**'], absolute: true // 可选,让返回结果为绝对路径 }); - 启用
absolute参数:如果需要返回绝对路径,加上该参数后,ignore规则可保持相对cwd的模式,匹配逻辑更清晰。
ignore模式是否与运行目录相关?
glob的ignore模式默认相对于匹配的根路径(即第一个参数的路径根,或cwd指定的目录),而非当前运行目录。但旧版本glob的ES模块模式存在路径解析bug,会错误地以当前运行目录为基准处理ignore规则,这就是你遇到问题的核心原因。
为何解释器中可正常工作?
REPL中用require导入的是glob的CommonJS版本,其路径解析逻辑与ES模块版本存在差异。CommonJS版本对绝对路径的处理更稳定,能正确识别匹配路径的根目录,从而正常应用ignore规则;而旧版本的ES模块版本存在路径解析bug,导致ignore规则未生效。
额外排查步骤
- 升级glob到10.x及以上版本:旧版本ES模块支持不完善,升级后可解决大部分路径解析问题。
- 检查异步逻辑:glob的ES模块版本默认返回Promise,若代码未用
await或.then()等待结果,可能出现错误输出(虽与ignore规则无关,但也是常见坑点)。
内容的提问来源于stack exchange,提问作者MarioBros
相关产品推荐
相关产品推荐

