package-lock.json 与 yarn.lock 的作用和区别
Npm vs Yarn
npm | yarn | |
|---|---|---|
| 定义 | 包管理器 | 包管理器 |
| 安装项目依赖 | npm install | yarn |
| 全局依赖 | npm install pkg --global (-g) | yarn add pkg --global (-g) |
| 添加依赖 | npm install pkgnpm install pkg --save (-S) 默认模式 npm install pkg --save-dev (-D) | yarn add pkgyarn add pkgyarn add pkg --dev |
| 卸载依赖 | npm uninstall pkg | yarn remove pkg |
| 更新项目依赖 | npm update pkg | yarn upgrade pkg |
npm 的优势
- 世界上最大的注册表
(registry), 一个巨型数据库, 保存着每个包的信息 - 社区完善
- 能够轻松管理依赖和版本
yarn 的优势
速度快
并行安装
无论
npm还是Yarn在执行包的安装时,都会执行一系列任务。npm是按照队列执行每个package,也就是说必须要等到当前package安装完成之后,才能继续后面的安装。而Yarn是同步执行所有任务,提高了性能。离线模式
如果之前已经安装过一个软件包,用
Yarn再次安装时之间从缓存中获取,就不用像npm那样再从网络下载了。
安装版本统一
为了防止拉取到不同的版本,
Yarn有一个锁定文件(lock file)记录了被确切安装上的模块的版本号。每次只要新增了一个模块,Yarn就会创建(或更新)yarn.lock这个文件。这么做就保证了,每一次拉取同一个项目依赖时,使用的都是一样的模块版本。更好的语义化
yarn改变了一些npm命令的名称,比如yarn add/remove,感觉上比npm原本的install/uninstall要更清晰。
前置知识
为什么需要 lock 文件 ?
因为 package.json 文件只能锁定相关依赖包的大版本, 每次在 npm install 或者 yarn install 时都会根据大版本自动提升到 大版本的最新版本, 而有些时候这些版本会影响我们的开发,甚至存在兼容性问题, 所以我们需要 锁定版本。
lock 的作用
- 能获得可重复的构建
(repeatable build),当你在CI(持续集成)上重复build的时候,得到的artifact是一样的,因为依赖的版本都被锁住了。 - 避免由于开发人员意外更改或者更新版本,而导致项目不兼容等问题
何时生成 lock 文件
npm 5.x 之前可以通过 npm shrinkwrap 命令来生成一个锁定文件 npm-shrinkwrap.json, 受 yarn的影响, npm 在 5.x 之后也会生成 lock 文件, 即 package-lock.json。
Yarn 在运行 install 时会创建一个 yarn.lock 文件用来保存所安装的依赖包的确切版本。
lock 文件记录了哪些信息?
它包含了重现全部的依赖源码树需要的所有信息、你的项目依赖中的所有信息,以及它们各自的版本。
- 依赖包的准确版本
Hash校验值- 依赖的包的
URL - 依赖以及依赖版本
package-lock.json
name当前包名称。这必须与
package.json中的name匹配。version当前包的版本。这必须与
package.json中的version匹配。lockFileVersion锁定文件版本
dependencies记录了包的依赖
requires这是模块名称到版本的映射。 这是此模块所需的所有内容的列表,无论它将安装在何处。 该版本应通过常规匹配规则在我们的依赖项或高于我们的级别中匹配一个依赖项。
yarn.lock
# yarn lockfile v1
记录版本是为了便于以后更新
lockfile的语法或语义。以后一旦更新了lockfile,就增加版本号,而Yarn就可以根据不同的版本做出不同的动作,从而保证向后的兼容性。version记录了包的确切版本
resolved字段记录了包的
URLdependencies记录了包的依赖