Umi3实战教程

一、框架介绍

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.rhkb.cn/news/160853.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚幻引擎:如何实现骨骼重定向

前言&#xff1a; 为什么需要做骨骼重定向&#xff0c;因为当前角色素材没有对应的动画&#xff0c;这时候我们可以找个身高体型差不多的带有动画素材的另一个角色来做重定向&#xff0c;这样我们就可以得到我们需要的动画素材了。 1.首先创建两个骨骼的IK绑定 2.然后给两个骨骼…

【算法|前缀和系列No.2】牛客网 DP35 【模板】二维前缀和

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【牛客网刷题】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希…

发面试题:(四)synchronized和lock区别

synchronized 关键字 synchronized关键字解决的是多个线程之间访问资源的同步性&#xff0c;synchronized关键字可以保证被它 修饰的方法或者代码块在任意时刻只能有一个线程执行。 另外&#xff0c;在 Java 早期版本中&#xff0c; synchronized属于重量级锁&#xff0c;效率…

vue3学习源码笔记(小白入门系列)------KeepAlive 原理

目录 说明组件是如何被缓存的&#xff0c;什么时候被激活对于KeepAlive 中组件 如何完成激活的对于KeepAlive 中组件 如何完成休眠的 总结 说明 Vue 内置了 KeepAlive 组件&#xff0c;实现缓存多个组件实例切换时&#xff0c;完成对卸载组件实例的缓存&#xff0c;从而使得组…

竞赛 深度学习+python+opencv实现动物识别 - 图像识别

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 inception_v3网络5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…

DHorse v1.4.2 发布,基于 k8s 的发布平台

版本说明 优化特性 在集群列表增加集群版本&#xff1b;修改Jvm的GC指标名&#xff1b; 解决问题 解决shell脚本换行符的问题&#xff1b;解决部署历史列表页&#xff0c;环境名展示错误的问题&#xff1b;解决指标收集功能的异常&#xff1b; 升级指南 升级指南 DHorse…

零宽空格引发的问题

有人跟我反馈说有bug。 我说&#xff1a;啥bug&#xff1f; 对方说&#xff1a;刚申请的内部用户的账号登录不上去。 我说&#xff1a;还有这种事&#xff0c;报啥错&#xff1f; 登录的时候报了这个错&#xff1a; 我一看还好还好&#xff0c;跟上一次不一样的错&#xff…

“探寻服务器的无限潜能:从创意项目到在线社区,你会做什么?”

文章目录 每日一句正能量前言什么是服务器&#xff1f;服务器能做什么&#xff1f;服务器怎么用&#xff1f;部署创意项目&#xff0c;还是在线社区亦或做其他的&#xff1f;后记 每日一句正能量 未知的下一秒&#xff0c;千万不要轻言放弃。 前言 在数字化时代&#xff0c;服…

SpringBoot面试题7:SpringBoot支持什么前端模板?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:SpringBoot支持什么前端模板? Spring Boot支持多种前端模板,其中包括以下几种常用的: Thymeleaf:Thymeleaf是一种服务器端Java模板引擎,能够…

基于马尔可夫随机场的图像去噪算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、马尔可夫随机场的基本原理 4.2、基于马尔可夫随机场的图像去噪算法 5.算法完整程序工程 1.算法运行效果图预览 原图&#xff1a; 加入噪声的图像&#xff1a; 滤波后的图像 迭代过程…

2-k8s-控制器介绍

文章目录 一、控制器类型二、Deployment控制器三、SatefulSet控制器四、Daemonset控制器五、Job控制器六、CronJob 控制器 一、控制器类型 Deployment&#xff1a;适合无状态的服务部署StatefullSet&#xff1a;适合有状态的服务部署DaemonSet&#xff1a;一次部署&#xff0c…

关于ts的keyof

type props_type {name: string,age: number }const props: props_type {name: tjq,age: 18 }for (const key in props) { //props[key]出现红色波浪线const value props[key]; }why&#xff1f; 经过我查阅多方资料&#xff0c;在网上看到一个比较合适的例子 地址&#xf…

OpenRemote: Java 开源 IoT 物联网开发平台,匹配智慧城市、智能家居、能源管理

OpenRemote 是一个直观、用户友好的基于Java语言的开源 IoT 物联网设备管理平台&#xff0c;它包括从连接设备到构建应用程序和特定领域的智能应用程序的所有功能和特性。通过OpenRemote物联网平台&#xff0c;用户可以收集和处理来自不同设备的传感器数据&#xff0c;适用于智…

Gson反序列化原理

前言 序列化和反序列化是日常工作中经常使用的工具&#xff0c;一般用于对象的持久化保存或者对象的网络传输&#xff0c;一般有两种情况&#xff0c;一种是对象本身实现了Serializable接口&#xff0c;这种情况下可以利用jdk自带的功能或者Kryo等这种封装好的序列化反序列化工…

Elasticsearch:什么是大语言模型 (LLMs)?

假设你想参加流行的游戏节目 Jeopardy&#xff08;这是一个美国电视游戏节目&#xff0c;参赛者将获得答案并必须猜测问题&#xff09;。 要参加演出&#xff0c;你需要了解任何事情的一切。 所以你决定在接下来的三年里每天都花时间阅读互联网上的所有内容。 你很快就会意识到…

关于 Invalid bound statement (not found): 错误的解决

关于 Invalid bound statement not found: 错误的解决 前言错误原因解决方法1. 检查SQL映射文件2. 检查MyBatis配置3. 检查SQL语句4. 检查命名约定5. 清除缓存6. 启用日志记录 重点注意 结语 我是将军我一直都在&#xff0c;。&#xff01; 前言 当开发Java Spring Boot应用程…

挚文集团:股票回购速度、收入指引均不及预期,令投资者失望

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 挚文集团未来将不再公布MAU数据 今年6月初&#xff0c;挚文集团(MOMO)在公布2023年第一季度业绩时透露&#xff0c;“陌陌应用的月活跃用户(MAU)”已经从去年3月的1.109亿下降到了今年3月的1.065亿&#xff0c;同比下降了-…

2023,简历石沉大海?软件测试岗位真的已经饱和了....

各大互联网公司的接连裁员&#xff0c;政策限制的行业接连消失&#xff0c;让今年的求职雪上加霜&#xff0c;想躺平却没有资本&#xff0c;还有人说软件测试岗位饱和了&#xff0c;对此很多求职者深信不疑&#xff0c;因为投出去的简历回复的越来越少了。 另一面企业招人真的…

执行事务合伙人和法人区别是什么

1. 定义不同&#xff1a; 执行事务合伙人指负责经营和管理合伙企业的人&#xff0c;对外代表合伙企业进行业务活动&#xff0c;对内负责合伙企业的日常管理。 法人则是企业的法定代表人&#xff0c;代表企业参与民事活动&#xff0c;是企业的行政领导&#xff0c;对企业经济活动…

MAT查找类(岔路口)-技巧

文章目录 前言一、现状二、使用步骤1.导出 hprof2.用MAT打开3.细节操作找大对象的线程名称查看线程的详情查找类的GC Roots柳暗花明检验真理 总结 前言 又是java 内存溢出 OOM JAVA MAT 分析工具大大的好。 高效查找问题根源&#xff0c;才是硬道理。 一、现状 mat 打开hprof…