peerDependencies使用
2022年6月18日 • ... • ☕️ 2 min read
使用monorepo来组织多个模块和多应用是个趋势,它可以帮我们通过共享包(分层结构、共享模块等),提供同时在Web、Node.js、小程序中使用相同的api。而package.json
就相当于整体系统和各个模块的设计说明。
理想情况
通常我们可以通过工具lerna、pnpm等来完成monorepo的建立,lerna通过cli甚至可以直接创建包结构。通过handbook很快能完成。接着安装各种依赖包。
更理想的情况,我们希望这个monorepo的底层可以不依赖具体的版本,即做到能做到让用户自己选择基础包的版本,例如使用react 16/17/18,或者使用antd 4/5。那么这个时候,我们就把这些底层包所依赖的react / antd,放到peerDependencies里。
这样处理,所传达的信息是:
- 我的代码与此版本的 npm 包兼容。
- 如果此 npm 包已存在于node_modules中,则什么也不用做。
- 如果该软件包在node_modules目录中尚不存在或版本错误,请不要添加它。但是,需要向用户提示未找到该 npm 包的警告(npm 2)。
dep还是peerDep
那么,具体什么应该在dependencies/devDependencies,哪些应该在peerDependencies呢?
- dependencies里放的,是项目能正常使用的,必要的包。
- 开发者很有可能在使用这个包的时候,不会同时安装的包。例如 moment 对一个静态展示类的app可能不需要,而 axios 对一个不需要网络的小应用可能也不必要。
当满足以下条件之一时,建议使用peerDependencies:
- 开发者大概率会安装的包,例如一个在 react 生态的包,用户大概率已经安装了 react;
- 当多个版本的依赖包存在时,可能会导致冲突,例如 react 15 / 16;
- 依赖关系清晰明了;
- 您希望开发人员决定要安装哪个版本。
未完待续…
TODOs 1、npm对应多版本在deps里的时候,node_modules目录结构啥怎样的? 2、npm@3、yarn的平铺结构有什么弊端,什么是幽灵依赖? 3、pnpm解决了什么问题? 4、rush的优势?