Webpack watch模式触发EMFILE: too many open files, watch '/'错误咨询
报错信息
Watchpack Error (watcher): Error: EMFILE: too many open files, watch '/'
问题背景
未对webpack配置做任何修改的前提下,webpack的watch进程会递归监听所有父级目录直至系统根目录,最终触发上述文件打开数超限报错。
问题定位方法
- 优先检查
watchOptions.ignored配置规则:当前配置中传入的字符串值'/node_modules/'是绝对路径匹配逻辑,仅会匹配系统根目录下的node_modules目录,既无法忽略项目本地的node_modules文件夹,也不会对上层父目录做拦截,是导致监听范围异常扩散到根目录的核心原因。 - 核对系统单进程文件句柄上限:类Unix系统可执行
ulimit -n查看当前限制,默认值多为1024甚至更低,一旦监听范围覆盖到根目录下的所有文件,会瞬间触达上限抛出EMFILE错误。 - 排查路径解析异常:检查项目存放路径是否存在跨分区软链、特殊转义字符、目录读权限不足的问题,这类问题会导致watchpack无法正确识别项目根目录边界,触发向上递归遍历的兜底逻辑。
修复方案
- 修正watch配置规则,替换字符串匹配为正则匹配,同时明确指定监听根目录为项目当前路径,修正后完整配置如下:
const path = require('path'); module.exports = { entry: './src/index.js', watch: true, watchOptions: { // 正则匹配所有层级下的node_modules目录,避免路径匹配失效 ignored: /node_modules/, // 明确锁定监听根目录为当前项目路径,禁止向上遍历父级目录 cwd: path.resolve(__dirname) }, output: { path: path.resolve(__dirname, 'dist'), }, module: { rules: [ { test: /\.js$/, // loader的exclude规则同步改为正则,避免路径匹配错误 exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'], }, }, }, { test: /\.less$/i, use: [ 'style-loader', 'css-loader', 'less-loader', ] } ], } }
- 兜底调整系统文件句柄上限:类Unix环境可在启动webpack的终端会话中执行
ulimit -n 65535临时调高单进程文件打开数限制,该配置仅对当前终端生效,重启后会恢复默认值。 - macOS系统额外排查权限问题:给当前使用的终端、IDE开启「完全磁盘访问权限」,避免因FSEvents接口无权限读取目录,导致watchpack fallback到全量递归遍历的逻辑。
内容的提问来源于stack exchange,提问作者Artisan72
相关产品推荐
相关产品推荐

