Issue Description
When using @rspack/plugin-preact-refresh with Preact in development mode, I encountered an issue where both $RefreshSig$ and $RefreshReg$ become undefined during hot reload. This causes a runtime error: TypeError: $RefreshSig$ is not a function.
Root Cause
In node_modules/@rspack/plugin-preact-refresh/client/intercept.js, the code captures previous values of these functions and restores them in a finally block:
try {
originalFactory.call(this, moduleObject, moduleExports, webpackRequire);
} finally {
self.$RefreshReg$ = prevRefreshReg;
self.$RefreshSig$ = prevRefreshSig; // This can set it to undefined
}
When the first module (@prefresh/core/src/index.js) is loaded, prevRefreshSig and prevRefreshReg are both undefined. After the finally block executes, it sets the global functions back to undefined, breaking the hot reload functionality.
Steps to Reproduce
- Create a Preact application with Rspack
- Configure
@rspack/plugin-preact-refresh and @prefresh/babel-plugin
- Run the application in development mode
- Check the browser console for errors during component updates
- Observe the error:
TypeError: $RefreshSig$ is not a function
Solution
The issue can be fixed by adding a null check before restoring the previous functions:
try {
originalFactory.call(this, moduleObject, moduleExports, webpackRequire);
} finally {
// Only restore if previous values are defined
if (prevRefreshReg !== undefined) {
self.$RefreshReg$ = prevRefreshReg;
}
if (prevRefreshSig !== undefined) {
self.$RefreshSig$ = prevRefreshSig;
}
}
Environment
- Rspack version: 1.2.8
- @rspack/plugin-preact-refresh version: 1.1.2
- @prefresh/babel-plugin version: 0.5.1
Issue Description
When using
@rspack/plugin-preact-refreshwith Preact in development mode, I encountered an issue where both$RefreshSig$and$RefreshReg$becomeundefinedduring hot reload. This causes a runtime error:TypeError: $RefreshSig$ is not a function.Root Cause
In
node_modules/@rspack/plugin-preact-refresh/client/intercept.js, the code captures previous values of these functions and restores them in afinallyblock:When the first module (
@prefresh/core/src/index.js) is loaded,prevRefreshSigandprevRefreshRegare bothundefined. After thefinallyblock executes, it sets the global functions back toundefined, breaking the hot reload functionality.Steps to Reproduce
@rspack/plugin-preact-refreshand@prefresh/babel-pluginTypeError: $RefreshSig$ is not a functionSolution
The issue can be fixed by adding a null check before restoring the previous functions:
Environment