调研 UmiJS 4

2025-12-10 15:11:27

公司有一个旧项目还在用 create-react-app,这个脚手架四年前就停止维护了,目前存在依赖包版本冲突问题,调研后决定使用 UmiJS 作为底层框架,本文为调研中记录的笔记。

目录:

使用 Antd

如果还要使用 dva,那就安装 @umijs/plugins,这个插件同时包含 antd 和 dva,就不要单独再安装 antd 了。

$ npm install --save-dev @umijs/plugins

直接安装依赖就可以使用,不需要做任何配置。

$ npm install antd --save

如果要设置 antd 主题,在 .umirc.ts 中添加如下配置:

import { defineConfig } from 'umi'

export default defineConfig({
  // ...
  plugins: [
    '@umijs/plugins/dist/antd',
  ],
  antd: {
    theme: {
      token: {
        colorPrimary: '#74b6b6',
      },
    },
  }
});

使用 TailwindCSS

执行如下命令就可以使用 TailwindCSS 了。

$ npx umi g tailwindcss

这个命令会自动做三件事:

  • 安装 tailwindcss 依赖;
  • 项目根目录下创建 tailwind.css 和 tailwind.config.js 配置文件;
  • .umirc.ts 中添加配置 plugins: ['@umijs/plugins/dist/tailwindcss']

使用 Dva

手动安装下 @umijs/plugins

$ npm install --save-dev @umijs/plugins

.umirc.ts 中添加两行配置:

export default defineConfig({
  // ...
  plugins: [
    '@umijs/plugins/dist/dva',
  ],
  dva: {},
});

创建 src/models/test.ts,这个是约定的 src/models 下面的文件会自动注册为 dva model。

export default {
    namespace: 'test',
    state: {
        name: 'hello dva',
    },
    reducers: {
        updateState(state: any, { payload }: any) {
            return {
                ...state,
                ...payload,
            }
        },
    },
}

在页面中使用 dva

import { useSelector, useDispatch } from 'umi'

export default function Page() {
  const dispatch = useDispatch()
  const test = useSelector((state: any) => state.test)

  return (
    <div>
      <h1>{ test.name }</h1>
      <button 
        onClick={() => {
          dispatch({ 
            type: 'test/updateState', 
            payload: { name: 'hello world' }, 
          })
        }}
      >
        update name
      </button>
    </div>
  )
}

如果有问题,就将 src 目录下的 .umi 目录删除,然后重新运行 npm run dev 应该就可以了。

页面权限

只有登录后才能访问 user 页面,否则会自动跳转登录页面。

.umirc.ts 文件 routes 配置添加 wrappers 属性。

export default {
  routes: [
    { 
      path: '/user', 
      component: 'user',
      wrappers: [
        '@/wrappers/auth',
      ],
    },
    { 
      path: '/login', 
      component: 'login', 
    },
  ]
}

然后在 src/wrappers/auth 中

import { Navigate, Outlet } from 'umi'

export default (props) => {
  const { isLogin } = useAuth()
  if (isLogin) {
    return <Outlet />
  } else{
    return <Navigate to='/login' />
  }
}

页面跳转

命令式页面跳转。

import { history } from 'umi'

history.push('/list')

Link 组件跳转。

import { Link } from 'umi';

export default function Page() {
  return (
    <div>
      <Link to="/users">Users Page</Link>
    </div>
  )
}

设置网站图标

src 目录下直接放置 favicon.ico 文件即可。

设置网站标题

.umirc.ts 中添加 title 配置:

{
  // ...
  title: '网站标题',
}

设置网站字体

网络字体

.umirc.ts 中添加 styles 配置:

{
  // ...
  styles: [
    'https://fonts.googleapis.com/css?family=Nunito+Sans:200,300,400,600,700,800,900&display=swap&subset=latin-ext'
  ]
}

在 src/global.css 中添加样式:

* {
  font-family: 'Nunito Sans', sans-serif;
}

404 页面

访问不存在的路径时跳转 404 页面,按照如下方式可以自定义 404 页面内容。

创建 src/pages/404.tsx

import { Empty } from 'antd'

export default function Page() {
  return (
    <Empty description="Not found ..." />
  )
}

.umirc.ts 中添加如下配置:

{
  // ...
  routes: [
    // ...
    {
      path: '/*', 
      component: '404', 
    }
  ]
}

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: