Umi框架

Umi是蚂蚁金服的前端框架,支持配置式和约定式路由,具备完善的插件体系。其特点是高度可扩展,内置多种功能,如路由、构建、部署和测试。快速上手包括全局安装、创建项目、启动和打包。API涉及动态加载组件、路由、历史管理和Prompt提示等,提供便捷的开发体验。但需要注意,Umi不支持较低版本的浏览器和React。

Umi框架

一、简介

Umi 是蚂蚁金服的底层前端框架,是可扩展的企业级前端应用框架。Umi 以路由为基础的,同时支持配置式路由和约定式路由,保证路由的功能完备,并以此进行功能扩展。然后配以生命周期完善的插件体系,覆盖从源码到构建产物的每个生命周期,支持各种功能扩展和业务需求。

二、特点

  • 可扩展: Umi 实现了完整的生命周期,并使其插件化,Umi 内部功能也全由插件完成。此外还支持插件和插件集,以满足功能和垂直域的分层需求。
  • 开箱即用: Umi 内置了路由、构建、部署、测试等,仅需一个依赖即可上手开发。并且还提供针对 React 的集成插件集,内涵丰富的功能;
  • **完备路由:**同时支持配置式路由和约定式路由,同时保持功能的完备性,比如动态路由、嵌套路由、权限路由等等。
  • 兼容性低: 不支持 IE 8 及以下浏览器,不支持 React 16.8.0 以下的 React,不支持Node 10 以下的环境;

三、快速上手

1.全局安装umi

// 先查看是否安装了node,确保node版本是8.10及以上。
node -v 
// 使用yarn全局安装umi
yarn global add umi

2.创建项目

// 创建项目
mkdir umiAppDemo
// 进入项目文件夹
cd umiAppDemo
// 创建页面
umi g page index
// 启动项目
umi dev

3.打包部署

// build打包,会创建一个dist文件
umi build

四、基本API

1. dynamic—动态加载组件

使用场景:组件体积太大,不适合直接计入 bundle 中,以免影响首屏加载速度。例如:某组件 HugeA 包含巨大的实现 / 依赖了巨大的三方库,且该组件 HugeA 的使用不在首屏显示范围内,可被单独拆出。这时候我们可以更专注于自己的业务组件开发,而不必关心 code spliting、async module loading 等等技术细节。

import { dynamic } from 'umi';

export default dynamic({
  loader: async function () {
    // 这里的注释 webpackChunkName 可以指导 webpack 将该组件 HugeA 以这个名字单独拆出去
    const { default: HugeA } = await import(
      /* webpackChunkName: "external_A" */ './HugeA'
    );
    return HugeA;
  },
});

// 使用
import React from 'react';
import AsyncHugeA from './AsyncHugeA';

// 像使用普通组件一样即可
// dynamic 为你做:
// 1. 异步加载该模块的 bundle
// 2. 加载期间 显示 loading(可定制)
// 3. 异步组件加载完毕后,显示异步组件
export default () => {
  return <AsyncHugeA />;
};

2. 路由组件

这里路由与react路由基本一样分为链接组件和特定样式组件

2.1 链接组件路由
<div>
      {/* 点击跳转到指定 /home 路由 */}
      <Link to="/home">home</Link>

      {/* 点击跳转到指定 /home 路由,携带参数*/}
      <Link to="/home?sort=name">home</Link>

      {/* 点击跳转到指定 /home 路由,
          附带 query: { sort: 'name' }
          附带 hash: 'the-hash'
          附带 state: { fromDashboard: true }
      */}
      <Link
        to={{
          pathname: '/home',
          search: '?sort=name',
          hash: '#the-hash',
          state: { fromDashboard: true },
        }}
      >
        home
      </Link>

      {/* 点击跳转到指定 /profile 路由,附带所有当前 location 上的参数*/}
      <Link to={(location) => { ...location, pathname: '/profile' }} />

      {/* 点击跳转到指定 /home 路由,但会替换当前 history stack 中的记录 */}
      <Link to="/home" replace />

      {/*  innerRef 允许你获取基础组件(这里应该就是 a 标签或者 null) */}
      <Link
        to="/courses"
        innerRef={(node) => {
          <a>home</a>
        }}
      />
    </div>
2.2 特定样式组件

特殊版本的 <Link /> 。当指定路由(to=指定路由)命中时,可以附着特定样式。

<div>
   {/* 和 Link 等价 */}
   <NavLink to="/home">home</NavLink>

   {/* 当前路由为 /home 时,附着 class selected */}
   <NavLink to="/home" activeClassName="selected">
     home
	 </NavLink>

      {/* 当前路由为 /home 时,附着 style */}
      <NavLink
        to="/home"
        activeStyle={{
          fontWeight: 'bold',
          color: 'red',
        }}
      >home</NavLink>

      {/* 当前路由完全匹配为 /home 时,exact代表强校验路由包含斜杠 */}
      <NavLink exact to="/home" activeClassName="selected">
        home
      </NavLink>

      {/* 当前路由为 /home/ 时,strict代表包强校验如果没有斜杠校验不通过*/}
      <NavLink strict to="/home/" activeClassName="selected">
        home
      </NavLink>

      {/* 当前路由为 /home,并且 query 包含 name 时,附着 class */}
      <NavLink
        to="/home"
        exact
        activeClassName="selected"
        isActive={(match, location) => {
          if (!match) {
            return false;
          }
          return location.search.includes('name');
        }}
      >
        Profile
      </NavLink>
    </div>

3. history—路由对象

引入umi中的history对象,使用内部配置的方法,可以获取路由信息、路由跳转等操作;

3.1 可用于获取当前路由信息
import { history } from 'umi';
// history 栈里的实体个数
console.log(history.length);

// 当前 history 跳转的 action,有 PUSH、REPLACE 和 POP 三种类型
const {action} = history;

// location 对象,包含 pathname、search 和 hash
const {pathname,search,hash} = history.location;
3.2 可用于路由跳转
import { history } from 'umi';
// 跳转到指定路由
history.push('/home');
// 带参数跳转到指定路由
history.push('/list?a=b');
history.push({
  pathname: '/list',
  query: {
    a: 'b',
  },
});
// 跳转到上一个路由
history.goBack();
3.3 用于路由监听
import { history } from 'umi';

const unlisten = history.listen((location, action) => {
  console.log(location.pathname);
});
unlisten();

4. Prompt—离开页面时的提示选择

import { Prompt } from 'umi';
export default () => {
  return (
    <div>
      {/* 用户离开页面时提示一个选择 */}
      <Prompt message="你确定要离开么?" />
      {/* 用户要跳转到首页时,提示一个选择 */}
      <Prompt
        message={(location) => {
          return location.pathname !== '/' ? true : `您确定要跳转到首页么?`;
        }}
      />

      {/* 根据一个状态来确定用户离开页面时是否给一个提示选择 */}
      <Prompt when={formIsHalfFilledOut} message="您确定半途而废么?" />
    </div>
  );
};

5.withRouter—高阶组件

可以通过 withRouter 获取到 historylocationmatch 对象

import { withRouter } from 'umi';
export default withRouter(({ history, location, match }) => {
  return (
    <div>{history.action}-{location.pathname}-{`${match.isExact}`}
    </div>
  );
});

6. 内置hooks

6.1 useHistory:获取 history 对象
import { useHistory } from 'umi';
const history = useHistory();
6.2 useLocation:获取 location 对象
import { useLocation } from 'umi';
const location = useLocation();
6.3 useParams:获取 params 对象。 params 对象为动态路由(例如:/users/:id)里的参数键值对
import { useParams } from 'umi';
const params = useParams();

五、总结

  • umi框架扩展性非常强,支持各种功能扩展和业务需求,不在局限于选择vue框架或是react框架;

  • 大量自研,包含微前端、组件打包、文档工具、请求库、hooks 库、数据流等,满足日常项目的周边需求;

  • 创建项目快,不用像创建react项目一样需要配置typescript/less/css modules;

  • uni框架很多配置都是约定规则,照约定好的方式开发,就能达到某种效果,中间的过程由框架帮我们完成。这使得灵活性降低,但是规范性增强了;详细配置

