I am developing an external component (let's say my-component
, which I link to the project with npm link
(as it is in process and I need the package to reflect changes).
In the my-component
folder there are node_modules/react
and node_modules/react-dom
as they are its dependencies. However they are peerDependences, so I did not suppose to bring them into the project linking this package.
However when using npm link
, it link the whole directory, including node_modules
. So, when the project builds, it includes packages 2 times: from node_modules/*
and from node_modules/my-component/node_modules/*
.
This begins to affect when the component is using ReactDOM.findDOMNode
, it causes this error:
Warning: React can't find the root component node for data-reactid value `.0.2.0`. If you're seeing this message, it probably means that you've loaded two copies of React on the page. At this time, only a single copy of React can be loaded at a time.
Also, it may help to understand what's happening: the problem only appears if there are both node_modules/my-component/node_modules/react
and node_modules/my-component/node_modules/react-dom
. If there is only one of them, there is no error message.
The usual package installation does not bring such error as there is no node_modules/react-dom
there.
How is it supposed to develop an external component and the project at the same time?
I am using ReactJS.net and setup webpack from the tutorial there and started using
react-bootstrap
aswell when i started getting this error. I found adding'react-dom': 'ReactDOM'
to the list ofexternals
inwebpack.config.js
fixed the problem, the list of externals then looked like this:This seems to be the first stack overflow link on google for this error, so i thought this answer might help someone here.
I was getting this because I had already included
react
andreact-dom
as external scripts in my HTML markup.The error was caused by adding an
import ReactDOM from 'react-dom'
to a component module. The error went away once I removed the import, and the module worked fine since the components were already available.If you're using Webpack in the main project, this solution may work. In my case,
project-a
requiresproject-b
. Both require React and ReactDOM 0.14.xI have this in
project-a/webpack.config.js
:project-b
requires React and ReactDOM aspeerDependencies
inproject-b/package.json
project-a
requiresproject-b
as adevDependency
(should also work required as adependency
) inproject-a/package.json
project-b
is linked toproject-a
like so:cd project-a; npm link ../project-b
Now when I run
npm run build
withinproject-b
, the changes appear immediately inproject-a
I believe the answer is to specify
react
andreact-dom
aspeerDependencies
in your external component'spackage.json
. As best as I can follow here and here,npm link
should (as ofnpm@3
) no longer installpeerDependencies
(or `devDependencies either).Aaaand I just read your post more carefully and realized that you already are specifying them as
peerDependencies
. Therefore, I think the answer boils down to:Upgrade to
npm@3
:npm install -g npm@3.0-latest
Adding the following in my
webpack.config.js
worked for me:I also experimented with
DedupePlugin
(mentioned as a possible remedy here) but I couldn't get it to work.What's also interesting is that I've encountered different (and perhaps more insidious) manifestations of the same problem when a module is found in multiple places in the dependency graph.
One such case was that my
React.PropTypes.instanceOf(SomeType)
constraints would emit warnings even though the type I passed in was correct. That was due to the module being present in multiple places in thenode_modules
directory tree. Due to duck-typing the code would still work, but my console was cluttered with these warnings. Going theresolve.alias
way silenced those too.YMMV
Fixed it by adding
react-dom
as an alias to my webpack config