You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ts-jest测试webpack4插件调用Node API出现open handle退出警告

问题原因

该警告是webpack Compiler实例运行完成后未主动释放内部资源导致的:webpack 4的Compiler在调用run方法完成构建后,内部持有的CachedInputFileSystem缓存、文件句柄、异步钩子还处于存活状态,Jest检测到未关闭的句柄就会触发进程强制终止的提示。

解决方案

你只需要在构建逻辑结束后主动调用compiler.close()方法释放资源即可,修改后的测试代码如下:

import path from 'path';
import webpack from 'webpack';

describe('webpack', () => {
  test('should pass with simplest config', (done) => {
    const compiler = webpack({
      mode: 'none',
      entry: path.resolve(__dirname, 'entry.ts'),
      // 可选配置:关闭缓存进一步减少残留句柄
      cache: false
    });

    compiler.run((err, stats) => {
      if (err) {
        return done(err);
      }
      // 构建完成后主动关闭compiler释放资源
      compiler.close((closeErr) => {
        if (closeErr) {
          return done(closeErr);
        }
        expect(2).toBe(2);
        done();
      });
    });
  });
});

如果偏好async/await写法,也可以使用promise化的调用方式:

import path from 'path';
import webpack from 'webpack';
import { promisify } from 'util';

describe('webpack', () => {
  test('should pass with simplest config', async () => {
    const compiler = webpack({
      mode: 'none',
      entry: path.resolve(__dirname, 'entry.ts'),
      cache: false
    });
    const stats = await promisify(compiler.run.bind(compiler))();
    await promisify(compiler.close.bind(compiler))();
    expect(2).toBe(2);
  });
});
验证

修改完成后重新执行jest命令,工作进程强制终止的警告会消失,使用jest --detectOpenHandles也不会再检测到开放句柄。

内容的提问来源于stack exchange,提问作者xcyde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:54:03