-
Notifications
You must be signed in to change notification settings - Fork 47k
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
Hooks don't work with yarn link #14257
Comments
It's not expected that it would work unless you link This has actually always been the case (React apps are subtly broken when there are two copies of React module). Hooks surface this immediately which I guess is good. We do have another issue tracking a better error message for this case. |
My mistake - first time using |
Is there a workaround for this? How can people locally test react components they want to turn into libraries? :\ Workaround is https://github.com/whitecolor/yalc |
If your React app is bundled with Webpack, you can use a Webpack alias to force all React references to resolve to a single module. In your {
/* ... */
module: {
rules: [ /* ... */ ],
},
resolve: {
alias: { react: require.resolve("react") }
},
} (Solution from webpack/webpack#8607 (comment)) |
@dcecile just to clarify, do you resolve that in the library you're working? or in the demo app? |
@maciekgrzybek I resolve it in the demo app |
Hey @dcecile thanks for a quick answer, sadly, that doesn't work for me as well. |
I still get this error message even though I linked react and react-dom (via
|
Currently there are like 3 ways you can install local dependencies,
npm pack on the library repository and yarn add .tgz file in the other repo seems to work for me. The other two give me the hook error. |
Workaround: cd PACKAGE_YOU_DEBUG_LOCALLY
yarn link
yarn install
cd node_modules/react
yarn link
cd ../../node_modules/react-dom
yarn link
cd YOUR_PROJECT
yarn link PACKAGE_YOU_DEBUG_LOCALLY
yarn link react
yarn link react-dom I find it easier than some webpack setup or using yet another package manager (yapm? yanc? yalc? wut?) |
If you're having this issue when developing a package that exports a React component, and you have a folder structure like this:
Assuming react-component-package has React as a dev and peer dependency, you can run this command from the react-component-package folder: The same command should work with Yarn: |
Will this be addressed somehow? I guess there is an workaround - but when you use create react app you can't really do any hacks in the webpack.config.js 😄 |
@jaguardo in my experience Yalc removed a ton of the complexity that you would otherwise have to manage with symlinks yourself. Have been using it for a year or so now and the quality is very high. Worth giving it a shot for your use case. |
For googlers, this issue can also be encountered for project using Webpack 4 and transitionning to Webpack 5. If I sum it up, |
Nothing worked but yalc for me |
Nothing from the above was needed! I got mine fixed by just keeping react and react-dom only as peerDependencies in package.json and delete all other occurrences. After that delete node_modules and package-lock.json and install again. Then in should work. |
Most often, you cannot do this during development though, as you may need React for unit testing or 3rd party tools like Storybook. In a mono-repo, even if React is a peer-dependency of your package, it will fetch the "closest" version, so from your monorepo main |
yalc is the only solution to this problem (and the myriad of other issues caused by yarn/npm link) that consistently works. Its pretty troubling that both yarn and npm seem convinced that naively symlinking entire directories ever worked. |
Those who still struggling with the issue and work with react-scripts without eject do the following to solve the issue:
From: "start": "react-scripts start", To "start": "craco start",
const path = require('path')
module.exports = {
webpack: {
alias: {
react: path.resolve(__dirname, './node_modules/react'),
'react-dom': path.resolve(__dirname, './node_modules/react-dom'),
},
},
} |
In YOUR_PROJECT's package.json add into a jest config section: ...
"jest": {
"moduleNameMapper": {
"^react$": "<rootDir>/node_modules/react",
"^react-dom$": "<rootDir>/node_modules/react-dom"
}
}
... It worked for me |
|
This solution worked for me, Thanks a lot |
I configured this in webpack 5 and it's working for me:
|
@jerrygreen thanks dude. You saved us. Works like a charm! |
Yes. Works like a charm, currently. But someday, when you you will find, wow, something is screwed like a ****! |
What about a |
I had the same problem in a Next.js app and solved the issue with the approach suggested by dcecile. I added this entry in webpack: (config) => {
config.resolve.alias = {
...config.resolve.alias,
react: path.resolve(__dirname, './node_modules/react'),
};
// Important: return the modified config
return config;
}, Here are the docs for modifying Next.js webpack configuration. |
I had problems using this workaround with React 18. The error was:
To make it work I had to downgrade to a previous React version. Here the steps I followed:
I hope this can help in case someone ends up having the same issue. |
Yalc worked for me also, seems like a great tool |
I created a small command line tool that solved this issue for me by watching the build folder of a project when developing locally and installing it in the node_modules of a destination project: https://github.com/valdemarrolfsen/herd.js. Its a quite simple tool but it worked perfectly for me at least :) |
perfect.
Thanks @blkc |
based on @Omrilu-ma solution, i got the following error, "craco Module not found: Error: You attempted to import /node_modules/react which falls outside of the project src/ directory." I Solved this problem with the following additional configuration in Craco:
|
Do you want to request a feature or report a bug?
Bug
What is the current behavior?
When developing an external library locally and using
yarn link
to link the library to a local react app the "hooks can only be called inside the body of a function component" error comes up. However, after publishing to npm and using the published version in the local react app everything works as expected.If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem. Your bug will get fixed much faster if we can run your code and it doesn't have dependencies other than React. Paste the link to your JSFiddle (https://jsfiddle.net/Luktwrdm/) or CodeSandbox (https://codesandbox.io/s/new) example below:
yarn link
in my-hooks-lib and in my-react-app runyarn link my-hooks-lib
What is the expected behavior?
yarn start
in the react app should use hooks and render normallyWhich versions of React, and which browser / OS are affected by this issue? Did this work in previous versions of React?
react and react-dom
16.7.0-alpha.2
OSX
The text was updated successfully, but these errors were encountered: