当前位置: 首页 > 编程日记 > 正文

23 版本以上的v4包_Ant Design Pro V2升级到V4 小结

3780d36f2677dd02b7fc8406cc6434d4.png

前言

前不久接手过一个历史悠久的项(shi)目(shan),技术栈之复杂(混乱)令我潸然泪下:你甚至可以在一个项目里使用前端三大框架(Angular1, Vue, React)。

三份的代码,本应该给我带来更多的快乐,但是为什么会变成这样呢?

鉴于接到的是一个全新的需求,于是我又双叒叕引入了Ant Design Pro V4全家桶(第四份的快乐)。HooksAnt Design V4的搭配,的确用着很香,尤其是Form表单的重写,大大提高了开发效率。于是趁着空闲时间,我决定把一个自己负责的Ant Design Pro V2项目也升级到V4版本。

特此记录下升级过程。

UMI3升级

我当时使用的是ant-design-pro 2.2.0 脚手架 生成的前端项目(JS版,非TS版),使用的是umi@2antd@3。因此,首先要把UMI升级到最新的V3版本。

参考官方文档: 1. 《快速升级到 umi@3》 2. 《升级 antd pro 项目到 umi@3》

a. 删除package.json里的dvaumi-plugin开头的插件,改成"umi": "^3.0.0""@umijs/preset-react": "^1.2.2"

其中@umijs/preset-react已经包含了之前的umi-plugin插件

{"dependencies": {
-   "dva": "^2.6.0-beta.16",},"devDependencies": {
-   "umi": "^2.13.0",
-   "umi-types": "^0.5.9"
-   "umi-plugin-react": "^1.14.10",
-   "umi-plugin-ga": "^1.1.3",
-   "umi-plugin-pro": "^1.0.2",
-   "umi-plugin-antd-icon-config": "^1.0.2",
-   "umi-plugin-antd-theme": "^1.0.1",
-   "umi-plugin-pro-block": "^1.3.2",
+   "umi": "^3.0.0",
+   "@umijs/preset-react": "^1.2.2"}
}

执行npm install重新安装

实践过程中发现:

需要更新antd@3至最新版:npm i antd@3.26.20

重新安装npm i redux react-redux

b. 修改config/config.js 配置文件

原先是直接导出一个对象:

export default {}

现在改成:

import { defineConfig } from 'umi';export default defineConfig({})

删除废弃的属性: pluginsdisableRedirectHoist

删除devtool的配置,使用默认配置即可

大致改成如下格式:

import { defineConfig, utils } from 'umi';const { winPath } = utils;export default defineConfig({// 通过 package.json 自动挂载 umi 插件,不需再次挂载// plugins: [],antd: {},dva: {hmr: true,},locale: {default: 'zh-CN',baseNavigator: true,},dynamicImport: {// 无需 level, webpackChunkName 配置// loadingComponent: './components/PageLoading/index'loading: '@/components/PageLoading/index',},// 暂时关闭pwa: false,lessLoader: { javascriptEnabled: true },cssLoader: {// 这里的 modules 可以接受 getLocalIdentmodules: {getLocalIdent: (context, localIdentName, localName) => {if (context.resourcePath.includes('node_modules') ||context.resourcePath.includes('ant.design.pro.less') ||context.resourcePath.includes('global.less')) {return localName;}const match = context.resourcePath.match(/src(.*)/);if (match && match[1]) {const antdProPath = match[1].replace('.less', '');const arr = winPath(antdProPath).split('/').map(a => a.replace(/([A-Z])/g, '-$1')).map(a => a.toLowerCase());return `antd-pro${arr.join('-')}-${localName}`.replace(/--/g, '-');}return localName;},}}
})

c. 模块导入方式改变

// 导入方式改变
- import Link from 'umi/link';
- import { connect } from 'dva';
- import { getLocale, setLocale, formatMessage } from 'umi-plugin-react/locale';
+ import {
+   Link,
+   connect,
+   getLocale,
+   setLocale,
+   formatMessage,
+ } from 'umi';// 路由跳转方式改变
- import { router } from 'umi';
+ import { history } from 'umi';
- router.push()
+ history.push()

d. 路由配置修改

umi2中,权限路由是配置Routes属性。在umi3中,则改成了wrappers属性。

修改config/router.config.js

export default [// app{path: '/',component: '../layouts/BasicLayout',wrappers: ['../pages/Authorized'], // Routes 变成了 wrappersroutes: [],},
];

e. 重新启动项目

npm run start 理论上,项目应该能够被umi3启动起来了。

如果仍然报错,则自行根据报错原因修改代码即可。

Ant Design Pro 内置组件升级

Ant Design Pro v2脚手架提供的Layout组件,已被抽离成了一个单独的npm包@ant-design/pro-layout。同时官方又封装了几个常用的组件,方便快速进行业务开发,详见ProComponents官网。

不过我原项目中的Layout组件功能暂时够用,考虑到代码改动较大,因此暂时没有升级该组件。

Ant Design 4 升级

参考官方文档: 《从 v3 到 v4》

a. antd升级到3.x最新版本(前面我们已经在升级umi3的过程升级了antd),按照控制台 warning 信息移除/修改相关的 API

b. 升级项目 React 16.12.0 以上 npm i react@^16.12.0

重新运行项目,查看是否能正确运行

c. 使用命令行工具快速升级

由于antd4重构了大量的组件,为了兼容已有antd2废弃的组件(比如旧版本的Form),官方提供了@ant-design/compatible这个npm包

import { Form, Mention } from '@ant-design/compatible';
import '@ant-design/compatible/assets/index.css';

官方提供了一个cli工具,可以自动转换代码的引入方式。在运行cli前,请先提交你的本地代码修改

# 进入旧项目
cd myproject
# 通过 npx 直接运行
# src 就是前端源代码目录夹
npx -p @ant-design/codemod-v4 antd4-codemod src

对于无法自动修改的部分,codemod 会在命令行进行提示,建议按提示手动修改。修改后可以反复运行上述命令进行检查。

d. 升级antd版本

npm i antd@^4.0.0 @ant-design/icons@^4.0.0 @ant-design/compatible@^1.0.0

安装成功后,重启项目,查看页面效果。

升级后的问题

a. 样式问题

升级后的的历史代码,Form组件引用的是@ant-design/compatible,class类名发生了变化,从ant-form变成了ant-legacy-form。如果你的项目里对这部分的样式进行了修改,则需要手动修改类名了。

样式问题只能靠自己一个个页面去排查了。。。

b. API 问题

// 旧版
<TextArea autosize={{ minRows: 5 }} />// 新版
<TextArea autoSize={{ minRows: 5 }} />

这种api的变化,只能靠人工编码和页面报错来修复了。。。

c. antd4 自身的bug

比如 RangePicker属性defaultPickerValue无效

升级有风险,挖坑需谨慎!

总结

此次升级的过程比我预想的要轻松很多,不过也是在项目页面不多(只有20多个页面),初期底层框架由我搭建(系统较熟悉)的前提下完成的。

前言中我有提到的那个历史遗留的巨石应用,其实已经在一个岌岌可危,即将不可维护的状态下了。即使我又引入了最新的技术栈,然而若干年后,接手的人员肯定会吐槽:Antd pro 4 这版本也太老了吧!

市面上这几年也提出了微前端的概念,相应的微前端框架single-spa,qiankun也应运而生。

看着手里维护的各种技术栈的代码,我想起了一句名言:

世上本没有微前端,吹的人多了,也便成了KPI。老夫写代码都是jQuery一把梭! — 鲁迅

相关文章:

python标准库介绍——23 UserString 模块详解

UserString 模块(2.0 新增) UserString 模块包含两个类, //UserString// 和 //MutableString// . 前者是对标准字符串类型的封装, 后者是一个变种, 允许你修改特定位置的字符(联想下列表就知道了).注意 //MutableString// 并不是效率很好, 许多操作是通过切片和字符串连接实现…

影像融合操作的几种途径

影像融合操作的几种途径 1、在遥感软件中作影像融合 融合必须在全色波段和多光谱波段两者配准好的基础上进行&#xff0c;我建议你用edars融合&#xff0c;这样比较省时。据说PCI最好&#xff0c;机器没有软件没有试验。 在envi中&#xff0c;把全色波段和多光谱波段两个图像…

微信小程序万里目_微信小程序学习用推荐:破音万里:音频播放,音乐列表

[AppleScript]let bsurl https://poche.fm/api/app/playlists var common require(../../../utils/util.js); let seek 0 let defaultdata { winWidth: 0, winHeight: 0, listHeight: 0, // tab切换 currentTab: 0, // 播放列表 playlists: [], tracks: [], coverImgUrl: &…

11月11日截止报名!快来参加顶尖极客汇聚的“AI Challenger 全球AI挑战赛”!

“AI Challenger 全球AI挑战赛”是面向全球人工智能人才的开源数据集和编程竞赛平台&#xff0c;致力于满足AI人才成长对高质量丰富数据集的需求&#xff0c;推动AI在科研与商业领域结合来解决真实世界的问题。AI Challenger以服务、培养AI人才为使命&#xff0c;打造良性可持续…

Asp.net下实现隐藏真实下载地址(可以实现简单的防盗链)

现在随着FlashGet和xunlei等下载工具的日益普及&#xff0c;下载网站的一些下载地址都能直接被捕获到&#xff0c;&#xff0c;但是有些时候为了防盗链或权限限制不想对地址进行暴露&#xff0c;对于Asp.net下的防盗链有很多方法&#xff0c;我这里写了一种&#xff08;51aspx的…

大众点评数据平台架构变迁

2019独角兽企业重金招聘Python工程师标准>>> 最近和其他公司的同学对数据平台的发展题做了一些沟通&#xff0c;发现各自遇到的问题都类似&#xff0c;架构的变迁也有一定的相似性。 以下从数据&架构&应用的角度对2012.07-2014.12期间大众点评数据平台的架构…

无人驾驶汽车系统入门:基于深度学习的实时激光雷达点云目标检测及ROS实现...

参加 2018 AI开发者大会&#xff0c;请点击 ↑↑↑作者&#xff1a;申泽邦&#xff08;Adam Shan&#xff09;&#xff0c;兰州大学在读硕士研究生&#xff0c;主要研究方向无人驾驶&#xff0c;深度学习&#xff1b;兰大未来计算研究院无人车团队负责人&#xff0c;自动驾驶全…

sendmail服务器配置过程中出现的一些错误和解决办法

sendmail服务器配置过程中出现的错误和解决办法 以前在做实验的过程中总结和写的一些教程的一些资料&#xff0c;一直没时间发布到博客上面&#xff0c;五一到了&#xff0c;终于有点时间发布啦&#xff01;关于Linux上面还会有RHCE系列的学习笔记发表 1、rpm包不能正常卸载&am…

python多功能电子钟_python gui - PyQt4 精彩实例分析之电子钟

PyQt4 精彩实例分析之电子钟&#xff0c;当然在写实例之前要先安装PyQt4模块。from PyQt4.QtGui import *from PyQt4.QtCore import *import sysclass DigiClock(QLCDNumber):def __init__(self,parentNone):super(DigiClock,self).__init__(parent)pself.palette()p.setColor(…

编译安装Zabbix 2.2 (LNMP环境)

说明&#xff1a;操作系统&#xff1a;CentOS7环境&#xff1a;mysql5.6PHP5.5Nginx1.12Zabbix版本&#xff1a;Zabbix2.2编译安装确实比YUM安装麻烦好多些&#xff0c;但是为了加强对Zabbix的理解&#xff0c;编译安装还是很有意义的&#xff0c;毕竟这样自己能很清楚安装路径…

凸透镜成像实验软件_中考物理凸透镜成像难点解析

凸透镜一直以来都是中考物理上考察的重点内容&#xff0c;生活中也有很多凸透镜成像的例子&#xff0c;如照相机成像。那么凸透镜成像这类问题该如何解答呢&#xff1f;小编为你整理了凸透镜成像的难点&#xff0c;让你能在遇到这类问题时能够全部解答出来。一、凸透镜对光的作…

