Node.js躬行记(17)——UmiJS版本升级
在2020年我刚到公司的时候,公司使用的版本还是1.0,之后为了引入微前端,迫不得已被动升级。
一、从 1.0 到 2.0
在官方文档中,有专门一页讲如何升级的,这个用户体验非常好。
一个清单列的非常清楚,内容不多,让我信心大增。并且自己之前也曽依托 umi 2.0开源过一套系统。
所以在实际操作中,升级遇到的阻力没有我想象中的那么大,但期间还是遇到了些难缠的问题,诸如页面空白,文件不存在等。
具体的改造其实就那么几步,升级和替换依赖库,更正路由配置,去除过时文件等。
改造好后,自己粗略的刷刷页面,没啥问题,然后就开心地发布到预发环境。但是在生成source map文件时,报内存栈溢出。
source map文件主要用于监控系统中的代码还原,在实际使用中用的比较少,那就先暂时关闭了。
不过在生产发布的时候,又会报没有source map文件,因为生产有个将文件搬移到指定位置的脚本,得把这个脚本也关闭。
二、从 2.0 到 3.0
为了能更好的引入TypeScript,提升项目代码质量的主动升级,根据官方给出的升级文档进行了改造。
1)router改造
原先 component 中的路径可以包含斜杠,现在不行,因为 Recommend 目录中没有默认的 index.js 文件。
{
path: '/video/recommend',
exact: true,
component: 'video/Recommend/',
}
改成
{
path: '/video/recommend',
exact: true,
component: 'video/Recommend',
}
2)model.js验证
默认会做 model 文件的验证,但是我有个文件中包含 jsx 代码,导致无法验证通过,会报解析错误。
Dva model src/models/playViewer.js parse failed, SyntaxError: Unexpected token, expected "," (71:20)
后面就在 .umirc.js 配置文件中取消了验证,skipModelValidate 设置为 true。
export default {
antd: {},
dva: { // 启用引入dva
skipModelValidate: true //跳过 model 验证
},
}
3)namespace不唯一
项目构建的时候,报model的namespace重名的错误,因为 pages 子目录中的文件名都叫model.js。
pages
foo/model.js
bar/model.js
下面是具体的报错信息,查了框架的issue,发现还蛮多人有这问题的,但是我都升级到最新版本还是有问题。
./src/.umi/plugin-dva/dva.ts
[app.model] namespace should be unique
app.model({ namespace: 'model', ...ModelModel29 });
app.model({ namespace: 'model', ...ModelModel30 });
app.model({ namespace: 'model', ...ModelModel31 });
app.model({ namespace: 'model', ...ModelModel32 });
后面发现将文件改个名字,然后放到models目录中,就不会唯一了。但是有300多张页面,都得手动处理。
pages
foo/
models/login.js
bar/model.js
没有找到更有效更直接的方法,只能用这种笨办法了,弄了好几个小时。
中途也发现,很多页面已经废弃了,马上决定移除。
4)Link组件
之前Link组件都是从react-router-dom导入的,但现在会报错:Error: Invariant failed: You should not use <Link> outside a <Router>。
这个好弄,只要换个库就行。
- import { Link } from 'react-router-dom';
+ import { Link } from 'umi';
5)警告
有个比较奇怪的警告,会一直提示,网上很多重复的帖子就是去本地 dva 库替换某条语句,还有就是升级到 2.6 版本。
Warning: Please use `require("history").createHashHistory` instead of `require("history/createHashHistory")`. Support for the latter will be removed in the next major release.
我升级到最新后,还是会有这个提示,就看源码,发现注释掉 dva/router.js 的第一句就行了,不过发到线上后,就不会有这个警告了。
require('./warnAboutDeprecatedCJSRequire.js')('router');
module.exports = require('react-router-dom');
module.exports.routerRedux = require('connected-react-router');
Node.js躬行记(17)——UmiJS版本升级的更多相关文章
- Node.js躬行记(6)——自制短链系统
短链顾名思义是一种很短的地址,应用广泛,例如页面中有一张二维码图片,包含的是一个原始地址(如下所示),如果二维码中的链接需要修改,那么就得发代码替换掉. 原始地址:https://github.com ...
- Node.js躬行记(1)——Buffer、流和EventEmitter
一.Buffer Buffer是一种Node的内置类型,不需要通过require()函数额外引入.它能读取和写入二进制数据,常用于解析网络数据流.文件等. 1)创建 通过new关键字初始化Buffer ...
- Node.js躬行记(2)——文件系统和网络
一.文件系统 fs模块可与文件系统进行交互,封装了常规的POSIX函数.POSIX(Portable Operating System Interface,可移植操作系统接口)是UNIX系统的一个设计 ...
- Node.js躬行记(4)——自建前端监控系统
这套前端监控系统用到的技术栈是:React+MongoDB+Node.js+Koa2.将性能和错误量化.因为自己平时喜欢吃菠萝,所以就取名叫菠萝系统.其实在很早以前就有这个想法,当时已经实现了前端的参 ...
- Node.js躬行记(15)——活动规则引擎
在日常的业务开发中,会包含许多的业务规则,一般就是用if-else硬编码的方式实现,这样就会增加逻辑的维护成本,若无注释,可能都无法理解规则意图. 因为一旦规则有所改变,那么就需要修改代码再发布代码, ...
- Node.js躬行记(19)——KOA源码分析(上)
本次分析的KOA版本是2.13.1,它非常轻量,诸如路由.模板等功能默认都不提供,需要自己引入相关的中间件. 源码的目录结构比较简单,主要分为3部分,__tests__,lib和docs,从名称中就可 ...
- Node.js躬行记(21)——花10分钟入门Node.js
Node.js 不是一门语言,而是一个基于 V8 引擎的运行时环境,下图是一张架构图. 由图可知,Node.js 底层除了 JavaScript 代码之外,还有大量的 C/C++ 代码. 常说 Nod ...
- Node.js躬行记(23)——Worker threads
Node.js 官方提供了 Cluster 和 Child process 创建子进程,通过 Worker threads 模块创建子线程.但前者无法共享内存,通信必须使用 JSON 格式,有一定的局 ...
- Node.js躬行记(3)——命令行工具
一.自定义 创建一个空目录,然后通过npm init命令初始化package.json文件,并按提示输入相关信息或直接回车使用默认信息,生成的内容如下所示. { "name": & ...
随机推荐
- 《手把手教你》系列基础篇(七十五)-java+ selenium自动化测试-框架设计基础-TestNG实现DDT - 中篇(详解教程)
1.简介 上一篇中介绍了DataProvider如何传递参数,以及和一些其他方法结合传递参数,今天宏哥接着把剩下的一些常用的也做一下简单的介绍和分享. 2.项目实战1 @DataProvider + ...
- LGP3426题解
真是不管什么时候来做这道题都会觉得很神仙呐... 观察一下,如果存在一个合法的印章,那么这个印章一定是这个串的前缀,也是这个串的后缀. 即合法的印章一定是原串的 \(\rm Border\). 于是设 ...
- BSOJ5086题解
题意略. 我们设 \([x^k]G_n(x)\) 代表深度为 \(n\) 的树,距离为 \(k\) 的点对数量,\([x^k]F_n(x)\) 为深度为 $ n $ 的树中,深度为 \(k\) 的节点 ...
- Div+CSS 定位 Position
position 属性规定应用于元素的定位方法的类型(static.relative.fixed.absolute 或 sticky). position: static;HTML 元素默认情况下的定 ...
- 关于linux下的open()write()read()close()函数
http://blog.sina.com.cn/s/blog_71d1a98701010s0v.html 1.read和write函数调用时,都会记录下当前写的位置,下次调用时就会从这个位置开始读或写 ...
- sql中数据统计
今天来说一下使用sql统计数据. 用的H2数据库,用的是DBeaver连接工具.有三表,打印表PRINT_JOB,复印表COPY_JOB和扫描表SCANNER_JOB (这段可以忽略)任务是要统计相同 ...
- 什么是MVC模式?
MVC (Model View Controller) 是一个设计模式,使用MVC应用程序被分成三个核心部件:模型.视图.控制器.它们各自处理自己的任务.M是指数据模型,V是指用户界面,C则是控制器. ...
- 什么是feigin?它的优点是什么?
1.feign采用的是基于接口的注解2.feign整合了ribbon,具有负载均衡的能力3.整合了Hystrix,具有熔断的能力使用:1.添加pom依赖.2.启动类添加@EnableFeignClie ...
- JavaScript中call如何使用?
一句话概括:call是函数才能调用的方法.作用是改变属性环境.有点绕,举个例子. 此处代码是在window环境下声明的变量和函数. var name='王延朋'; var age=18; var ex ...
- Mybatis框架基础入门(七)--关联查询
1.一对一查询 1.1 使用resultType接收查询结果 修改pojo类 public class OrderUser extends order { private String usernam ...