-
Notifications
You must be signed in to change notification settings - Fork 46.9k
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
Bug: react devtools TypeError: wakeable.then is not a function #25994
Comments
Facing same issue when using suspense with Sanity CMS. Disabling the react dev tool makes the error go away. |
Happens with v18.2.0, as well |
The problem is that the dynamic function is not providing a valid wakeable object which is expected by the markComponentSuspended function in the React DevTools. This is a known issue that can occur when using the dynamic function with the React DevTools. One way to fix this is to disable the React DevTools while running the application, as you mentioned. Another way to fix this issue is by not using the dynamic function and instead use the React.lazy and Suspense feature that's built in react. One way to fix the issue with the dynamic function and the React DevTools is by providing a valid wakeable object to the markComponentSuspended function. `import { useState, useEffect } from 'react'; function MyComponent() { useEffect(() => { if (!Component) { return ; |
I am facing the same issue here, with React & React DOM version |
please check and make sure React DevTools are properly installed and that the versions of React and React-DOM match. Also, ensure that the app is running in development mode. |
Here is the workaround I used. /**
* !!WARNING!!
* TEMPORARILY WORKAROUND A REACT DEVTOOLS ISSUE https://github.com/facebook/react/issues/25994
* REMOVE AFTER THE ISSUE IS FIXED
*/
// Save the original __REACT_DEVTOOLS_GLOBAL_HOOK__.inject
const reactDevToolsHookInject = window.__REACT_DEVTOOLS_GLOBAL_HOOK__.inject;
// Override the original __REACT_DEVTOOLS_GLOBAL_HOOK__.inject
// This will allow us to intercept and modify incoming injectProfilingHooks
window.__REACT_DEVTOOLS_GLOBAL_HOOK__.inject = function inject(...args) {
const newArgs = args.map(arg => {
// Only modify the original arguments when injectProfilingHooks is present
if (!arg || !arg.injectProfilingHooks) return arg;
const { injectProfilingHooks: originalInjectProfilingHooks, ...rest } = arg;
return {
// Override the original injectProfilingHooks
// This will allow us to intercept and modify incoming hooks
injectProfilingHooks(...hooks) {
const newHooks = hooks.map(hook => {
// Only modify the original hooks when markComponentSuspended is present
if (!hook || !hook.markComponentSuspended) return hook;
// Override the original markComponentSuspended from the hook
const { markComponentSuspended: orignalMarkComponentSuspended, ...rest2 } = hook;
return {
markComponentSuspended(fiber, wakeable, lanes) {
if (typeof wakeable.then === 'function') {
return orignalMarkComponentSuspended.call(this, fiber, wakeable, lanes);
} else {
// If "wakeable.then" is not a function, log a warning.
console.warn('React DevTools issue detected and mitigated!\nSee https://github.com/facebook/react/issues/25994 for more information.', { fiber, wakeable, lanes });
}
},
...rest2
};
});
originalInjectProfilingHooks.apply(this, newHooks);
},
...rest
};
});
return reactDevToolsHookInject.apply(this, newArgs);
}; Wrap the above code in an inline If you are using Next.js, you should insert the inline |
Hi guys
Just tried to remove the devtools extensions from chrome and re-install it. This does not really help. The workaround provided by @SukkaW worked for me, thanks so much! |
@SukkaW Thank you for sharing your solution. Quick question: I am using the experimental app dir, and my topmost layout is a React Server Component. Thus, I placed your function in there and wrapped it in a // app/layout.js
if (typeof window !== "undefined") {
/**
* !!WARNING!!
* TEMPORARILY WORKAROUND A REACT DEVTOOLS ISSUE https://github.com/facebook/react/issues/25994
* REMOVE AFTER THE ISSUE IS FIXED
*/
// Save the original __REACT_DEVTOOLS_GLOBAL_HOOK__.inject
const reactDevToolsHookInject = window.__REACT_DEVTOOLS_GLOBAL_HOOK__.inject;
// original code omitted for readability
return reactDevToolsHookInject.apply(this, newArgs);
};
} |
Use |
@SukkaW Sorry, I am being slow. What part of the code do I copy in where? If I replace Putting the whole code into an IIFE gives me this excaption: |
@SukkaW Thank you so much! The
|
Can people try upgrading React to latest @next version (react@18.3.0-next-41110021f-20230301)? |
@mondaychen I can no longer reproduce the issue with the latest |
Thanks y'all! |
Hey guys, does anyone have a solution for this? The only way to make my application work was to remove React dev tools completely |
Please make sure you are using the latest version of React DevTools and the latest version of |
React version: 18.3.0-next-555ece0cd-20230112
Steps To Reproduce
Link to code example:
https://codesandbox.io/p/github/huozhi/dynamic-suspense-forked/main
The current behavior
client throw error while hydration with react devtools opening
The
weakable
variable from react_devtools_backend.js at this time is an error instance with message"This is not a real error. It's an implementation detail of React's selective hydration feature. If this leaks into userspace, it's a bug in React. Please file an issue."
, then the later call ofweakable.then(() => ...)
will throw an error.The expected behavior
Suepsne boundaries should be resolved successfully without error, but works with react devtools disabled
The text was updated successfully, but these errors were encountered: