npm如何管理依赖包版本

168 阅读3分钟

语义化版本号

npm默认所有的Node包都使用语义化版本号:

  • 每个版本号都形如1.2.3,由三个部分组成,依次叫做“主版本号”、“次版本号”和“修订号”
  • 当新版本无法兼容基于前一版本的代码时,则提高主版本号
  • 当新版本新增了功能与特性,但仍兼容前一版本的代码时,则提高次版本号
  • 当新版本仅仅修正漏洞或者增强效率,仍然兼容前一版本代码,则提高修订号

默认情况下,npm install --save下载的都是最新版本,并且会在package.json文件里登记一个最优版本号,其形式如下所示:

"dependencies": {
    "express": "^4.10.0",
    "ejs": "~2.3.2"
}

可以看到,最优版本号在数字之前多出一个“标记”。当以后使用npm install按照package.json的这一部分来下载依赖包时,^意味着所下载的包有可能会有更高的次版本号或者修订版本号,而~意味着有可能会有更高的修订版本号。

锁定依赖包的版本

1️⃣回避最优版本号

操作方法

  • 对于已经记录在 package.json里的版本号,只需要把^标记去掉即可。
  • 对于新安装依赖包时,使用npm install --save-exact <package_name>或者npm install --save <package_name>@1.2.3,这样package.json里就不会出现最优版本的标记。

缺点

无法锁定次级依赖的版本号(依赖包的依赖包),如果依赖包的依赖包还是最优版本号,那么就可能存在版本冲突。(比如我下载的为1.1.1,某个时刻这个依赖包有了更新,其他人执行npm install,下载了1.1.2。)

2️⃣✅使用npm shrinkwrap命令

在开发项目时候,一切都进行顺利,说明目前所有的依赖包和代码很兼容的时候,可以运行npm shrinkwrap来生成一个npm-shrinkwrap.json文件,记录目前所有依赖包的版本信息。

这样以后运行npm install的时候,会先在npm-shrinkwrap.json文件中信息安装依赖包,不存在的时候才会使用package.json

3️⃣本地安装优于全局安装

npm安装依赖包有两种模式:本地安装和全局安装。

本地安装表示依赖包会被下载到当前项目的node_modules文件夹里,而全局变量会把它安装到系统级别的目录中。所以,安装依赖包最好遵循:

  1. 尽量不全局安装依赖包,除非是ts、grunt这种确实有需要的
  2. 所有安装包都应该本地安装,即使是全局安装过的

本地安装的依赖包,命令都位于当前项目的node_module/.bin文件夹下。package.json文件的"scripts"部分所使用的依赖包命令都会先去这个文件夹寻找。

关于package-lock.json

它会在 npm 更改 node_modules 目录树 或者 package.json 时自动生成的 ,它准确的描述了当前项目npm包的依赖树,并且在随后的安装中会根据 package-lock.json 来安装,保证是相同的一个依赖树,不考虑这个过程中是否有某个依赖有小版本的更新。