008 Umi 中的资产和样式

简介: 008 Umi 中的资产和样式

image.png


资产

首先,让我们讨论一下 Umi 如何处理 静态资产 (如图像)。

新建文件夹 src/assets ,值得注意的是,这并不是一个“约定目录”,仅仅是一个建议目录,我们希望能有一个目录统一管理我们的静态资源。


https://umijs.org/ 官网的 Umi logo 图片下载下来,放到这个文件夹下,即 src/assets/logo.pg

在组件中使用图片,我们可以将它当作一个模块直接引入,比如我们在 index 页面中使用它:

import logoImg from '@/assets/logo.png';
// 剩余内容省略
export default () => {
  return (
    <div>
      <img src={LogoImg} width={150} />
    </div>
  );
}
复制代码


Umi 默认将 @ 映射到项目的 src 目录中,所以你可以在项目的任意位置使用 @/component@/utils 之类的路径来引入模块和方法类。你将不再需要使用到如 ../../../componet 之类的相对路径。


在 css 中同样支持别名,只是别忘了在 css 中使用别名需要增加 ~ 前缀。

.logo {
  background: url(~@/foo.png);
}
复制代码


通过路径引入图片的时候,如果图片小于 10K,会被编译为 Base64,否则会被构建为独立的图片文件输出到构建目录的 static 目录中。

10K 这个阈值可以通过 inlineLimit 配置修改。如:

{
  inlineLimit: 10000; // 10K
}
复制代码


如果你有一些希望原样被拷贝到构建目录的文件,如 robots.txt、Google 站点验证和其他任何静态资产希望被拷贝到构建目录中,则可以将他们放置在顶层的 public 目录中。

注意:不能存在 public/index.html 和其他任何与构建产物同名的文件,不然构建产物将会被覆盖,导致不可预知的错误。



修复资产类型错误

引入 import logoImg from '@/assets/logo.png'; 之后,会有一个类型错误,这是因为 typescript 无法识别 png 后缀的文件名。因此我们可以在项目中添加一个 typings.d.ts 来修复这些不是别的文件后缀。当然如果有些库,你真的无法找到它对应的 types 库,那你也可以在这个文件中定义它或者忽略它。

declare module '*.css';
declare module '*.less';
declare module '*.scss';
declare module '*.sass';
declare module '*.svg';
declare module '*.png';
declare module '*.jpg';
declare module '*.jpeg';
declare module '*.gif';
declare module '*.bmp';
declare module '*.tiff';
declare module '*.json';
复制代码



将 svg 直接当成组件使用

CSS 样式

接下来我们来聊一聊 CSS 样式。 打开我们首页的代码,即 src/pages/index

import React from "react";
import { Link, useSearchParams, createSearchParams, useLocation, } from "umi";
import logoImg from '@/assets/logo.png';
// 需要开启 svgr 配置之后才可用
// import UmiLogo from '@/assets/umi.svg';
export default () => {
  const [searchParams, setSearchParams] = useSearchParams();
  const location = useLocation();
  console.log(location);
  const a = searchParams.get("a");
  const b = searchParams.get("b");
  return (
    <div>
      Index Page
      <img src={logoImg} width={150}/>
      {/* <UmiLogo/> */}
      <p>
        <Link to="/user">Go to user page</Link>
      </p>
      <p>
        SearchParams ---- a:{a};b:{b}
      </p>
      <p>State ---- {JSON.stringify(location?.state)}</p>
      <button
        onClick={() => {
          setSearchParams(createSearchParams({ a: "123", b: "456" }));
        }}
      >
        Change SearchParams
      </button>
    </div>
  );
};
复制代码

如你所见,我们在首页编写了 html 的 demo。你可以理解为我们搭建了页面的‘骨架’。但是往往我们需要页面按照我们的设计来呈现样式,因此我们还需要加上 CSS 样式,来声明 html 标签的渲染样式。



编写和导入 CSS

Umi 内置支持 CSS 和 Less 的支持,允许你导入 .css.less 文件 。

新建一个 src/pages/index.less 文件:

.main{
    font-size: 35px;
}
复制代码


在首页中引入 import "./index.less"

这样我们就可以在页面中使用我们定义好的样式了

import './index.less';
// 剩余内容省略
export default () => {
  return (
    <div className="main">
    </div>
  );
}
复制代码

运行 umi dev,访问页面,你将会看到首页的 font-size 变成 35px



auto CSS Modules

CSS Modules

一般我们在别的框架中使用 CSS Modules 是要引入如 index.module.less 之类的文件,Umi 则通过 babel 插件来实现,只要引用 index.less 就会自动使用 CSS Modules。


我们使用 CSS Modules 的方式在 user 页面中使用样式

import styles from './index.less';
// 剩余内容省略
export default () => {
  return (
    <div className={styles.main}>
    </div>
  );
}
复制代码


通过浏览器开发者工具查看页面 dom ,你可以找到 user 页面的 div 的 class 的类名是如 main___us1GC 这样的带有一个随机 哈希值的类名。(index 页面中则是 main

所以这个也是我们使用 CSS Modules 的另一个目的,能够很好的隔离页面的样式,这样不管我们一个项目中有多少个人一起开发,正常样式编写的话,会极少的发生样式污染事件。


源码归档

目录
相关文章
|
前端开发 JavaScript API
020 Umi@4 中如何实现动态菜单
020 Umi@4 中如何实现动态菜单
1372 0
020 Umi@4 中如何实现动态菜单
|
缓存 监控 测试技术
如何利用浏览器的缓存来优化网站性能?
【10月更文挑战第23天】通过以上多种方法合理利用浏览器缓存,可以显著提高网站的性能,减少网络请求,加快资源加载速度,提升用户的访问体验。同时,要根据网站的具体情况和资源的特点,不断优化和调整缓存策略,以适应不断变化的业务需求和用户访问模式。
754 63
|
Java Linux
Linux上管理不同版本的 JDK
Linux上管理不同版本的 JDK
891 0
|
前端开发 JavaScript API
React 图片放大组件 Image Zoom
本文介绍如何使用React创建图片放大组件(Image Zoom),提升用户体验。组件通过鼠标悬停或点击触发放大效果,利用`useState`管理状态,CSS实现视觉效果。常见问题包括图片失真、性能下降和移动端支持,分别可通过高质量图片源、优化事件处理和添加触摸事件解决。易错点涉及状态管理混乱、样式冲突和过多事件绑定,建议使用上下文API、CSS模块及优化事件绑定逻辑。高级功能扩展如多张图片支持和自定义放大区域进一步丰富了组件的实用性。
499 25
clion中cmake配置含义
clion中cmake配置含义
414 0
|
存储 监控 测试技术
深入理解Sentinel系列-2.Sentinel原理及核心源码分析(上)
深入理解Sentinel系列-2.Sentinel原理及核心源码分析
909 0
|
网络架构 网络安全
PREROUTING 和 POSTROUTING, SNAT 和 DNAT图文解析(非常清淅)
NAT (网络地址转换) 技术在平时是很多见的,如家庭中在使用路由器共享上网时,一般用的就是 NAT 技术,它可以实现众多内网 IP 共享一个公网 IP 上网。NAT 的原理 简单的说就是当内网主机访问外网时,当内网主机的数据包要通过路由器时,路由器将数据包中的源内网 IP 地址改为路由器上的公网 IP 地址,同时记录下该数据包的消息;当外网服务器响应这次由内而外发出的请求或数据交换时,当
4717 0
|
Go Python
Air-让Gin框架实现热加载
Air-让Gin框架实现热加载
492 0
|
编解码 视频直播 网络性能优化