一次线上问题引起的思考
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
版本相关联