UmiJS
介绍
官方文档
可扩展
Umi 实现了完整的生命周期,并使其插件化,Umi 内部功能也全由插件完成。此外还支持插件和插件集,以满足功能和垂直域的分层需求。
开箱即用
Umi 内置了路由、构建、部署、测试等,仅需一个依赖即可上手开发。并且还提供针对 React 的集成插件集,内涵丰富的功能,可满足日常 80% 的开发需求。
企业级
经蚂蚁内部 3000+ 项目以及阿里、优酷、网易、飞猪、口碑等公司项目的验证,值得信赖。
大量自研
包含微前端、组件打包、文档工具、请求库、hooks 库、数据流等,满足日常项目的周边需求。
完备路由
同时支持配置式路由和约定式路由,同时保持功能的完备性,比如动态路由、嵌套路由、权限路由等等。
面向未来
在满足需求的同时,我们也不会停止对新技术的探索。比如 modern mode、webpack@5、自动化 external、bundler less 等等。
快速上手
安装
创建空目录
kdir myapp && cd myapp
使用官方提供脚手架
yarn create @umijs/umi-app
安装依赖
yarn start
部署发布—–打包好的文件生成在dist文件下
yarn build
项目目录
1 2 3 4 5 6 7 8 9
| - .editorconfig - .gitignore - .prettierignore - .prettierrc - .umirc.ts - package.json - README.md - tsconfig.json - typings.d.ts
|
配置
Umi 在 .umirc.ts
或 config/config.ts
中配置项目和插件,支持 es6。一份常见的配置如下官方配置文档
1 2 3 4 5 6 7 8
| export default { base: '/docs/', publicPath: '/static/', hash: true, history: { type: 'hash', }, }
|
路由配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| routes: [ { path: '/', component:'@/pages/index', title:'首页' }, { path:'/list', redirect:'user/one' }, { path:'/user', component:'@/layouts/index', routes:[ {path:'/user/one',component:'@/pages/index'}, {path:'/user/two',component:'@/pages/user'} ] } ],
|
1 2 3 4 5 6 7 8
| return ( <div> <h1>Header</h1> {props.children} <h1>Footer</h1> </div> )
|
拦截
路由跳转可以进行拦截操作,当要跳转的时候拦截跳转至另一个组件
1 2 3 4 5 6 7 8 9 10 11
| { path:'/user', component:'@/layouts/index', wrappers:[ '@/wrappers/auth' ], routes:[ {path:'/user/one',component:'@/pages/index'}, {path:'/user/two',component:'@/pages/user'} ] }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
import React from 'react'; import { Redirect } from 'umi';
const auth = (props:any) => { const isLoadin = false; if (isLoadin) { return <div>{props.children}</div> }else{ return <Redirect to="/"/> } }
export default auth
|
未知路径
当路径查找不到,可以设置默认路径
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| routes: [ { path: '/', component:'@/pages/index', title:'首页' },
{ path:'/list', redirect:'user/one' },
{ path:'/user', component:'@/layouts/index', wrappers:[ '@/wrappers/auth' ], routes:[ {path:'/user/one',component:'@/pages/index'}, {path:'/user/two',component:'@/pages/user'}, {component:'@/pages/404'} ] }, {component:'@/pages/404'} ],
|
传递参数
1
| { path:'/user/one/:id?',component:'@/pages/index' },
|
以上都是配置式路由,而如果没有routes配置,则自动进入约定式路由,跟Next的page路由规则类似。src下的文件目录就是路由表,
Mock数据
新建文件mock/index.ts
1 2 3 4 5 6 7 8 9 10 11 12 13
| export default { 'GET /api/index':{ id:1, name:'Tom', age:12 }, 'GET /api/person':{ id:2, name:'LiLi', age:22 }, }
|
获取数据
1 2 3 4 5 6 7 8 9 10 11
| const getData = async()=>{ const data = await request('/api/person'); console.log(data); }
|
Mockjs使用
官方文档:Mockjs文档
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import mockjs from 'mockjs';
export default { 'GET /api/index':{ id:1, name:'Tom', age:12 }, 'GET /api/person':{ id:2, name:'LiLi', age:22 }, 'GET /api/tags':mockjs.mock({ 'list|100': [{ name: '@city', 'value|1-100': 50, 'type|0-2': 1 }], }) }
|
关闭Mock
- 打开文件
\Umijs\.umirc.ts
,修改配置文件:
1 2 3 4 5 6 7 8 9 10
| import { defineConfig } from 'umi';
export default defineConfig({ ... mock:false, ... });
|
- 使用环境变量方式关闭
1 2 3 4 5
| "scripts": { ... "start:nomock":"MOCK=none umi dev", ... },
|
配合DvaJS
官网
新建\pages\dva.tsx
组件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
import React from 'react';
import { connect } from 'umi'; import { Button } from 'antd';
const dva = (props) => { console.log(props); const {dispatch} = props; const getData = ()=>{ dispatch({ type:'tags/fetchTags', payload:null }) } return ( <div> <h1>Dva组件</h1> <Button onClick={getData}>获取列表数据</Button> </div> ) }
export default connect(( {tags} )=>({tags}))(dva);
|
新建\src\models\tags.ts
文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| import { request } from "umi"
const getTags = ()=>{ return request('/api/tags') }
export default { namespace: 'tags', state: { tagsList:[] }, effects: { *fetchTags({payload,callback},{put,call}){ const response = yield call(getTags)
yield put({ type:'setTagList', payload:response }) } }, reducers: { setTagList(state,action){ return {...state,tagsList:action.payload} } }, }
|
运行时配置
runtime-config 和 config 之间的区别在于执行时间,runtime-config 是在您的应用程序在浏览器中运行时评估的。因此,function
可以使用jsx
、import
和其他浏览器可运行的片段。
新建文件src/app.tsx
代码示例(不代表所有功能):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| import {history} from 'umi';
let extraRoutes;
export function patchRoutes({ routes, routeComponents }) { console.log('patchRoutes', routes, routeComponents); routes.unshift({ path:'/foo', component:require('@/pages/user1').default })
extraRoutes.map(item=>{ routes.unshift({ path:item.path, component:require(`@/pages${item.component}`).default }) }) }
export function render(oldRender) {
extraRoutes = [ { path:'/server', component:'/user2' } ]
const isLoading = true; if(!isLoading){ history.push('/login') } oldRender(); }
export function onRouteChange({ location, clientRoutes, routes, action }) { console.log(location,'01'); console.log(clientRoutes,'02'); console.log(routes,'03'); console.log(action,'04'); }
|
使用Umi UI
安装:
1
| yarn add @umijs/preset-ui -D
|
启动: