Umi3实战教程

news2025/7/13 23:53:56

一、框架介绍

umi是蚂蚁金服的前端开发框架,它内置了路由、web/移动端UI库、数据流、权限控制、常用hooks库、构建、部署、测试、等等一些工具,几乎涵盖了正常前端开发要用到的所有工具。

image-20231017133153379

二、环境准备

  1. pnpm

    相比npm、yarn,pnpm更小+更快+扁平化+默认支持monorepo,有诸多有点。想要了解更多详细,可以参考这篇文章:pnpm实战教程

  2. 镜像管理工具

    推荐使用镜像管理工具:

    • 如果本地使用 npm/pnpm 管理nodejs包:则安装nrm

    • 如果本地使用 yarn 管理nodejs包:则安装yrm

//这里使用yrm
npm i nrm -g
npm i yrm -g

查看镜像地址列表:yrm lsimage-20231017134846253

测试每个镜像地址的响应时间:yrm test,最快的镜像会被标绿色背景。

image-20231017134903738

切换镜像地址:yrm use taobao,切换到淘宝地址。

image-20231017134931858

查看当前使用镜像地址:

yrm ls
yrm current

image-20231017135028593

  1. 创建umi项目

    mkdir umi-test && cd umi-test
    yarn create @umijs/umi-app #npx @umijs/create-umi-app
    yarn install	#安装依赖
    yarn start		#启动项目
    

    在浏览器里打开 http://localhost:8000/,能看到以下界面,

img

三、目录结构

一个基础的 Umi 项目大致是这样的:

.
├── package.json
├── .umirc.ts				// umi配置,同config/config.js,二选一
├── .env					// 环境变量
├── dist					// 默认 build 输出目录
├── mock					// mock 文件所在目录,基于express
├── public					// 此目录下所有文件会被 copy 到输出路径。
└── src
    ├── .umi				// 临时文件目录,比如入口文件、路由等,都会被临时生成到这里。
    ├── layouts/index.tsx	// 全局布局
    ├── models				// 数据流
    ├── wrappers			// 权限管理
    ├── global.js			// 可以在这里加入polyfill
    ├── global.css			// 约定的全局样式文件,自动引入,也可以涌入global.less
    ├── pages				// 页面
        ├── index.less
        └── index.tsx
    └── app.ts				//运行时配置文件,可以在这里扩展运行时的能力

更多目录说明请参照 官网

四、构建时配置

umi在.umirc.tsconfig/config.ts中配置项目和插件:

image-20231017142537350

  1. nodeModulesTransform:设置 node_modules 目录下依赖文件的编译方式。

    nodeModulesTransform: {
        type: "none",	//不变异node_modules中的文件
        exclude:""		//忽略的依赖库,包名,暂不支持绝对路径
    },
    
    /*
    nodeModulesTransform: {
        type: "all",	//全部编译
        exclude:""		//不需要编译的依赖库;
    },
    */
    
  2. fastRefresh:快速刷新

    开发时可以保持组件状态,同时编辑提供即时反馈

    fastRefresh: {}	//开启
    

开启前:

image-20231017144242487

开启后:

image-20231017144544912

  1. devServer:配置开发服务器。

    包含以下子配置项:

    • port,端口号,默认 8000
    • host,默认 0.0.0.0
    • https,是否启用 https server,同时也会开启 HTTP/2
    • writeToDisk,生成 assets 到文件系统
devServer: {
    port: 9999
}

配置开发服务的端口还有其他方式:

  • 配置 .env 环境变量

    #根目录下创建 .env 文件
    PORT=8888
    
  • 脚本中设置端口

#全局安装cross-env
npm i -g cross-env

# package.json
"scripts": {
	"start": "cross-env PORT=3999 umi dev",
},

这三种配置的优先级依次是:脚本中设置端口 > 配置 .env 环境变量 > devServer中设置port

  1. title:设置标题

image-20231017150147103

  1. favicon:icon图标

    favicon: "/favicon.ico"
    

    根目录新建public/favicon.ico图标,刷新页面,就可以看到图标已经变了。

    image-20231017151143410

  2. dynamicImport:按需加载

    umi打包时,默认是把所有js文件打包到同一个umi.js文件中,如下图所示:

image-20231017153758879

这种打包方式当我们的项目不断扩展变庞大之后,umi.js将会变得非常臃肿,导致在首屏加载时很慢,所以我们可以使用dynamicImport开启按需加载,即是否把构建产物进行拆分,在需要的时候下载额外的 JS 再执行。

dynamicImport: {}

再执行yarn build打包后,我们可以看到dist目录中文件就已经被分包,如图:

image-20231017154117257

我们还可以借助dynamicImport.loading属性,配置加载过程中的loading提示组件。

    dynamicImport: {
        loading: "@/pages/Loading"
    }

创建src/pages/Loading/index.tsx,代码如下:

export default function IndexPage() {
    return (
        <div>
            loading...
        </div>
    );
}

然后我们再刷新页面时,可以看到loading...提示。仔细的话可以看到,loading... 出现了两次:

  • 根页面加载时
  • 框架容器内页面加载时

如图:

loading

  1. 根模版路径

    如果需要自定义html默认文件,那么就创建src\pages\document.ejs文件。

  2. mountElementId:指定 react app 渲染到的 HTML 元素 id。

    默认id是root,如果使用mountElementId指定的id和document.ejs中的不一致,那么会自动创建一个mountElementId指定的id的div节点。

    例如:

    # config/config.ts
    mountElementId: "root2"
    
    # document.ejs
    <body>
      <div id="app3"></div>
    </body>
    

    运行时,我们打开页面显示源码,可以看到:

    image-20231017161200060

五、使用Web/移动端antd组件

import styles from './index.less';
import Header from '@/pages/header';
import { useState } from 'react';
import { Button } from "antd";
import { Button as MButton } from "antd-mobile";

export default function IndexPage() {
  return (
    <div>
      <Header />
      <h1 className={styles.title}>Page index-333</h1>
      <Button>Web按钮</Button>
      <MButton>Mobile按钮</MButton>
    </div>
  );
}

效果如下:

image-20231017162017579

需要注意的是:

umi中默认内置了antd移动端的v2v5版本,那么在默认安装项目时安装了@umijs/preset-react": "1.x",这是一个比较老的版本,我们需要更新到最新,这样默认就是v5版本,如果需要使用v2则:import { Button as MButton } from "antd-mobile-v2";

我们在node_modules中可以看到默认安装了antd-mobileantd-mobile-v2

image-20231017163313670

yarn remove @umijs/preset-react #先删除
yarn add @umijs/preset-react	#再安装
import styles from './index.less';
import Header from '@/pages/header';
import { Button } from "antd";
import { Button as MButtonV5 } from "antd-mobile";//v5版本
import { Button as MButtonV2 } from "antd-mobile-v2";//v2版本

export default function IndexPage() {
  return (
    <div>
      <Header />
      <h1 className={styles.title}>Page index-333</h1>
      <Button type='primary'>Web按钮</Button>
      <MButtonV2 type='primary'>Mobile-v2按钮</MButtonV2>
      <MButtonV5 color='primary'>Mobile-v5按钮</MButtonV5>
    </div>
  );
}

image-20231017164458843

六、theme:主题

1、web端主题

theme:{
    '@primary-color': '#1DA57A',
}

上述代码只是修改了web的主题,并不影响移动端的主题配色,如上配置后,可以看到下图只是web端的Button的颜色有了改变。

image-20231017164828495

2、移动端主题

要修改移动端主题,我们可以通过src/global.less全局样式中覆写。这里以修改主题色为例:

:root:root {
    --adm-color-primary: red;
}

image-20231017170115217

可以看到移动端v5对应的主题色已经变更。

七、引入静态资源

1、引入图片

  • 引入src/assets图片
  • 引入public图片
//index.tsx
import user from "@/assets/images/user.png";
import "./index.less";
import styles from "./index.less";

export default function IndexPage() {
  return (
    <div>
      <p>1、调用 src/assets 中的图片</p>
      <img src={user} />
      <img src={require("@/assets/images/user.png")} />
      <br /><br />

      <p>2、调用 public 中的图片</p>
      <img src="img/bg.jpg" width="200" />

      <div className={styles.img1}>3、从 assets/images 中拿图片</div>
      <div className="img2">4、从 public 中拿图片</div>
    </div>
  );
}
//index.less
.img1,
.img2 {
  width: 200px;
  height: 80px;
  color: white;
  margin-top: 5px;
}

.img1 {
  background: url("~@/assets/images/bg.jpg");
}

.img2 {
  background: url("/img/bg.jpg");
}

image-20231017182418022

2、引入css样式

上述在引入css中class时,使用了两种方式:

  • 全局引入:

    import "./index.less";
    <div className="img2">4、从 public 中拿图片</div>
    
  • 模块化引入:

    import styles from "./index.less";
    <div className={styles.img1}>3、从 assets/images 中拿图片</div>
    

全局引入的话,可能会造成全局污染;模块化引入,会给每个class加上随机序列号,避免全局污染;

image-20231017183452849

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1103182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为大模型而生!顶流大佬发起成立学术会议 COLM,或成为未来 NLP 最强顶会?!

夕小瑶科技说 原创 作者 | 智商掉了一地、ZenMoore 前段时间&#xff0c;ACL 2024 的主席公开抨击称“ arXiv是科研的毒瘤”&#xff0c;这引发了大范围的争论。 一时间&#xff0c;大家对 *CL 的抵触情绪愈发高涨&#xff0c;绝大多数学界都在这场辩论中站在了支持 arXivTwit…

PreparedStatement

使用参数化查询&#xff1a;使用预编译的语句和参数化查询来执行SQL语句&#xff0c;而不是将用户输入直接嵌入到SQL语句中。这将帮助防止恶意输入注入SQL语句。

Zoho WorkDrive荣获专业研究机构评定的“Leader”称号

近年&#xff0c;在云计算、大数据、移动互联网、社交所引领的数字化转型变革中&#xff0c;企业对于数字资产的保护和利用愈加重视。相较于结构化数据&#xff0c;企业对于非结构化数据&#xff08;文档、图片、音视频等&#xff09;管理的需求更强、难度更大。 同时&#xf…

NodeJS 菜鸟教程目录

NodeJS 七天入门教程 谁适合阅读本教程? 前端开发者和希望构建后端的开发者:如果你是一名前端开发者,或者是一名希望构建后端的开发者,那么本教程将为你提供一个很好的学习Node.js的机会。通过学习本教程,你可以更好地了解后端开发的技术和Node.js在后端开发中的应用。初学…

日常学习记录随笔-redis实战

redis的持久化&#xff08;rdb,aof,混合持久化&#xff09; redis的主从架构以及redis的哨兵架构 redis的clusterredis 是要做持久化的&#xff0c;一般用redis会把数据放到缓存中为了提升系统的性能 如果redis没有持久化&#xff0c;重启的化数据就会丢失&#xff0c;所有的请…

【LeetCode热题100】--31.下一个排列

31.下一个排列 思路&#xff1a; 方法&#xff1a;两遍扫描 注意到下一个排列总是比当前排列要大&#xff0c;除非该排列已经是最大的排列。我们希望找到一种方法&#xff0c;能够找到一个大于当前序列的新序列&#xff0c;且变大的幅度尽可能小。具体地&#xff1a; 我们需要…

5年经验之谈 —— App测试、Web测试和接口测试一般测试流程!

app测试流程&#xff1a; 1、需求分析&#xff0c;了解具体需求 2、测试准备&#xff1a;原型图、效果图、需求文件、测试用例、用例评审、各种测试数据准备 3、测试环节&#xff1a;接受版本&#xff0c;开始执行 1&#xff09;冒烟测试&#xff1a;对版本质量的控制以及此…

【LeetCode: 260. 只出现一次的数字 III | 位运算 | 哈希表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

ModStartCMS v7.4.0 公共图片库支持,安全功能升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议&#xff0c;免费且不限制商业使用。 功能特性 丰富的模块市…

C# 开发工具包 – 现已正式发布

作者&#xff1a;Wendy Breiding 排版&#xff1a;Alan Wang 今天&#xff0c;我们很高兴地宣布 C# 开发工具包正式发布&#xff0c;C# 开发工具包是一个 Visual Studio Code 扩展&#xff0c;为 Linux、macOS 和 Windows 带来了改进的编辑器优先 C# 开发体验。 谢谢社区的努…

文件传输软件的挑战与发展趋势

无论是在教育、医疗、金融、媒体、政府等行业&#xff0c;还是在个人生活和工作中&#xff0c;文件传输软件都有着广泛的应用价值和意义。然而&#xff0c;随着信息技术的发展和数据量的增长&#xff0c;文件传输软件也面临着一些挑战和问题&#xff0c;同时也有着一些发展趋势…

eNSP在hybrid接口上配置vlan

一、什么是vlan VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09;是一种通信技术&#xff0c;它可以将一个物理的局域网在逻辑上划分成多个广播域。每个VLAN都是一个广播域&#xff0c;VLAN内的主机可以直接通信&#xff0c;而VLAN之间则不能直…

SAP-QM-质检收货时报错

采购订单收货时&#xff0c;报错,点击蓝字查看未清的检验批&#xff0c;做使用决策QA11&#xff0c;完成后回复正常。

论文阅读-FCD-Net: 学习检测多类型同源深度伪造人脸图像

一、论文信息 论文题目&#xff1a;FCD-Net: Learning to Detect Multiple Types of Homologous Deepfake Face Images 作者团队&#xff1a;Ruidong Han , Xiaofeng Wang , Ningning Bai, Qin Wang, Zinian Liu, and Jianru Xue &#xff08;西安理工大学&#xff0c;西安交…

李航:关于大模型的思考及研究热点

本文阐述李航老师对 LLM 的一些看法&#xff0c;主要观点如下&#xff1a; ChatGPT 的突破主要在于规模带来的质变和模型调教方式的发明。 LLM 融合了实现人工智能的三条路径。 LLM 的开发需要结合第三者体验和第一者体验。 LLM 能近似生成心智语言。 LLM 需要与多模态大模…

Leetcode刷题详解——找到字符串中所有字母异位词

1. 题目链接&#xff1a;438. 找到字符串中所有字母异位词 2. 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括…

静态IP怎么设置网速快?

随着互联网的普及&#xff0c;越来越多的人需要连接到互联网。大多数人使用动态IP来连接&#xff0c;但有时您可能需要使用静态IP。如果您使用静态IP&#xff0c;那么您需要设置一个静态IP地址。这通常是在路由器或计算机上完成的。 首先&#xff0c;您需要了解什么是静态IP地址…

顺序表第一部分(介绍篇),三部曲后面分别是实现和介绍

目录 1、顺序表的概念及结构 1.1线性表 2、顺序表分类 2.1顺序表分类 2.1.1静态顺序表 2.1.2动态顺序表 1、顺序表的概念及结构 1.1线性表 顺序表是n个有相同特性的数据元素的有限序列。线性表非常常用&#xff0c;常见的数据表是&#xff1a; 顺序表&#xff0c;链表&…

德国人工智能公司【Kodex AI】完成160万欧元融资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于德国柏林的人工智能公司【Kodex AI】今日宣布已完成160万欧元融资。 本轮融资由Signals VC领投&#xff0c;Techstars、德意志银行等天使投资者参与&#xff0c;其中包括:most AI首席执行官…

【音视频流媒体】 3、ffmpeg、ffplay、ffprobe 超详细介绍

文章目录 一、ffmpeg1.1 安装1.2 基本参数 二、ffprobe2.1 查编码格式2.2 查视频时长 五、视频转流5.1 MP4转H2645.2 H264转MP45.3 AVI转MP45.4 MP4转H265 六、视频文件6.1 播放6.2 filter 过滤器6.2.1 crop 6.3 视频截取6.4 视频拼接6.5 获取分辨率 七、视频和图7.1 视频抽帧7…