Umi3.5升级Umi4过程记录

2024-10-24  本文已影响0人  勤劳一沙鸥

记录一次旧项目升级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

# modules/login.js
// 因为umi的问题,如果不保留,会导致加载dvajs报错,所以需要保留一下
export default {
  namespace: 'login',
  state: {},
  effects: {
    *tokenLogin({}, {}) {
      return null;
    },
  },
};
  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"
  }
}
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;
      },
    },
  },
});
// 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;
headScripts: [
    { src: 'https://rescdn.qqmail.com/node/ww/wwopenmng/js/sso/wwLogin-1.0.0.js' }
  ],

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

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

祝大家都升级顺利。

上一篇 下一篇

猜你喜欢

热点阅读