Skip to content

Bug: $RefreshSig$ and $RefreshReg$ become undefined during the hot reload process #24

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
devsamm opened this issue Mar 30, 2025 · 0 comments
Assignees

Comments

@devsamm
Copy link

devsamm commented Mar 30, 2025

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

  1. Create a Preact application with Rspack
  2. Configure @rspack/plugin-preact-refresh and @prefresh/babel-plugin
  3. Run the application in development mode
  4. Check the browser console for errors during component updates
  5. 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants