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里。

这样处理,所传达的信息是:

  1. 我的代码与此版本的 npm 包兼容。
  2. 如果此 npm 包已存在于node_modules中,则什么也不用做。
  3. 如果该软件包在node_modules目录中尚不存在或版本错误,请不要添加它。但是,需要向用户提示未找到该 npm 包的警告(npm 2)。

dep还是peerDep

那么,具体什么应该在dependencies/devDependencies,哪些应该在peerDependencies呢?

  1. dependencies里放的,是项目能正常使用的,必要的包。
  2. 开发者很有可能在使用这个包的时候,不会同时安装的包。例如 moment 对一个静态展示类的app可能不需要,而 axios 对一个不需要网络的小应用可能也不必要。

当满足以下条件之一时,建议使用peerDependencies:

  1. 开发者大概率会安装的包,例如一个在 react 生态的包,用户大概率已经安装了 react;
  2. 当多个版本的依赖包存在时,可能会导致冲突,例如 react 15 / 16;
  3. 依赖关系清晰明了;
  4. 您希望开发人员决定要安装哪个版本。

未完待续…

TODOs 1、npm对应多版本在deps里的时候,node_modules目录结构啥怎样的? 2、npm@3、yarn的平铺结构有什么弊端,什么是幽灵依赖? 3、pnpm解决了什么问题? 4、rush的优势?

#react

SideEffect is a blog for front-end web development.
Code by Axiu / rss