package

package 有两种依赖

  1. dependencies —— 运行依赖,依赖的项该是正常运行该包时所需要的依赖项,就是开发的项目需要的包,如 ui 框架包,react 包之类的。
  2. devDependencies —— 开发依赖,开发的时候需要的依赖项,像一些进行单元测试之类的包或 webpack 打包需要的包。

package 版本号详解

在 npm 中安装固定的版本号 package,只需要在其后加 @版本号

1
npm i babel-core@7.0.0 -S

package.json 中库的版本号详解:

  1. ~ 匹配最近的小版本依赖包,比如~7.0.0 会匹配所有 7.0.x 版本,但是不包括 7.1.0,如果 7.0.x 最新的版本是 7.0.8,那么就会安装这个版本

  2. ^ 匹配最新的大版本依赖包,比如^7.0.0 会匹配所有 7.x.x 的包,包括 7.9.0,但是不包括 8.0.0,如 7.x.x 最新的版本是 7.8.7,那么就会安装这个版本

  3. * 意味着安装最新版本的依赖包

由于在 package.json 中依赖包大部分都是一个范围的版本,如babel:^7.0.0,那么每个从仓库拉下来的开发者都会遵循装包规则,安装这个范围版本最新的,那么就导致一个现象就是你与同事的依赖包不一致,而你的包有 BUG,但你同事没有,而导致有时难以确认问题所在,或者公司自己搭建了 npm 私仓,但最近在 npm 仓库上有新的包更新,但公司的私仓没有同步到位,导致装包时找不到包,但由于这个包是依赖包的包,导致你也不能固定它的版本而导致你无法正常下载包的问题。

解决方法:

  1. 那么这些问题其实可以使用package-lock.json解决,因为它记录了整个 node_modules 文件夹的树状结构,甚至连模块的下载地址都记录了,npm install时会根据 package-lock.json 文件指定的结构来下载模块,并不会理会 package.json 文件,而它也提升了装包速度。

但以后修改 package.json 文件相应模块的版本号,再执行 npm install 不会更新了,只能手动 npm install name@version 指定版本号来安装。

  1. 若项目里没有package-lock.json,那么我们可以使用 yarn 去解决,因为 yarn 出现就是为了解决 npm 的一些缺陷,它与 npm 功能类似而且完全兼容,在项目中可以切换使用,它们都是一个对包操作的工具而已,而 yarn 对某些不存在的包版本但这个版本范围之类还是有包存在的会出现询问交互操作,那么我们就可以选定某个版本,而 npm 就不行,当版本不存在,它就会报错,让人无法安装包,然后 yarn 生成 yarn.lock,这个和package.json一样的,最早时 yarn 实现的,为了版本一致,提升速度。
1
2
3
yarn install --non-interactive

禁用询问交互,比如当没有合适版本的依赖时
1
2
3
4
5
6
7
8
9
yarn install --flat

安装所有依赖,但每个依赖只允许有一个版本存在。 第一次运行这个命令时,会提示你在每个依赖包的多个版本范围中选择一个版本。 这会被添加到你的 package.json 文件的 resolutions 字段。

"resolutions": {
"package-a": "2.0.0",
"package-b": "5.0.0",
"package-c": "1.5.2"
}
1
2
3
4
5
6
// 将准确地安装yarn.lock中的内容。不更新锁定
yarn install --frozen-lockfile

不生成 yarn.lock 锁文件,并且,如果需要更新则会报错。

如果需要可重现的依赖环境(比如在持续集成系统中),应该传入 --frozen-lockfile 标志。