npm i后babel版本升级踩坑
最近总是碰到一些问题, 根据同样的package.json,安装之后的版本并不完全固定导致项目启动失败。仔细了解了一下package.json中库的版本号:
~和^的区别
"babel-loader": "^7.0.0",
"body-parser": "~1.15.2"
以版本号x.y.z为例
x:主版本号, 当你做了不兼容的API修改
y:次版本号, 当你做了向下兼容的功能性问题
z:修订号, 当你做了向下兼容的问题修复
~x.y.z, 会更新到y最新的版本, 例如 body-parser: ~1.15.2, 这个库会去匹配到1.15.z的最新版本, 如果出现了1.16.0, 则不会自动升级
^x.y.z, 会更新到x的最新版本, 例如 babel-loader: ^7.1.1, 这个库会去匹配7.y.z的最新版本, 如果出现了8.1.1, 则不会自动升级
而我们的package.json默认安装的包大都是以^为主的,所以在运行npm i
之后,可能有些包的版本已经发生了变化,以下面的升级为例:
^babel7.0.0安装后 => 实际版本babel 7.11.0
npm run dev
1、报错:Property raw expected type of string but got undefined启动失败,具体信息如下:
2、排查过程:
刚开始一直在排查@babel/core里面的问题,浪费了很多时间,后来发现有个babel-plugin-nornj-in-jsx
包很熟悉,点击进入到指定的报错行,发现里面调用了一个babel的方法:TemplateElement
quasis.push(types.TemplateElement({
cooked: tagName
}));
查看babel的7.11.0该方法对应的文档:
3、原因分析:
@babel/core7.5->@babel/core7.6版本中对必传参数的最终的验证类型做了升级导致的错误:
之前:
升级后:
4、解决方案
将@babel/core
和@babel/types
版本固定到7.5.0
转载自:https://juejin.cn/post/6883068638367055886