一次线上问题引起的思考
npm i 的时候使用@符号指定特定的版本,不会自动更新
最近遇到一个因为包更新导致的线上问题,起因是因为因为在开发过程中为了解决测试环境的构建报错问题,我错误将删除了本地的node_modules以及package-lock.json文件,并将其进行了上传。同时又因为package.json中vue-router的版本没有锁定,因此导致无意间将vue-router版本从vue-router3.1.6更新成了vue-router3.6.5。
包版本更新后,本次开发的功能是没问题,影响到了之前的页面,导致页面白屏,页面卡死。
当然主要原因是因为更新了包版本,次要原因是因为代码写的不够健壮,代码执行报错之后阻止了页面挂载,而vue-router3.1.6和vue-router3.6.5对于错误处理的callback函数处理有差异。发现之前的vue-router版本的callback函数异步执行的,现在是同步执行的,遇到页面报错后直接阻止组件挂载了,阻止页面挂载后导致页面白屏。
知识盲点:
package.json什么情况下会自动升级版本?
- 使用默认额度版本控制符号,当package.json中指定了一个版本号如2.1.0时,当有2.2.0的更新时,npm会自动安装这个新版本,如果库更新到3.0.0,则不会自动升级
- 使用\~符号:
\~符号更新的范围更新,当package.json中指定了\~2.1.0,当有2.1.1的更新时,npm会自动安装这个新版本,2.2.0的版本则不会自动更新。 - 不使用任何控制符号:会根据指定的版本进行安装,无论何时都不会自动升级。
锁文件package-lock.json有什么用?
package-lock.json文件在安装npm包时会记录每个包的精确版本和来源,确保每次使用npm i时都能安装相同版本的包,避免因为版本不同而导致的问题。
记录node_modules文件夹的树状结构,从而加快npm install的速度。
是在npm install时自动生成的,用于记录当前状态下项目中实际安装的各个package的版本号、模块下载地址、以及这个模块又依赖了哪些依赖。
什么情况下可以动package-lock.json文件?
- 当
package.json有更新的时候可以更新 - 当本地和远程代码有冲突的时候以
master为准
node-sass是个什么鬼?
node-sass和nodejs版本相关联