fix: memory leaks from worker recompilation with HMR

Add alreadyCompiled flag to prevent unnecessary worker rebuilds
during development with Hot Module Replacement, which was causing
memory leaks in both webpack and rspack.
This commit is contained in:
Daniil Gaponov 2025-07-10 21:19:07 +02:00
parent f420968fc9
commit 1fcf768d0a

View file

@ -13,11 +13,17 @@ function getCompilerHook(
{ id, entry, filename, chunkFilename, plugins }: IAddWorkerEntryPointPluginOptions { id, entry, filename, chunkFilename, plugins }: IAddWorkerEntryPointPluginOptions
) { ) {
const webpack = compiler.webpack ?? require('webpack'); const webpack = compiler.webpack ?? require('webpack');
let alreadyCompiled = false;
return function ( return function (
compilation: webpack.Compilation, compilation: webpack.Compilation,
callback: (error?: Error | null | false) => void callback: (error?: Error | null | false) => void
) { ) {
if (alreadyCompiled) {
callback();
return;
}
const outputOptions = { const outputOptions = {
filename, filename,
chunkFilename, chunkFilename,
@ -33,7 +39,14 @@ function getCompilerHook(
new SingleEntryPlugin(compiler.context, entry, 'main').apply(childCompiler); new SingleEntryPlugin(compiler.context, entry, 'main').apply(childCompiler);
plugins.forEach((plugin) => plugin.apply(childCompiler)); plugins.forEach((plugin) => plugin.apply(childCompiler));
childCompiler.runAsChild((err?: Error | null) => callback(err)); childCompiler.runAsChild((err?: Error | null) => {
if (err) {
callback(err);
} else {
alreadyCompiled = true;
callback();
}
});
}; };
} }