Skip to main content

Command Palette

Search for a command to run...

[yarn] How to use multiple versions of one module in workspaces

Published
1 min read
[yarn] How to use multiple versions of one module in workspaces

在 yarn workspaces 同时使用同一个库的不同版本

[https://yarnpkg.com](https://cdn.hashnode.com/res/hashnode/image/upload/v1605152172533/T0Ht0g7H3.html)https://yarnpkg.com

在项目中,我们的项目结构很有可能是下面的情况:

.

├── packages

│   ├── module-a

│   │      └── package.json

│   ├── module-b

│   │      └── package.json

│   └── share

│   │      └── package.json (react-dnd@3.0.0)

└── package.json (react-dnd@9.3.0)

我们有三个 worksapce,分别是 module-a module-b share,module-a/module-b 都依赖了根目录下的 react-dnd@9,而 share 则依赖了 react-dnd@3.

在 build 时,share 下的代码如果出现了 import { DndProvider } from ‘react-dnd’ 类似内容的话,被打包的会是根目录下的 node_modules/react-dnd@9,而不是 share/node_modules/react-dnd@3.

根据我的个人理解,因为 workspace 是把所有的依赖都放到了项目根目录下,即使你在 share 下的 package.json 声明了你需要的 react-dnd@3,在打包时得到的依然会是根目录下的 react-dnd@9

如何处理这种情况呢?聪明的同学可能已经想到了,我们使用 yarn 的特性同时安装两个版本的 react-dnd 就好了。

yarn add react-dnd-v3@npm:react-dnd@3.0.0

然后把引用旧版本的 react-dnd 都修改为 react-dnd-v3

一般情况下到这里,上面的问题就应该解决了,可是我们还有问题。

react-dnd@3 和 react-dnd@9 都依赖了 hoist-non-react-statics,而前者需要的是 2.x,后者需要的是 3.x!

这种情况下我们就需要把 share/node_modules 与根目录下的 node_modules 隔离开了,让 share 下保留 react-dnd@3,根目录下保留 react-dnd@9,同时将它们各自的依赖安装在自己的 node_module 下

再查了一下文档,发现了 [nohoist](https://yarnpkg.com/blog/2018/02/15/nohoist/)

...
  "name": "app",
  "private": true,
  "workspaces": {
    "packages": [
                  "packages/share", 
                  "packages/module-a", 
                  "packages/module-b"
    ],
    "nohoist": ["share/react-dnd", "share/react-dnd/**"]
  }
  ...

完成上述步骤就 ok 啦

77 views

More from this blog

Al's blog

21 posts