技能get,React的优雅升级!

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

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

双手奉上,来,干了!

-2019年第4期-

夫 子 说

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

升级流程:

1、升级React

2、功能测试

OK,下面开始和我一起升级吧~

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

然后,放手开干。

React 15 到 React 16

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

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

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

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

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

激动ing...

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

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

在来看看我的dom版本:

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

npm-check -u

选择dom,然后按enter。

开始安装

安装完成

再次运行npm run dev命令:

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

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

功能测试

一打开首页,不出所料,控制台出错了……

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

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

15版本的,赶紧升级一下

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

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

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

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

【并没有什么用】

来看看VS提示

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

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

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

先切换分支检查一下:

谢天谢地并没有。

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

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

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

逆反一下之前做的步骤。

首先卸载@types/prop-types。

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

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

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

这个PropTypes是引自

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

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

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

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

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

plit-pane是0.x版本:

升级一下split-pane:

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

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

并不可以:

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

(被any挡住的是string)

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

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

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

成功运行啦!

经过测试没有发现致命问题,本次react升级就大功告成啦!

原文地址:https://www.cnblogs.com/dtstack/p/10382935.html

时间: 2024-10-08 20:59:40

技能get,React的优雅升级!的相关文章

react native 增量升级方案(转)

前言 facebook的react-native给我们带来了用js写出原生应用的同时,也使得使用RN编写的代码的在线升级变得可能,终于可以不通过应用市场来进行升级,极大的提升了app修bug和赋予新功能的能力.----使用h5的方式也可以做到,但是rn的用户体验可要远远超过h5啊. 一般使用RN编写的app的线上使用方式,是将react-native bundle命令打出bundle文件和assets文件夹,直接内置到app中,app在viewcontroller或者activity中直接加载a

react如何优雅的绑定事件,并且可以优雅的传参

react函数调用以及传参. 一.先写不传参数的情况 1.es5写法 click(){ dosomething..... } 调用:onClick={this.click.bind(this)} 每次调用都需要传个this. 有的在constructor这样写 this.click = this.click.bind(this) 2.es6写法 click=()=>{ dosomething... } 调用:onClick={this.click},感觉很好 二.如果遇到传参就比较麻烦了 1.e

BAT大牛亲授技能 技巧 Android面试快速充电升级

第1章 课程介绍(本课程专为初中级同学面试复习)本课程专为初中级程度同学面试准备的系统复习指南,本章带你了解面试过程中会遇到的问题,个人应该摆正的心态,以及面试官最为看重你的解决问题的思路.关于框架面试专题课程请移步到:http://coding.imooc.com/class/157.html1-1 课程介绍 第2章 Android开发岗位技术要求和面试前的准备本章对各个级别Android开发工程师的招聘需求进行深入分析,并带大家清晰完整的了解面试复习与准备思路,做到有的放矢,有侧重点的进行复

React项目升级遇到的问题复盘(2019-09-02)

老铁们,发没发现我换了个贼帅的头像,高端大气上档次,非洲大地我最凶!可把我自己牛逼坏了. 不扯啦不扯啦,抓紧进入今天的正题,从今天开始我会每天写一下每天工作的出现的问题,主要对这些问题出现的原因,以及对这些问题是怎么思考的,怎么在后续的工作中避免出现类似的问题,我的宗旨是在哪里跌倒就在哪里躺好,今天的主要问题还是来自于React项目的升级,我们一起来看一下,填填坑 问题:  1.React中父组件传递的函数和从redux中取到的函数的命名问题    2.React中获取数据的异步请求该注意的地方

深刻理解Nginx之基本配置和升级(2)

3 Nginx基本配置 3.1 时间模型 事件模型尾随着指令,它同意你网络机制.有一些參数对于应用程序的性能有重要的影响. 比方,以下的指令片段所看到的: user nginx nginx; master_process on; worker_processes 4; events { worker_connections 1024; use epoll; } [...] 配置了4个进程,每一个进程的处理事务的个数能够同一时候支持1024事件,使用epoll选择机制. 3.2 配置模型 Ngin

react实现的tab切换组件

我有点想要吐槽,因为用原生的js实现起来挺简单的一个小东西,改用react来写却花了我不少时间,也许react的写法只有在复杂的web应用中才能体现出它的优势吧!不过吐槽归吐槽,对react这种优雅的代码的写法我自己是很喜欢的啊!来简单的讲一下,希望能对react的初学者有一些帮助... 效果图: 组建的编写用了一些es6的语法,用webpack作为转译打包工具. 把核心代码贴上来下... var React=require("react"); var ReactDOM=require

React Native之prop-types进行属性确认

React Native已经升级到0.51.0了,版本升级很快,但是对老项目也会有一些问题,常见的就是属性找不到的问题.例如: 主要原因是随着React Native的升级,系统废弃了很多的东西,过去我们可以直接使用 React.PropTypes 来进行属性确认,不过这个自 React v15.5 起就被移除了,转而使用prop-types库来进行替换 属性确认 属性确认的作用 使用 React Native 创建的组件是可以复用的,所以我们开发的组件可能会给项目组其他同事使用.但别人可能对这

React Native之属性类型检查机制详解 PropType 变成 prop-types

属性确认的作用 使用 React Native 创建的组件是可以复用的,所以我们开发的组件可能会给项目组其他同事使用.但别人可能对这个组件不熟悉,常常会忘记使用某些属性,或者某些属性传递的数据类型有误. 因此我们可以在开发 React Native 自定义组件时,可以通过属性确认来声明这个组件需要哪些属性.这样,如果在调用这个自定义组件时没有提供相应的属性,则会在手机与调试工具中弹出警告信息,告知开发者该组件需要哪些属性. React Native已经升级到0.51.0了,版本升级很快,但是对老

最火移动端跨平台方案盘点:React Native、weex、Flutter

1.前言 跨平台一直是老生常谈的话题,cordova.ionic.react-native.weex.kotlin-native.flutter等跨平台框架的百花齐放,颇有一股推倒原生开发者的势头. 为什么我们需要跨平台开发? 本质上,跨平台开发是为了增加代码复用,减少开发者对多个平台差异适配的工作量,降低开发成本,提高业务专注的同时,提供比web更好的体验.嗯-通俗了说就是:省钱.偷懒. 目前移动端跨平台开发中,备受关注的方案大致归纳为以下几种情况: 1)react native.weex均使