2025 ๅนด umi ๐Ÿ†š umi max

2,178 ้˜…่ฏป4ๅˆ†้’Ÿ

่ƒŒๆ™ฏ

umijs v4 ๅŽๅ‡บ็Žฐไบ† umi ๅ’Œ maxใ€‚ๅฆ‚ๆžœๅ‡็บงๆˆ–ไบŒ่€…ไน‹้—ด้€‰ๅž‹ๅบ”่ฏฅๅฆ‚ไฝ•้€‰ใ€‚

ๆœฌๆ–‡ๅฐ†่ฏ•ๅ›พไปŽไปฃ็ ๅฑ‚้ขๆฏ”่พƒไบŒ่€…๏ผŒ่ฎฉๅคงๅฎถๅฏนไบŒ่€…ๆœ‰ไธชๆธ…ๆ™ฐ็š„่ฎค่ฏ†ใ€‚

ๆ–‡็ซ ไปฃ็ ๅŸบไบŽ @umijs/max v4.4.9 umi v4.4.9 ๆœฌๆ–‡ๆ—ฅๆœŸ 2025-4-23ใ€‚

TLDR

max = umi + ไธ€็ณปๅˆ—้ข„ๅˆถๆ’ไปถ๏ผˆantdใ€ๆƒ้™ใ€ๆ•ฐๆฎๆตใ€ๅพฎๅ‰็ซฏใ€tailwindcssโ€ฆโ€ฆ ๅฏๆŒ‰้œ€ๅฏ็”จ๏ผ‰

ๅฆ‚ๆžœไฝ ๆ˜ฏๆƒณๅšไธ€ไธชๅŸบไบŽ antd ็š„ๅคๆ‚ไธญๅŽๅฐ้กน็›ฎ๏ผˆ้›†ๆˆๆƒ้™ใ€ๅพฎๅ‰็ซฏ๏ผ‰๏ผŒๆŽจ่ umi max๏ผŒๅฆๅˆ™ umiใ€‚

ๅŒบๅˆซ

ไธ€ใ€ไพ่ต–

max ๆœฌ่บซไพ่ต–

"antd": "^4.20.6",
"eslint": "8.35.0",
"stylelint": "14.8.2",
"@umijs/lint": "4.4.9",
"@umijs/plugins": "4.4.9",
"umi": "4.4.9"

-_-|| antd ้‡ๅคไพ่ต–ไบ†๏ผŒ่„šๆ‰‹ๆžถ็”Ÿๆˆ็š„้กน็›ฎไพ่ต–็š„ๆ˜ฏ antd v5๏ผŒไฝ†ๆญคๅค„ๅดๆ˜ฏ v4ใ€‚

ๅฏ่ง max ๅบ•ๅฑ‚ไพ่ต– umi๏ผŒไฝ†้ข„็ฝฎไบ†ๅ„็งๆ’ไปถ๏ผš

export default () => {
  return {
    plugins: [
      require.resolve('@umijs/plugins/dist/access'),
      require.resolve('@umijs/plugins/dist/analytics'),
      require.resolve('@umijs/plugins/dist/antd'),
      require.resolve('@umijs/plugins/dist/dva'),
      require.resolve('@umijs/plugins/dist/initial-state'),
      require.resolve('@umijs/plugins/dist/layout'),
      require.resolve('@umijs/plugins/dist/locale'),
      require.resolve('@umijs/plugins/dist/mf'),
      require.resolve('@umijs/plugins/dist/model'),
      require.resolve('@umijs/plugins/dist/moment2dayjs'),
      require.resolve('@umijs/plugins/dist/qiankun'),
      require.resolve('@umijs/plugins/dist/react-query'),
      require.resolve('@umijs/plugins/dist/request'),
      require.resolve('@umijs/plugins/dist/styled-components'), 
      require.resolve('@umijs/plugins/dist/tailwindcss'),
      require.resolve('@umijs/plugins/dist/valtio'),
      require.resolve('./plugins/maxAlias'),
      require.resolve('./plugins/maxAppData'),
      require.resolve('./plugins/maxChecker'),
    ],
  };
};

