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控制流学习
java流程控制学习 Scanner对象 概念 1.通过Scanner类实现程序和人的交互,通过它获取到用户的输入.java.util.Scanner是java5的特征. 我们可以通过Scanner类 ...
- 路径查找算法应用之A*算法
环境:Visual Studio 2017 + .Net Framework 4.5 应用场景:在画板上查找起始点和目标点之间的最短最直路径,最后画出连接两个点之间的折线. 算法简介:A*算法是一种性 ...
- CF587F&CF547E题解
这两道题好像啊 贡献一种使用SAM和ACAM草两道题的方法 下面假装有 \(O(\sum |S|=m)=O(n)\). 你看看,这CF换过多少个出题人啦?换汤不换药啦!其实这两道题是同一个人出的 CF ...
- java垃圾处理机制
java文件通过编译器(javac命令)生成class文件(字节码文件),其通过java命令启动虚拟机将字节码文件转换成平台能够理解的方式运行. 类存在于源文件里面,方法存在于类中,语句存在与方法中. ...
- Django的缓存机制和信号
Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户 ...
- mybatis缓存-二级缓存
1.2 二级缓存 [官方声明] => 如何开启[二级缓存] 默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存. 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行 ...
- dev编译器兼容设置及字符串的识别问题
#include<bits/stdc++.h> using namespace std; bool cmp(char a,char b) { return a>b; } //int ...
- RabbitMQ 的集群?
镜像集群模式 你创建的 queue,无论元数据还是 queue 里的消息都会存在于多个实例上,然后 每次你写消息到 queue 的时候,都会自动把消息到多个实例的 queue 里进行消息 同步. 好处 ...
- 什么是 zuul路由网关?
(1)Zuul 包含了对请求的路由和过滤两个最主要的功能:其中 责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础而过滤器功能则负 请求的处理过程进行干预,是实现请求校验.服务聚合等功 ...
- Spring与Web项目整合的原理
引言: 在刚开始我们接触IOC时,我们加载并启用SpringIOC是通过如下代码手动加载 applicationContext.xml 文件,new出context对象,完成Bean的创建和属性的注入 ...