总奖金300万的AI Challenger 2018进入第二阶段,决赛在即!

参加 2018 AI开发者大会&#xff0c;请点击 ↑↑↑此前&#xff0c;AI科技大本营曾报道过奖金池高达 300 万元的 AI Challenger 2018 比赛。与往届不同&#xff0c;今年的比赛共有 5 个主赛道&#xff0c;5 个实验赛道。其中&#xff0c;5 个主赛道的数据集包括&#xff1a;观点…

如何做好中层领导

中层经理人不论是作为一名执行者、还是一名领导者&#xff0c;都必须通过别人来完成任务。要做个“服众”的经理人&#xff0c;应该有意识地提高以下八项能力&#xff1a; 1. 领悟能力 做任何一件事以前&#xff0c;一定要先弄清楚上司希望你怎么做&#xff0c;然后以此为目标来…

200行代码,一行行教你自制微信机器人

参加 2018 AI开发者大会&#xff0c;请点击 ↑↑↑作者|上海小胖&#xff0c;四大咨询的TechLead&#xff0c;mongoDB Professional 获得者。「Python专栏」专注Python领域的各种技术&#xff1a;爬虫、DevOps、人工智能、Web开发等。还有「大航海计划」&#xff0c;各种内推活…

只有你想不到,没有它做不到——可随时变身的模块化机器人

默默单干不如灵活协作 独立单干虽自由灵活&#xff0c;但是和牛逼队友协作完成任务却是一件更美好、高效的事情。这不是只适用于人类社会的定律&#xff0c;在机器人世界里依然如此。 雷锋网消息&#xff0c;近日&#xff0c;著名英国杂志Nature Communications报道了一项关于协…

dlib 怎么安装vs2017_VS2017(Visual Studio2017) 搭建QT5开发环境

VS创建QT工程并添加到GitHub中大家好!欢迎打开并阅读本文&#xff0c;这次咱们说说怎么在VS中创建一个QT项目并且放到GitHub中吧因为GitHub或者码云Gitee都是一个很好的提供代码托管的地方对吧将自己的项目开源到上面&#xff0c;如果项目很好的话&#xff0c;肯定能收获到很多…

ASP.net 2.0中水晶报表迁移部署问题

asp.net 2.0的水晶报表&#xff0c;在迁移机器的时候&#xff0c;如果目标机器没有相应的程序集&#xff0c;在IIS中会报错。错误描述&#xff1a;Parser Error Description: An error occurred during the parsing of a resource required to service this request. Please re…

MySQL数据类型--------字符串类型实战

1. 背景 * MySQL支持的字符串类型有CHAR、VARCHAR、二进制、var二进制、BLOB、文本等等。 2. 字符串类型所需的存储和值范围 类型说明N的含义是否有字符集最大长度CHAR(N)定义字符字符是255VARCHAR(N)变长字符字符是16384BINARY(N)定长二进制字节字节否255VARBINARY(N)变长二进…

android怎么监听多点触摸_什么是多点触控技术,有哪些用途

自从乔布斯将触控技术用于苹果手机上&#xff0c;很多的手机厂商纷纷效仿&#xff0c;触控技术几乎成为手机的“标配”。其实&#xff0c;触控技术早就存在&#xff0c;只是一直未能大面积用于各种设备中&#xff0c;本文将带您认识神奇的触控技术。并非只有手机上可以看到触控…

帮AI摆脱“智障”之名,NLP这条路还有多远?

CSDN 出品的《2018-2019 中国人工智能产业路线图》V2.0 版即将重磅面世&#xff01; V1.0 版发布以来&#xff0c;我们有幸得到了诸多读者朋友及行业专家的鼎力支持&#xff0c;在此表示由衷感谢。此次 V2.0 版路线图将进行新一轮大升级&#xff0c;内容包括 3 大 AI 前沿产业趋…

分页控件 WebPager [ZT]

两个类文件&#xff0c;点这里下载DLL文件>WebPager.dll1、 WebPager.csusing System;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.ComponentModel; [assembly:TagPrefix("WebPager", "wp")]namespace Xiaoqia…

