Skip to content

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

Description

@devsamm

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions