我有以下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
中安装它,并在AppOne
和AppTwo
中使用别名来使用该软件包吗?任何建议,不胜感激!
最佳答案
我自己将在大型Monorepo上进行工作,我会说有很多方法可以通过编写自定义脚本来解决此问题,并在npm“安装后”触发它们。也许您还可以手动维护每个package.json的peerDependencies中的依赖关系之间的关系。
我更喜欢依靠工具来处理相互依赖管理。
在我的项目中,我使用的Lerna正是针对此用例的一个package hoisting feature。
如果Lerna对您来说过头了,您应该知道Yarn Workspaces也提供了包装吊装。实际上,当Lerna在Yarn之上使用时,Lerna只是将卷装提升委托(delegate)给Yarn Workspaces,因此您实际上不需要Lerna。
我也听说过Bolt,但截至2019年初,它非常有前途,但不如Yarn/Lerna成熟。