Replace an Unused Dependency
I recently ran into a bit of an odd situation regarding a problematic npm dependency. Our app depended on an old version of d3, which had a dependency on an old version of jsdom, which itself depended on contextify. contextify is not supported on modern versions of Node and would fail to install. Upgrading d3 to a modern version without the dependency on jsdom was too hard, but we needed some way to move forward.
As it turns out, jsdom was only a dependency of d3 in order to support a Node environment, which was not necessary for our app’s use case. Could we replace the jsdom entirely with some kind of “dummy” package, since we didn’t need a real, working version of jsdom anyway?
I took to Twitter with the question, and Jan Buschtöns replied with a great suggestion:
As our application is already using yarn workspaces, this worked great! We created a package in the monorepo called noop with nothing but a package.json like this:
{
"name": "noop",
"version": "1.0.0"
}
and then used yarn resolutions to point jsdom to that package. Our “root” package.json got the following
{
"resolutions": {
"**/d3/jsdom": "file:./packages/noop"
}
}
which tells yarn to replace the d3 dependency on jsdom with our dummy package.
If you end up in a case like this yourself and don’t have a place to create your own dummy package, you could use something like the none package instead for the same effect!.