Umi3.5升级Umi4过程记录

记录一次旧项目升级umi3到4的过程,希望踩过的坑可以给大家带来一点帮助。
项目背景:(只说一下重点)
react@16
antd@4(初始是antd3,升级到4的)
antd-pro@2(万年老版,已经不知道用在哪里)
umi@3.5(配套的 reatc-redux,dva)
react-router-dom@4(版本有点低)

项目本身是一套后台管理,小型系统,整体可控。

升级过程:

  1. 升级 reace@17

    package.json 直接处理:
    "react": "^17.0.2”
    "react-dom": "^17.0.2",
    

    好像没有任何不适,完美兼容,赞一下。(主要是第二步需要react@17)

  2. 引入jotai,用来代替dva

  • 因为之前直接升级umi4,好像遇到了dva的问题
  • 也因为旧项目,dva的封装, api.js --> model/project.js --> dispatch 的引用,还不能用 sync/await,让我不爽
  • stroage数据不刷新,发布代码后,经常需要手动清空,原因不明
  • 一个关键点:需要引入 React.Suspense解决ajax请求白屏的问题。但也会带来过渡白屏的问题(尴尬),自己取舍吧。
  • 最后留下一个空壳文件。 (该内容在升级完成后,移除了)
# modules/login.js
// 因为umi的问题,如果不保留,会导致加载dvajs报错,所以需要保留一下
export default {
  namespace: 'login',
  state: {},
  effects: {
    *tokenLogin({}, {}) {
      return null;
    },
  },
};
  • 最后才知道umi@4 max版也引入了 valtio ,貌似功能类似,不管了
  1. 升级 umi@4,参考的升级指南 https://umijs.org/docs/introduce/upgrade-to-umi-4
{
  "devDependencies": {
+   "@umijs/max": "^4.0.0",
-   "umi": "^3.0.0",
-   "@umijs/preset-react": "^1.2.2"
  }
}
  • 修改 umi 的配置 config.js
import { defineConfig } from 'umi';
import routes from './router.config.js';
import defaultSettings from '../src/defaultSettings.js';

export default defineConfig({
  plugins: [
    '@umijs/plugins/dist/antd',
  ],
  routes,
  mfsu: {
    strategy: 'normal',
  },
  antd: {},

  hash: true,
  history: { type: 'hash' },
  outputPath: 'dist-build',
  esbuildMinifyIIFE: true,
  lessLoader: {
    javascriptEnabled: true,
  },
  cssLoader: {
    modules: {
      getLocalIdent: (context, localIdentName, localName) => {
        return localName;
      },
    },
  },
});
  • 升级 nodejs@16至 nodejs@18 ,我比较保守,慢慢升
  • 关键点,需要安装 yarn add @umijs/plugins yarn add @umijs/plugin-antd ,并在config中引入,否则antd相关的css貌似无法装载。
  • esbuildMinifyIIFE 必须打开
  • outputPath: 'dist-build', 之前是 outputPath: '/dist-build', 貌似判别方法变了
  • 两个 cssLoader,不太明白,但GPT如是说,放上
  • 还遇到自定义的 less 混合宏代码不生效,less代码重写后生效了。
  • 在BasicLayout.menuList,渲染菜单树时卡了比较久,之前props.route,有所有路由表。现在没有了,只能自己用route.config.js去处理转换一下,因为比较深,递归也用上了。
  • props中,不再包含 route / location {query} 需要自己往里填,所以自己包装了一个高阶函数(HOC),对所有组件包装一下,真累,不过同时把需要的全局字节数据也做了进去,确实也方便了许多。
// hoc.js

import { useAtom } from 'jotai';
import React from 'react';
import { useLocation, useSearchParams } from 'react-router-dom';
import allSampleTypesAtom, { allProductsAtom } from '@/models/atom.js';
import routesConfig from '../../config/router.config.js';
import { getRouter } from './utils.js';


// 因为升级umi4导致像 location.query不能直接获取,需要包装一下。顺便把需要的字典数据加进来
const withQueryParams = (WrappedComponent, dataLoads = {}) => {
  return (props) => {
    const location = useLocation();
    const [searchParams] = useSearchParams();
    // 将查询参数解析为对象格式
    location.query = Object.fromEntries([...searchParams]);

    // 获取路由
    const route = getRouter(location.pathname, routesConfig);

    // 附加数据
    const appendData = {};

    if (dataLoads.allProducts) {
      const [allProducts] = useAtom(allProductsAtom);
      appendData.allProducts = allProducts;
    }

    if (dataLoads.allSampleTypes) {
      const [allSampleTypes] = useAtom(allSampleTypesAtom);
      appendData.allSampleTypes = allSampleTypes;
    }

    return <WrappedComponent {...props} location={location} route={route} {...appendData} />;
  };
};

export default withQueryParams;

使用时

import withQueryParams from '@/utils/hocs.js';
...
class SampleEdit extends PureComponent {
...
}
...

export default withQueryParams(SampleEdit); // SampleEdit;
  • document.ejs 没用了,有点意外。加载外部的cdn,需要在config.js中增加配置项(不开心)
headScripts: [
    { src: 'https://rescdn.qqmail.com/node/ww/wwopenmng/js/sso/wwLogin-1.0.0.js' }
  ],

最后,yarn add prettier@latest -D升级一下格式化工具

至此大面上的事情基本解决。基本耗时一周多的人力。后续慢慢体会 mako:{}, 倒底快没快

祝大家都升级顺利。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,192评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,858评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,517评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,148评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,162评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,905评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,537评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,439评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,956评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,083评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,218评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,899评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,565评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,093评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,201评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,539评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,215评论 2 358

推荐阅读更多精彩内容