使用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
相关产品推荐
相关产品推荐

