今日vue2.x官网更新引发的测试环境报错惨案
报错提示:
Vue packages version mismatch:- vue@2.7.12- vue-server-renderer@2.7.11This may cause things to work incorrectly. Make sure to use the same version for both.
在把本地代码提到测试环境时,报vue版本不必配。而且报的vue和vue-server-renderer的版本号和本地开发的@2.6.11不一致。
为了解决问题,首先通过传统的把清除npm缓存、node_modules删除、package-lock.json文件删除都是无效,最要命的是这个项目是3年前的项目,把node_modules删除后,再次下载报依赖错误,看来这种方法不可行,于是恢复了之前的状态。
接着从报错版本开始排除,发现可疑了点,vue最近发布了vue2.x的最新版本是2.7.12,也就是说2.6.11不是最新的了
但是项目中vue的版本是^2.6.11(如下图)
如果对npm版本语义化有了解的可以知道,^符号是主版本控制(第一个非0本版),所以^2.6.11相当于 ^2.6.11 := >=2.6.11 < 3.0.0, 也就是说 只要版本小于3并且大于等于2.6.11的vue都可以下(默认下载最新的)。显然这不是项目想要的。
找到了出现问题的原因,现在就开始解决问题。为了解决这个问题,就用到了 npm shrinkwrap 命令来生成npm-shrinkwrap.json文件,来对依赖包进行精准控制。官网对npm-shrinkwrap.json文件的解释如下
如果项目中有package-lock文件时,使用npm shrinkwrap 则把package-lock更换为npm-shrinkwrap文件,并且npm-shrinkwrap。json文件比package-lock文件优先级高。并且和package-lock不一样的是,当发布包时npm-shrinkwrap.json包含在内。
使用注意shrinkwrap 注意点
每次更新 package.json或者 node_modules时,如 npm install新包, npm update, npm uninstall等操作,为保持协作人的资源一致,还是要手动运行 npm shrinkwrap更新 npm-shrinkwrap.json文件的。而且记得加入到版本控制中,不然就没意义了。shrinkwrap计算时是根据当前依赖安装的目录结构生成的,如果你不能保证 package.json文件定义的依赖与 node_modules下已安装的依赖是匹配、无冗余的,建议在执行shrinkwrap命令前清理依赖并重新安装( rm-rf node_modules&&npm install)或精简依赖( npm prune)。默认情况下, shrinkwrap只计算 dependencies依赖,而不计算 dev-dependencies,如果在生产环境也需要开发依赖或你的依赖分类不清晰,使用 --dev参数生成 shrinkwrap文件确保不会出问题。
最后把生成的npm-shrinkwrap.json文件加入版本控制中,提测就ok了。
如果不想使用npm-shrinkwrap.json文件,进行包精准控制的话,可以直接改动package.json中的版本。如下
注意
不能把^2.6.11改成~2.6.11,虽然比 使用 ^符号获取的版本更精确(补丁范围),但还不是2.6.11.如下图所示