typedef interrupt void (*PINT)(void)的分析

今天写程序时&#xff0c;在DSP2833x_PieVect.h看到typedef interrupt void (*PINT)(void)突然一愣&#xff0c;上网查了下发现在这是加了interrupt 中断关键字的函数指针&#xff0c;顺便记一下并复习一下函数指针。 本文参照下面的博客整理而来 http://blog.csdn.net/lg2lh/a…

webpack打开项目命令_配置webpack中dev.env.js、prod.env.js,解决不同命令下项目启动和打包到指定的环境...

前后端分离的项目开发中&#xff0c;我们有开发环境、测试环境、预生产环境和生产环境。1、开发环境下调试接口的时候&#xff0c;一般都会有好几个接口地址(开发服务器上的&#xff0c;本地的&#xff0c;接口开发人员的&#xff0c;七七八八的接口地址)&#xff0c;要根据情况…

倒计时2天,如何搭乘通往AI全明星技术盛宴的末班车?(附大会完整版全日程)...

在操作系统、芯片领域跌倒的中国程序员&#xff0c;如何崛起&#xff1f;| 畅言GitHub服务中断24小时11分钟事故分析报告大咖指路&#xff1a;机器学习人才这些方向最紧缺&#xff01;以太坊2.0? 亲历3天的Devcon我看到了这样一个以太坊 | 见闻录土味纪实文学 | 四十五度角仰望…

ASP.NET Web页面(.aspx)添加用户控件(.ascx)无显示的问题

写好的用户控件点击视图显示没有问题&#xff0c;但是将控件添加到Web窗体上时却显示如下图标:F5运行&#xff0c;查看源代码:有代码——但是页面却显示一片空白。分析代码&#xff0c;比较了一下能显示用户控件的其他web页面以及代码,发现只有如下代码不同:<script languag…

AI芯片的“战国时代”:计算力将会驶向何方?

CSDN 出品的《2018-2019 中国人工智能产业路线图》V2.0 版即将重磅面世&#xff01;V1.0 版发布以来&#xff0c;我们有幸得到了诸多读者朋友及行业专家的鼎力支持&#xff0c;在此表示由衷感谢。此次 V2.0 版路线图将进行新一轮大升级&#xff0c;内容包括 3 大 AI 前沿产业趋…

python 累积正态分布函数_为什么机器学习都围绕正态分布进行讨论?

作者 | Farhad Malik译者 | Monanfei责编 | 夕颜出品 | AI科技大本营(ID: rgznai100)为什么正态分布如此特殊&#xff1f;为什么大量数据科学和机器学习的文章都围绕正态分布进行讨论&#xff1f;我决定写一篇文章&#xff0c;用一种简单易懂的方式来介绍正态分布。在机器学习的…

Silverlight开发中遇到的几个小问题

1&#xff0c;程序发布时遇到错误&#xff1a; "Could not load type System.ServiceModel.Activation.HttpModule from assembly System.ServiceModel, Version3.0.0.0, Cultureneutral, PublicKeyTokenb77a5c561934e089" 可能引发此问题的原因&#xff1a; 安装.N…

最新DynamipsGUI2.8[模拟器]发布!(中文版-英文版下载)

DynamipsGUI2.8发布!2.0beta新增功能1.支持分布式Dynamips&#xff0c;最多支持9台PC联合进行路由交换模拟(可能存在问题,请测试提出问题)2.设备支持数量增加至路由器44台,交换机44台,适应超大型环境模拟3.支持2691,3725,3745(可能存在问题,请测试提出问题)4.集成最新dynamips-…

ue4 函数和宏区别_【UE4】通俗易懂 用蓝图来学习 C++ 基础知识

【前言】&#xff1a;用老罗来学UE蓝图&#xff1a;https://zhuanlan.zhihu.com/p/135297007​zhuanlan.zhihu.com再开个脑洞&#xff0c;用蓝图来类比学习C基础知识。C 刚开始学&#xff0c;所以本篇知识点不是特别全有些地方也可能不是特别准&#xff0c;望谅解&#xff0c;以…