vector升级 导致代码出错_React和Babel的优雅升级 ; )

a3cdf05b494735010eb125b06a480fad.png

本次升级基础包情况:react 15.6 -> 16.6,babel 6.6 -> 7.1。升级流程:

  1. 升级React
  2. 功能测试
  3. 升级Babel
  4. 功能测试

OK,下面我要开始升级工作了。

0ad5b3e707cd8d6f1392c4381d96dc88.png

先新拉一个分支,不然改出毛病了就gg了:

8c03410330d14e0e5db6d44cac12aeea.png

Good,没问题。

0ad5b3e707cd8d6f1392c4381d96dc88.png

React 15 到 React 16

用npm-check检测一下,用-u参数进行交互式UI展示。

npm-check是一款可以在命令行通过图形化界面进行检测paceage.json文件的包有没有版本更新情况的插件,通过使用npm-check不仅能够节省时间效率,还能直观的选择特定需要升级的包,另外它还会提供包地址、具体版本信息、当前版本信息等等,是一款不可多得npm效率工具(。

bbcfaa56755261a43af3e0f2a61a4d09.png

Good,按上下键选择react,按一下空格选择,按enter就开始安装了。安装过程略了。

安装完成后我可以看到package.json文件也更新了,现在的react是16版本的了:

b1f00429956346f8c94bfc67eed25c1a.png

Good,下面我运行dev跑起来,出意外的话就不会报错了。

17a932ab71ae7ceab122d765eddf358a.png

激动ing...

0d277f4d66e09ceddbe92a3278222b4f.png

果然没出意外。下面我看一下具体输出。

上面说,这些dependencies没有找到,然后列了很多路径。一大堆英文看着头疼,不过我还是找到了一个关键字眼:react-dom

86cf5c5c5bc80bed7c2dac003d06b452.png

在来看看我的dom版本:

e82a32c0dd3c838c2e8f3565ee182a96.png

居然是15版本的,难道是版本不兼容导致的吗,太令人匪思所夷了,不管怎样,我还是升级dom试一下吧。

npm-check -u

00958fd234f8604ee43988a6b1a6c701.png

选择dom,然后按enter。

6b6e21456880787195a747debb19b27d.png

开始安装了。

安装完成啦!

让我再次运行npm run dev命令:

10cf7387071c36b62503f608c91f33c3.png

开始构建了,静静等候奇迹的出现吧。

5fef5b0ff8e346bbe2a4df3320dd0334.png

Good,运行起来了,下面再去进行一下功能测试。

0ad5b3e707cd8d6f1392c4381d96dc88.png

一打开首页,果然控制台出错了:

b45b16961d0c1ca0a54787486ac53d51.png

在项目里进行全局搜索,貌似是这句话报了错:

aa940d867a1d6503a00ff6f3735b2b04.png

PropTypes是引用的prop-types包,我去检查一下这个包的版本:

6af6e82f2296188995f601c16b009c72.png

15版本的,我要升级一下这个了。

55f635699cc6c41d01e5a880e41f8576.png

最新的居然是15.6的,希望可以跑起来。

a6704624bd7b59a62695c6bfe9bd1f8b.png

构建完了,再去看看浏览器。

0ad5b3e707cd8d6f1392c4381d96dc88.png

一打开首页,还是有这个错误。

在stof(stackoverflow)上找到了一个说可能是eslint的原因,我升级一下我的eslint:3.19 -》 5.9

【并没有什么用】

来看看VS提示

815c7d4fe404e0488ccd1f7db97ce940.png

我安装了@types/prop-types试一下(在袋鼠云EasyManager使用ts重构后对ts了解更多,后来确认与这个问题无关,想知道更过关于袋鼠云在ts上的实践的话欢迎大家关注我们的各种官方账号哦)

【并没有什么用】(先下班吧..

0ad5b3e707cd8d6f1392c4381d96dc88.png

【新的一天开始啦!】

这一周我要把react升级好,希望一切顺利(这一句划掉)。

好的,下面让我继续上面的proptypes的问题。删掉node_modules文件夹重新安装然后运行项目。

!!!

b94925ead5a71cf4925860b4232a6492.png

居然没问题!!!???怎么会这样??!!难道是install成旧版本了吗!!!检查package.json:

4202b67aeaf648ba5c66834438e7c751.png

不是啊!!天呐!不会是package.json文件乱套了吧!!难道我在dev环境推上去的也是16版本的吗??!!我先切换分支检查一下:

18ab5a43f0503ff238dfcb72fe68d946.png

谢天谢地并没有。

那我在切换回去,我不相信这个问题莫名其妙的就没有了。我要先检查一下react的包到底是什么版本的。

0f70661b4886bb185f83137520a01245.png

看了react的包的package.json文件,的确是16版本的。那么proptypes问题是怎样消失不见的呢?

我决定逆反一下上周做的步骤。

首先卸载@types/prop-types。

1901eaf33f33d7307af52372fe261ced.png

发现问题了,,,是页面进错了导致没有运行使用proptypes相关代码才没报错...(脸红

下面我就可以正式开始解决这个问题了。温习一遍这个错误:

fac74aff64dc1647cc66d08745d5fbdb.png

使用了oneOfType的只有一个index.js文件里:

eb350c1cf8f9cedf6ecc079105680458.png

而这个PropTypes是引自

53720653cb8aab0d4c08a2c4b89fde76.png

,根据react16官方的文档在15.5版本就需要使用prop-types使用proptype对象:

f9f304ee86e3505d69dc7f417a190f73.png

其官方的示例也跟我项目的代码一致:

6d19df41aea2d1526c142708c03e00f0.png

那么就应该不是自己项目业务代码的问题了,我点击控制台报错代码定位过去:

361cccc493a4f25d4107c2fcb55bf16d.png

是这句话,然后在node_modules文件夹里找一下啥包用了这个:

d1cf1f52fc736e5a09d842ac66a237f7.png

原来是react-style-proptype用到了,在全局找一下看看哪里使用了这个包:

6a5f8715bf59012bce3d941e20b66436.png

原来是react-split-pane包用到了react-style-proptype的2.0.2版本,最新的react-style-proptype是3.x版本

3b8f0fca597db31d8a7955b41128ce1d.png

split-pane是0.x版本:

441f0c12f1472110e930162aa79b6871.png

那么我升级一下split-pane吧:

58563049976f401fedb532884a0b5400.png

升级结束后split-pane引用了react-style-proptype的3.0.0版本,在react-style-proptype包下的index文件可以看到其使用React.PropTypes变成了单独的PropType对象:

140f7c7299a5175972344a759a52aa11.png

那么我的程序可以正常跑了吗?

并不可以:

a23e92533bc221370e52fba756a08b58.png

我用同样的方法定位代码查看proptype使用是不是有问题:

e60c22b5d1ce4f25e6874aaa49a594f6.png

d0595ff844baf720961b22f70b11d495.png

(被any挡住的是string),仍然是split-pane报的错,怎么会这样呢?看起来代码有点不一样,难道是没有重新run的缘故吗,我重新run一下。

果然没错,split-pane不报错了,但是项目的代码报了错:

72cf7cd324402ad938cfe9e39c3f67fd.png

那我就全局搜索一下哪里是用这种方式的然后统一替换掉吧!

9bb1a9ba453b74f28a50c1121ab8f15e.png

成功运行啦!

下面我进行一下功能测试,数栈是一个集很多应用与一体的应用,本着人人参与效率高的原则我做一下基本的功能测试,具体使用细节在开发环境再到测试环境进行层层使用验证。

经过测试没有发现致命问题,那么本次react升级就完成啦!下面我升级一下babel吧!

0ad5b3e707cd8d6f1392c4381d96dc88.png

Babel 6 到 Babel 7

当前babel版本:

7f520dc476199776d2c23cbdb1ed491e.png

babel-core从7版本开始就不再是以前的babel-core包了,取而代之的是更莫名其妙的babel/core包:

a60c7a0ab41a425caf25fdcb193f8e56.png

下面我安装这个包。装好之后编译都报了错:

5dc6bb1b3a79e422d0f23633d9388ba7.png

emmm.....这可咋办。。。

0ad5b3e707cd8d6f1392c4381d96dc88.png

在我升级好babel7配套的包之后:

672721b0284641091a991fd7f8e8bd2e.png

并且修改了babel的配置文件之后:

ab812ac80dfc51e1a20fc4bb6471a56d.png

,下面就可以run一下啦!但是报了错:

7b3f869036b2ce9e0a54f2bc3f2b4418.png

从官网的upgrade to babel 7可以知道:

3f77d975869a2914dbe3de0e60d20e7c.png

我应该使用env替换掉上面那些玩意,修改之后重新run一下的我报错信息是这个:

28ac3fe71a7a67a44faf1e740ee6e2a1.png

看到他们已经移除了babel's Stage presets(具体说明在Removing Babel's Stage Presets,他们之前在推上征集过投票),那我岂不是不可以用preset-stage-0了。不管如何我决定去上面的url看一下。

注释掉@babel/preset-stage-0之后,我重新run一下变成了

a083dae30521ab586777d8941bbd0c14.png

根据谷歌翻译我知道他跟我说这个适用于babel6的,好的,那我更新到最新的@babel/plugin-proposal-decorators,在使用的时候配置legacy为true:

ea4e290ddf706a38c7f26e3566b7c0df.png

重新run一下,报了

d257330f3c06bc5a893ab485f166f79a.png

错误,报错信息中有个提示为

417b21f9e836102e2c20f3be10a1c4af.png

,我决定安装这个包再试一下。

86a99d15b5ba05ae91a369f8ba07a033.png

重新run起来有报错了,我继续安装并使用一下它提示的包@babel/plugin-proposal-class-properties.

ab549ef4315a9cfb192623452628ba7d.png

居然没报错!!!我的天!!!

我要去测试一下!!!

(测试ing............)

运行起来了!!!我的天!!!!我要去具体应用下测试一下!!!

没问题!!!

0ad5b3e707cd8d6f1392c4381d96dc88.png

这次袋鼠云数栈基础包升级到此结束啦!下一步就是在开发环境和测试环境进行详细的功能点测试。这次升级过程还是很顺利的,之前升级过袋鼠云用户中心的依赖包所以这次没那么害怕,纵观整个过程可以发现走了弯路的,最严重的就是定位PropType.oneOfType错误位置问题,以为是业务代码的问题,再三确认代码没问题才发现是别的依赖包使用了旧的方式导致错误。通过本次升级可以看见PropType在很多第三方包中使用也很重要,对于类型的定义规则其实使用TypeScript的话会更好,ts不论在编码风格还是类型约束上都让人很舒服,想知道袋鼠云在ts上的实践欢迎关注袋鼠云的各种官方账号哦;)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值