<think>我们正在回答用户关于UMI框架的学习指南、使用教程和入门文档的问题。根据提供的引用内容,我们可以整合信息并给出一个清晰的指南。引用[1]和引用[2]都介绍了Umi框架的基本情况,它是一个基于React的企业级前端应用框架,提供了丰富的功能和插件,支持快速构建高性能的前端应用。引用[3]则提到了使用umi搭建框架的几种脚手架选项。我们将按照以下步骤组织回答:1.介绍Umi框架及其特点2.快速入门:如何创建一个Umi项目并运行3.核心概念和功能:路由、数据流、插件等4.进阶学习:生态项目、最佳实践5.学习资源推荐同时,我们会在末尾生成相关问题。注意:所有独立公式(如果有的话)需要使用$$...$$,行内数学表达式使用$...$,但本问题涉及前端框架,可能较少使用数学公式。但为了遵循指令,如果出现变量等,我们会使用正确格式。开始回答:</think>### UMI框架学习指南与使用教程 UMI是一个基于React的企业级前端应用框架,提供开箱即用的开发工具和最佳实践,特别适合构建单页面应用(SPA)、多页面应用(MPA)和中后台系统。以下是系统化的学习路径: #### 一、基础入门 1. **环境准备** - 安装Node.js(建议v16+) - 安装包管理工具:`npm install -g yarn` 2. **项目初始化** ```bash # 创建项目目录 mkdir my-umi-app && cd my-umi-app # 使用脚手架初始化(引用[1]) npx umi init # 安装依赖 yarn install # 启动开发服务器 yarn dev ``` 访问`http://localhost:8000`查看效果 3. **核心概念** - **目录结构**(典型示例): ``` ├── config/ # 配置文件 ├── src/ # 源码目录 │ ├── pages/ # 路由组件(约定式路由) │ └── app.tsx # 运行时配置 └── package.json ``` - **约定式路由**:在`src/pages`下创建`index.tsx`即自动映射为首页路由[^2] #### 二、核心功能实践 1. **路由管理** - 动态路由:创建`src/pages/users/$id.tsx`实现`/users/123`路由 - 嵌套路由:通过`_layout.tsx`文件定义布局[^2] 2. **数据流管理** 集成Dva状态管理(引用[1]): ```jsx // models/user.js export default { state: { list: [] }, reducers: { updateList(state, { payload }) { return { ...state, list: payload }; } } } ``` 3. **插件系统**(引用[3]) 在`.umirc.ts`中配置: ```typescript export default { plugins: ['@umijs/plugins/dist/dva'], // 启用Dva插件 dva: { immer: true } // 插件配置 }; ``` #### 三、进阶开发 1. **性能优化** - 动态导入:`() => import('./Component')`实现代码分割 - 静态资源CDN:通过`chainWebpack`配置外部资源 2. **微前端集成** 使用`@umijs/plugin-qiankun`: ```typescript export default { qiankun: { master: { apps: [{ name: 'app1', entry: '//localhost:7001' }] } } }; ``` #### 四、学习资源推荐 1. **官方文档** - 中文文档:[Umi官方文档](https://umijs.org/) - 项目地址:[GitCode镜像](https://gitcode.com/gh_mirrors/um/umi)(引用[1]) 2. **生态工具** - **Umi UI**:可视化页面生成工具 - **Umi Request**:统一请求库(引用[1]) - **Ant Design Pro**:企业级模板(引用[3]) 3. **实战教程** - [Umi框架使用详细教程demo](https://example.com/umi-tutorial)(引用[2]) - 脚手架类型选择:`app`(基础项目)/`ant-design-pro`(中后台模板)/`library`(组件库)(引用[3]) > 提示:调试时可使用`yarn umi debug`查看详细配置解析过程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒羊羊我小弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值