ไธŠ่ฟฐๅ‡ ไนŽ้ƒฝๅœจๆ–‡ๆกฃๆœ‰ไฝ“็Žฐๆฏ”ๅฆ‚ access ๆƒ้™ๆ’ไปถ๏ผŒๆ–‡ๆกฃ๏ผšumijs.org/docs/max/acโ€ฆ ใ€‚ๆŒ‘ๅ‡ ไธช้‡็‚นๆˆ–ไธ่ฎค่ฏ†็š„็œ‹็œ‹ใ€‚

  • dva ๅŸบไบŽ redux effect yield put ็ญ‰ๆฆ‚ๅฟตๅคชๅคš๏ผŒโ€œไธŠไธ–็บชโ€็š„ไบง็‰ฉ๏ผŒไธๆŽจ่๏ผŒๆŽจ่ valtio ๆˆ–่€… zustand๏ผˆ้ž umi ้กน็›ฎ๏ผ‰ ใ€‚
  • mf ModuleFederationใ€‚
  • model ๆ•ฐๆฎๆต umijs.org/docs/max/daโ€ฆ ๆŽจ่ valtioใ€‚
  • valtio ่š‚่šๅ†…้ƒจ bigfish ไฝฟ็”จ็š„็Šถๆ€็ฎก็†๏ผŒๅŸบไบŽ proxy umijs.org/docs/max/vaโ€ฆ
  • maxAlias ๅˆซๅ @umijs/max => @@/exportsใ€‚
  • maxAppData ๅฐ† name ๆ”นๆˆ Umi Maxใ€‚ๅผ€ๅ‘่€…ๆ— ้œ€ๅ…ณๅฟƒใ€‚
  • maxChecker ๆฃ€ๆŸฅ max ้กน็›ฎ package.json ๆ˜ฏๅฆๆœ‰ไพ่ต– umi ๆœ‰ๅˆ™ๆŠฅ้”™ๆ็คบใ€‚
// maxAlias
import { IApi } from 'umi';

export default (api: IApi) => {
  api.modifyConfig((memo) => {
    memo.alias = {
      ...memo.alias,
      '@umijs/max': '@@/exports',
    };
    return memo;
  });
};

่„šๆ‰‹ๆžถ็”Ÿๆˆ็š„้กน็›ฎไพ่ต–

umi ๆ”นๆˆ @umi/max๏ผŒๆ–ฐๅขžไบ† antd ๅ…จๅฎถๆกถ

"@umijs/max": "^4.4.9",

"@ant-design/icons": "^5.0.1",
"@ant-design/pro-components": "^2.4.4",
"antd": "^5.4.0"

image.png

ไบŒใ€็›ฎๅฝ•็ป“ๆž„

Windows ่‡ชๅธฆ tree ้žๅธธ้šพ็”จ๏ผŒๆ‰พๅˆฐไธ€ไธช้ซ˜่ดจ้‡็š„ tree ๆ›ฟไปฃๅ“

pnpm i -g tree-node-cli

โฏ tree my-app -I 'node_modules'
my-app
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ pnpm-lock.yaml
โ”œโ”€โ”€ src
โ”‚   โ”œโ”€โ”€ assets
โ”‚   โ”‚   โ””โ”€โ”€ yay.jpg
โ”‚   โ”œโ”€โ”€ layouts
โ”‚   โ”‚   โ”œโ”€โ”€ index.less
โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
โ”‚   โ””โ”€โ”€ pages
โ”‚       โ”œโ”€โ”€ docs.tsx
โ”‚       โ””โ”€โ”€ index.tsx
โ”œโ”€โ”€ tsconfig.json
โ””โ”€โ”€ typings.d.ts
โฏ tree my-app-max -I 'node_modules'
my-app-max
โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ mock
โ”‚   โ””โ”€โ”€ userAPI.ts
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ pnpm-lock.yaml
โ”œโ”€โ”€ src
โ”‚   โ”œโ”€โ”€ access.ts
โ”‚   โ”œโ”€โ”€ app.ts
โ”‚   โ”œโ”€โ”€ assets
โ”‚   โ”œโ”€โ”€ components
โ”‚   โ”‚   โ””โ”€โ”€ Guide
โ”‚   โ”‚       โ”œโ”€โ”€ Guide.less
โ”‚   โ”‚       โ”œโ”€โ”€ Guide.tsx
โ”‚   โ”‚       โ””โ”€โ”€ index.ts
โ”‚   โ”œโ”€โ”€ constants
โ”‚   โ”‚   โ””โ”€โ”€ index.ts
โ”‚   โ”œโ”€โ”€ models
โ”‚   โ”‚   โ””โ”€โ”€ global.ts
โ”‚   โ”œโ”€โ”€ pages
โ”‚   โ”‚   โ”œโ”€โ”€ Access
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ Home
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ index.less
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.tsx
โ”‚   โ”‚   โ””โ”€โ”€ Table
โ”‚   โ”‚       โ”œโ”€โ”€ components
โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ CreateForm.tsx
โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ UpdateForm.tsx
โ”‚   โ”‚       โ””โ”€โ”€ index.tsx
โ”‚   โ”œโ”€โ”€ services
โ”‚   โ”‚   โ””โ”€โ”€ demo
โ”‚   โ”‚       โ”œโ”€โ”€ UserController.ts
โ”‚   โ”‚       โ”œโ”€โ”€ index.ts
โ”‚   โ”‚       โ””โ”€โ”€ typings.d.ts
โ”‚   โ””โ”€โ”€ utils
โ”‚       โ””โ”€โ”€ format.ts
โ”œโ”€โ”€ tsconfig.json
โ””โ”€โ”€ typings.d.ts

ๅฏนๆฏ”

image.png ๅˆ ้™คไบ† layout ็›ฎๅฝ•๏ผˆไผฐ่ฎกๆ˜ฏๅ†…็ฝฎไบ† antd pro ็š„ layout๏ผ‰ใ€ๆ–ฐๅขžไบ† components constants models services utils ๆฏ”่พƒๆ„Ÿๅ…ด่ถฃ็š„ๆ˜ฏ models services

// my-app-max/src/models/global.ts

// ๅ…จๅฑ€ๅ…ฑไบซๆ•ฐๆฎ็คบไพ‹
import { DEFAULT_NAME } from '@/constants';
import { useState } from 'react';

const useUser = () => {
  const [name, setName] = useState<string>(DEFAULT_NAME);
  return {
    name,
    setName,
  };
};

export default useUser;

่‡ชๅŠจ็”Ÿๆˆ

โฏ cat my-app-max/src/services/demo/UserController.ts
/* eslint-disable */
// ่ฏฅๆ–‡ไปถ็”ฑ OneAPI ่‡ชๅŠจ็”Ÿๆˆ๏ผŒ่ฏทๅ‹ฟๆ‰‹ๅŠจไฟฎๆ”น๏ผ
import { request } from '@umijs/max';

/** ๆญคๅค„ๅŽ็ซฏๆฒกๆœ‰ๆไพ›ๆณจ้‡Š GET /api/v1/queryUserList */
export async function queryUserList(
  params: {
    // query
    /** keyword */
    keyword?: string;
    /** current */
    current?: number;
    /** pageSize */
    pageSize?: number;
  },
  options?: { [key: string]: any },
) {
  return request<API.Result_PageInfo_UserInfo__>('/api/v1/queryUserList', {
    method: 'GET',
    params: {
      ...params,
    },
    ...(options || {}),
  });
}

...

ไธ‰ใ€่„šๆ‰‹ๆžถ็”Ÿๆˆ้กน็›ฎๅฏนๆฏ”

umi

้€‰ๆ‹ฉ Simple Appใ€‚

โฏ pnpx create-umi@latest
Packages: +39
+++++++++++++++++++++++++++++++++++++++
Progress: resolved 40, reused 10, downloaded 29, added 39, done
โ”Œ   create-umi
โ”‚
โ—‹  What's the target folder name?
โ”‚  my-app
โ”‚
โ—‹  Pick Umi App Template
โ”‚  Simple App
โ”‚
โ—‹  Pick Npm Client
โ”‚  pnpm
โ”‚
โ—‹  Pick Npm Registry
โ”‚  taobao
โ”‚
โ””  You're all set!

โ€‰WARNโ€‰ deprecated eslint@8.57.1: This version is no longer supported. Please see https://eslint.org/version-support for other opti
ons.loading @umijs/mako-win32-x64-msvc@0.11.10: 15.68 MB/16.66 MB
Downloading @umijs/mako-win32-x64-msvc@0.11.10: 16.66 MB/16.66 MB, done
โ€‰WARNโ€‰ 12 deprecated subdependencies found: @esbuild-kit/cjs-loader@2.4.4, @esbuild-kit/core-utils@3.3.2, @esbuild-kit/esm-loader@
2.6.5, @floating-ui/react-dom-interactions@0.3.1, @humanwhocodes/config-array@0.13.0, @humanwhocodes/object-schema@2.0.3, @styleli
nt/postcss-css-in-js@0.38.0, glob@7.2.3, inflight@1.0.6, node-domexception@1.0.0, rimraf@3.0.2, stable@0.1.8
Packages: +1034
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Progress: resolved 1115, reused 106, downloaded 927, added 1034, done

> @ postinstall F:\temp\my-app
> umi setup

info  - [ไฝ ็Ÿฅ้“ๅ—๏ผŸ] umi g tsconfig ๅฏไธ€้”ฎๅฎŒๆˆ้กน็›ฎ็š„ TypeScript ้…็ฝฎใ€‚
info  - generate files
info  - Preparing...

dependencies:
+ umi 4.4.9

devDependencies:
+ @types/react 18.3.20 (19.1.2 is available)
+ @types/react-dom 18.3.6 (19.1.2 is available)
+ typescript 5.8.3

โ•ญ Warning โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚                                                                                            โ”‚
โ”‚   Ignored build scripts: core-js, core-js-pure, esbuild.                                   โ”‚
โ”‚   Run "pnpm approve-builds" to pick which dependencies should be allowed to run scripts.   โ”‚
โ”‚                                                                                            โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

Done in 1m 29.4s
\
 F:\temp via Node.js v22.7.0 took 2m5s

umi max

้€‰ๆ‹ฉ Ant Design Proใ€‚

โฏ pnpx create-umi@latest
โ”Œ   create-umi
โ”‚
โ—‹  What's the target folder name?
โ”‚  my-app-max
โ”‚
โ—‹  Pick Umi App Template
โ”‚  Ant Design Pro
โ”‚
โ—‹  Pick Npm Client
โ”‚  pnpm
โ”‚
โ—‹  Pick Npm Registry
โ”‚  taobao
โ”‚
โ””  You're all set!

Downloading antd@5.24.8: 10.19 MB/10.19 MB, done
Downloading antd@4.24.16: 8.75 MB/8.75 MB, done
Downloading @formatjs/intl-displaynames@1.2.10: 5.85 MB/5.85 MB, done
โ€‰WARNโ€‰ 19 deprecated subdependencies found: @esbuild-kit/cjs-loader@2.4.4, @esbuild-kit/core-utils@3.3.2, @esbuild-kit/esm-loader@
2.6.5, @floating-ui/react-dom-interactions@0.3.1, @formatjs/intl-unified-numberformat@3.3.7, @formatjs/intl-utils@2.3.0, @humanwho
codes/config-array@0.11.14, @humanwhocodes/object-schema@2.0.3, @stylelint/postcss-css-in-js@0.38.0, @types/history@5.0.0, eslint@
8.35.0, flatten@1.0.3, glob@7.2.3, inflight@1.0.6, intl-messageformat-parser@3.6.4, node-domexception@1.0.0, react-router-redux@5.
0.0-alpha.9, rimraf@3.0.2, stable@0.1.8
Packages: +1329
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Downloading @formatjs/intl-unified-numberformat@3.3.7: 8.47 MB/8.47 MB, done
Progress: resolved 1399, reused 1027, downloaded 290, added 1329, done

> @ postinstall F:\temp\my-app-max
> max setup

info  - [ไฝ ็Ÿฅ้“ๅ—๏ผŸ] ไฝ ็Ÿฅ้“ๅฏไปฅ้€š่ฟ‡ UMI_ENV ๅฎšไน‰ๅคšไธช็Žฏๅขƒ็š„้…็ฝฎๅ—๏ผŒ่ฏฆ่ง https://umijs.org/docs/guides/env-variables#umi_env
info  - generate files
info  - Preparing...

> @ prepare F:\temp\my-app-max
> husky

โ€‰WARNโ€‰ Issues with peer dependencies found
.
โ”œโ”€โ”ฌ dva 2.5.0-beta.2
โ”‚ โ”œโ”€โ”€ โœ• unmet peer react@"15.x || ^16.0.0-0": found 18.3.1
โ”‚ โ”œโ”€โ”€ โœ• unmet peer react-dom@"15.x || ^16.0.0-0": found 18.3.1
โ”‚ โ””โ”€โ”ฌ react-redux 5.1.2
โ”‚   โ””โ”€โ”€ โœ• unmet peer react@"^0.14.0 || ^15.0.0-0 || ^16.0.0-0": found 18.3.1
โ””โ”€โ”ฌ @umijs/max 4.4.9
  โ””โ”€โ”ฌ @umijs/plugins 4.4.9
    โ”œโ”€โ”ฌ @ahooksjs/use-request 2.8.15
    โ”‚ โ””โ”€โ”€ โœ• unmet peer react@"^16.8.0 || ^17.0.0": found 18.3.1
    โ”œโ”€โ”ฌ react-intl 3.12.1
    โ”‚ โ””โ”€โ”€ โœ• unmet peer react@^16.3.0: found 18.3.1
    โ””โ”€โ”ฌ dva-loading 3.0.25
      โ””โ”€โ”€ โœ• unmet peer dva-core@"^1.1.0 || ^1.5.0-0 || ^1.6.0-0": found 2.0.4

dependencies:
+ @ant-design/icons 5.6.1 (6.0.0 is available)
+ @ant-design/pro-components 2.8.7
+ @umijs/max 4.4.9
+ antd 5.24.8

devDependencies:
+ @types/react 18.3.20 (19.1.2 is available)
+ @types/react-dom 18.3.6 (19.1.2 is available)
+ husky 9.1.7
+ lint-staged 13.3.0 (15.5.1 is available)
+ prettier 2.8.8 (3.5.3 is available)
+ prettier-plugin-organize-imports 3.2.4 (4.1.0 is available)
+ prettier-plugin-packagejson 2.5.10
+ typescript 5.8.3

โ•ญ Warning โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚                                                                                            โ”‚
โ”‚   Ignored build scripts: core-js, core-js-pure, es5-ext, esbuild.                          โ”‚
โ”‚   Run "pnpm approve-builds" to pick which dependencies should be allowed to run scripts.   โ”‚
โ”‚                                                                                            โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

Done in 2m 49.9s
\
 F:\temp via Node.js v22.7.0 took 3m22s