npm依赖版本变动引发的惨案

[toc]

来了新同事,拉同一个项目到本地安装依赖之后跑不起来,但是其他三台电脑运行着都没问题。接下来就是逐步定位问题,首先排除了代码问题,因为最新代码在其他同事不同系统的电脑上都没正常运行,进过百度/谷歌/github issue搜索报错、反复重新拉项目、重启电脑、重装环境、重装系统等一天的的操作之后,终于定位到大概是依赖包版本更新的问题。。 项目里一共有60+依赖,主要的几个依赖都是手动锁死版本的,但有个lozad没有锁死,而且前段时间应该是发布了次版本更新,跟nuxt的兼容有问题所以报了错。跟运行正常项目的node_moduels中lozad版本对比,改了之后果然项目就跑起来了。

npm包管理原理

在思考解决方案前,首先了解下npm包管理及依赖版本管理的原理。这些都是通过package.json文件实现的 当你使用npm安装一个包(并保存它)或者更新一个包的时候,package.json里就自动添加了一条信息,包括包名和其版本。npm默认安装最新版本,然后在其版本号之前添加一个^符号。比如^1.2.12,它表明最低应使用1.2.12版本。并且在这之上,拥有相同大版本号的任何版本都是OK的。毕竟小版本和bugfix版本不会对使用造成任何影响,所以用任何相同大版本的更高级版本都很安全。

  • 符号^:表示主版本固定的情况下,可更新最新版。例如:vuex: "^3.1.3",3.1.3及其以上的3.x.x都是满足的。
  • 符号~:表示次版本固定的情况下,可更新最新版。如:vuex: "~3.1.3",3.1.3及其以上的3.1.x都是满足的。
  • 无符号:无符号表示固定版本号,例如:vuex: "3.1.3",此时一定是安装3.1.3版本。
举例:
"^1.2.3": 大于等于 1.2.3 且小于 2.0.0版本
"^0.3.4": 大于等于 0.3.4 且小于 0.4.0版本
"^0.0.6": 大于等于 0.0.6 且小于 0.0.7版本

版本依赖为什么需要锁定

没有版本锁定的情况下,在执行每次npm i的时候,对应的版本前都有个 ^ 符号。也就是未固定版本的依赖如果有了次版本更新或者修订版本更新,会自动安装对应的最新版。 在这种情况下,你再次install时安装的包的版本可能与前次不一样,具体的,你可以到package-lock.json中查看实际的包版本。 例如:A新建了一个项目,生成了上面这份package.json文件,但A安装依赖的时间比较早,此时packageA的最新版本是2.1.0,该版本与代码兼容,没有出现bug。后来B克隆了A的项目,在安装依赖时packageA的最新版本是2.2.0,那么根据语义npm会去安装2.2.0的版本,但2.2.0版本的API可能发生了改动,导致代码出现bug。

这就是package.json会带来的问题&#x

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
npm中,嵌套依赖版本的控制可以通过以下几种方式实现: 1. 使用"^"或"~"符号:在package.json文件中,我们可以使用^或~符号来指定依赖版本范围。例如,"^2.1.0"表示允许安装2.1.0及更高版本依赖,但不会安装3.0.0及更高的主要版本更新。这样可以确保依赖不会过于陈旧,同时又保持向后兼容。 2. 锁定版本号:npm提供了一个package-lock.json文件,用于锁定安装时的依赖版本。当我们运行npm install时,npm会根据package-lock.json中的版本信息来安装依赖,而不是根据package.json中的依赖范围。这样可以确保每次安装的依赖版本一致。 3. 使用npm-shrinkwrap.json文件:npm-shrinkwrap.json文件的作用类似于package-lock.json,但它对于整个依赖树都起作用,而不仅仅是当前目录下的依赖。使用npm shrinkwrap命令可以生成npm-shrinkwrap.json文件,这样可以更精确地控制嵌套依赖版本。 4. 更新依赖版本:当我们的项目需要更新某个依赖版本时,可以手动修改package.json文件中的版本信息,然后运行npm install命令来安装更新依赖版本。但需要注意的是,如果依赖存在嵌套依赖,可能会导致其他依赖版本冲突,因此需要仔细测试和调试。 综上所述,通过使用^或~符号、锁定版本号、使用npm-shrinkwrap.json文件和手动更新依赖版本等方法,我们可以灵活地控制npm中嵌套依赖版本。这样可以确保项目的稳定性和兼容性,同时又能够充分利用依赖库的最新功能和修复。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值