返回

不想npm版本固化?快快使用yarn!

前端

作为前端开发者,npm这个包管理工具的重要性显而易见。优点不再表述,但一些缺点是为使用者诟病比较多的:速度慢、版本控制。下面主要讨论下npm的版本固化问题,即lock文件。

对于npm来说,依赖相关的信息体现在package.json的dependencies里,这里使用了Semantic Versioning(语义化版本)来标识各个依赖的版本。举个例子,假设dependencies为:

{
  "dependencies": {
    "lodash": "^4.17.20",
    "moment": "^2.29.1",
    "react": "^17.0.2"
  }
}

上面这个dependencies的含义是:

  • lodash的版本必须大于等于4.17.20,但小于5.0.0
  • moment的版本必须大于等于2.29.1,但小于3.0.0
  • react的版本必须大于等于17.0.2,但小于18.0.0

当我们使用npm install命令安装依赖时,npm会根据dependencies里的信息,去npm仓库中找到符合语义化版本要求的最新版本,并安装到本地node_modules目录下。

但是,npm在安装依赖时,并不会把具体安装的版本信息记录下来。这就导致了一个问题:当我们再次运行npm install命令时,npm可能会安装不同版本的依赖,从而导致项目出现问题。

为了解决这个问题,npm提供了一个叫npm-shrinkwrap.json的文件,这个文件的作用是记录下npm安装依赖时所使用的具体版本号。当我们再次运行npm install命令时,npm会根据npm-shrinkwrap.json里的版本号来安装依赖,从而保证项目中使用的是同一个版本的依赖。

但是,npm-shrinkwrap.json文件也有一个缺点:它只能记录下项目中直接依赖的版本号,而不能记录下间接依赖的版本号。这就意味着,如果项目中的某个依赖更新了,那么间接依赖的版本号也会发生变化,但npm-shrinkwrap.json文件并不会记录下这些变化。

为了解决这个问题,yarn诞生了。yarn是一个新的包管理工具,它与npm最大的不同在于,yarn会在安装依赖时生成一个叫yarn.lock的文件。这个文件的作用与npm-shrinkwrap.json类似,都是记录下npm安装依赖时所使用的具体版本号。但是,yarn.lock文件有一个优点是,它不仅会记录下项目中直接依赖的版本号,还会记录下间接依赖的版本号。

这就意味着,当我们使用yarn安装依赖时,yarn会根据yarn.lock文件里的版本号来安装依赖,从而保证项目中使用的是同一个版本的依赖,无论直接依赖还是间接依赖。

因此,如果不想npm版本固化,那么可以使用yarn。yarn是一个更稳定、更可靠的包管理工具,它可以有效地避免npm的版本固化问题。