我有以下monorepo结构

root
--AppOne
----package.json
----node_modules
------styled-components

--AppTwo
----package.json
----node_modules
------styled-components

--Shared
----componentA
----package.json
----node_modules
------styled-components

我的问题是AppOne和AppTwo都使用了componentA目录中的shared,它取决于NPM软件包,例如styled-components
这意味着我需要在所有三个目录中都安装styled-components,这会增加捆绑包的大小,如果版本不同,则可能会导致软件包执行应做的操作时出现问题。

这也意味着我从styled-components收到以下错误:
It looks like there are several instances of 'styled-components' initialized in this application.This may cause dynamic styles not rendering properly, errors happening during rehydration process and makes your application bigger without a good reason.
我的问题是-解决这种情况的最佳方法是什么?理想情况下,我只希望将此软件包安装在一个地方。我应该在Shared中安装它,并在AppOneAppTwo中使用别名来使用该软件包吗?

任何建议,不胜感激!

最佳答案

我自己将在大型Monorepo上进行工作,我会说有很多方法可以通过编写自定义脚本来解决此问题,并在npm“安装后”触发它们。也许您还可以手动维护每个package.json的peerDependencies中的依赖关系之间的关系。

我更喜欢依靠工具来处理相互依赖管理。
在我的项目中,我使用的Lerna正是针对此用例的一个package hoisting feature
如果Lerna对您来说过头了,您应该知道Yarn Workspaces也提供了包装吊装。实际上,当Lerna在Yarn之上使用时,Lerna只是将卷装提升委托(delegate)给Yarn Workspaces,因此您实际上不需要Lerna。

我也听说过Bolt,但截至2019年初,它非常有前途,但不如Yarn/Lerna成熟。

09-25 16:19