博客 技能get,React的优雅升级!

技能get,React的优雅升级!

   包袋鼠   发表于 2021-11-25 17:10  545  0

今日,我们不啖鸡汤,不饮鸡血

只有干货——关于React的优雅升级

双手奉上,来,干了!


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/588f160117ab9f1826e8b31954c4584a..jpg


-2019年第4期-


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/7e8593fb5f65f50941c6ef408a9e9c2b..jpg

本期夫子:古一

袋鼠云  前端开发工程师


夫 子 说


本次升级基础包情况:react 15.6 -> 16.6

升级流程:

1、升级React

2、功能测试

OK,下面开始和我一起升级吧http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/c70d598311a0e61978a91774e14ea3d7..jpg



http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/74d7eca3608b784185dafc193e4ec296..jpg


首先,新拉一个分支,避免“意外事故”的出现~



然后,放手开干。


React 15 到 React 16


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


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


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/6e4355d8a2331477a8589432652d599a..jpg


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


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


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/9b270a8a7c19f2267399ee94ae2724aa..jpg

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


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/252d509d30d4747203f906293ae893ba..jpg

激动ing...


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/7c1a0c17e7fd67ba5c089059447b2853..jpg


果然没出意外http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/d77d01acb4d88426f07d580927058f10..jpg
,下面看一下具体输出。

上面说,这些dependencies没有找到,然后列了很多路径。一个关键字眼:react-dom 跃入眼帘

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/571d2dd017135eae3c7121de412ce2c0..jpg

在来看看我的dom版本:

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/b074883c59bfcf75d56e93c680a248f2..jpg

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

npm-check -u

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/989093f1bc923f600d90f31280572359..jpg

选择dom,然后按enter。

开始安装

安装完成

再次运行npm run dev命令:

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/5d6d7e209dd078abee331d43889bce24..jpg

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

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/8eb10a28d007461f3113a4607d88a125..jpg

嘘出一口气,终于运行起来了,接下来就是功能测试。


功能测试


一打开首页,不出所料,控制台出错了http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/302d7e8fb5681f6cb46443191ab7c0fc..jpg


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/88941c6c9f07710d35252153976d0c8b..jpg

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

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/bf03d5124f2e22d279a3196cbba21bd4..jpg

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

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/d4b9e4b007671e076cf0c11ab00487ad..jpg

15版本的,赶紧升级一下

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/7cea2b9f4ee9264da309eaf5a17392a4..jpg

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

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

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

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

【并没有什么用】

来看看VS提示


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/9481d78937202d87238422597d455958..jpg

删掉node_modules文件夹重新安装然后运行项目。

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/989785991d0ed9432498266045123f4b..jpeg


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/f4d5690a52990d6efa33177408280ffa..jpg

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

不是啊~天呐!不会是package.json文件乱套了吧!难道在dev环境推上去的也是16版本的吗?!

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/8f6cd87acf40653885c176a3c32331d2..jpg

先切换分支检查一下:

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/428326cb4d6dc3b3480d72d1b45985bd..jpg

谢天谢地并没有。

再切换回去,不相信这个问题莫名其妙就没有了。

首先检查一下react的包到底是什么版本的。


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/3e0b01664dd51dd0e1dc1b3dd3a3ddd2..jpg

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

逆反一下之前做的步骤。

首先卸载@types/prop-types。

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

下面正式开始解决这个问题,温习一遍这个错误:


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/e28867aaeba6ce8e3813c31324d8c1db..jpg

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


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/bb4a2af699dab60a3ac1f555b105bed5..jpg

这个PropTypes是引自

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

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

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/e8da0aa75cd5e351c19e041d844ac748..jpg

那么就应该不是自己项目业务代码的问题了,点击控制台报错代码定位过去,然后在node_modules文件夹里找一下啥包用了这个:


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/c886a5ba2e5c129162a0272b6388949c..jpg

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


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/68f786b954e518844982431e13d29269..jpg

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

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/6ad06d31575f02c291144563376cfbc7..jpg

plit-pane是0.x版本:

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/8e1a7f9cb4293530bf3e2d6c51a96d1c..jpg

升级一下split-pane:

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/9cc6d2ccf0bb71d89a94de3eb26632f6..jpg

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


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/f04a07daab6193bf1ab6ed68b2b1fe93..jpg

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

并不可以:


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/f90b35caf98a4c4828be160c65cb1c5c..jpg

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

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/2a59277d3d1914cab1194cb6fd30a38d..jpg

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/9f2fbd3fb9d338796ae616c70c1e27e7..jpg

(被any挡住的是string)

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

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

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/11e64d0a97a8a6333d6a8999350a3006..jpg

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

https://mmbiz.qpic.cn/mmbiz_jpg/Xxm5O5TNdibjLkUxY1V9LWkjjxO6LYJvDLdYyJM2e1yFK6vL7TS09E4icGdrcW5jgUR8zHDyv4QkqtFQ285w31AQ/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

成功运行啦http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/cb6f73e3b30ac0c64a7b68910061f917..jpg

经过测试没有发现致命问题,本次react升级就大功告成啦http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/c70d598311a0e61978a91774e14ea3d7..jpg

0条评论
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群