前端性能优化实践之 SVG Flex 预加载 窗口加载(7)

简介: 前端性能优化实践之 SVG Flex 预加载 窗口加载(7)

1、移动端图标 SVG   ?

  • 和 PNG 相比较 iconfont 优势

网络异常,图片无法展示
|

  • 敲一个例子
1、网页搜索 iconfont 常规使用 ali 不过这个不用登陆 https://icofont.com/icons
  2、下载下来 并且使用 
  3、
复制代码

网络异常,图片无法展示
|

网络异常,图片无法展示
|

网络异常,图片无法展示
|

网络异常,图片无法展示
|

网络异常,图片无法展示
|

  • 举个例子 说明这个事情

网络异常,图片无法展示
|

网络异常,图片无法展示
|

  • 页面效果 展示  非常nice ~

网络异常,图片无法展示
|

2、使用 FlexBox 优化布局 ?

1、display: flex 作为父级容器
2、子容器也可 使用 display:flex 作为下一级的 父级容器
3、常规 用在移动端和小程序,并且 非常容易实现水平 垂直居中效果 
4、可以 进行不同尺寸的自适应布局  非常的强大和nice 
复制代码
  • 举个例子 说明这个事情

网络异常,图片无法展示
|

网络异常,图片无法展示
|

  • 再敲一个 例子 实现 经典的布局
  • html 结构
<header class="header">Header</header>
      <article class="main">
        <p>
          djajdjanndadmamdma dajdadnadnandamd djajdjanndadmamdma
          dajdadnadnandamd djajdjanndadmamdma dajdadnadnandamd
          djajdjanndadmamdma dajdadnadnandamd
        </p>
      </article>
      <aside class="aside nav">nav</aside>
      <aside class="aside ads">ads</aside>
      <footer class="footer">Footer</footer>
    </div>
复制代码
  • css 样式
.wrapper {
        display: flex;
        flex-flow: row wrap;
        text-align: center;
      }
      .wrapper > * {
        padding: 10px;
        flex: 1 100%;
      }
      .main {
        background-color: slateblue;
      }
      .header {
        background-color: skyblue;
      }
      .nav {
        background-color: pink;
      }
      .ads {
        background-color: yellow;
      }
      .footer {
        background-color: lavender;
      }
      @media all and (min-width: 700px) {
        .aside {
          flex: 1 0 0;
        }
      }
      @media all and (min-width: 800px) {
        .main {
          flex: 3 0 0;
          order: 2;
        }
        .nav {
          order: 1;
        }
        .ads {
          order: 3;
        }
        .footer {
          order: 4;
        }
      }
复制代码
  • 实现效果

网络异常,图片无法展示
|

  • 注意 为了 适应移动端 布局 需要 加 meta 标签  <meta name="viewport" content="width=device-width, initial-scale=1.0" />不缩放 按照实际设备宽度 适应展示
  • order 表示 展示顺序

网络异常,图片无法展示
|

3、优化资源加载顺序 ?

网络异常,图片无法展示
|

  • 首先浏览器 加载资源 会有 默认的先后顺序的, 使用 preload / prefetch 目的就是更改 默认顺序

1、 先举个 preload 的例子   加载 svg 图片

  • 基本样子 没有添加 preload

网络异常,图片无法展示
|

  • html 是最高优先级的   然后 图片顺序加载
    网络异常,图片无法展示
    |

  • 当我添加了 preload

网络异常,图片无法展示
|

2、 再举个 preload 的例子   加载 加载字体  

  • 先敲一点架子

网络异常,图片无法展示
|

  • 引用 Google 字体

网络异常,图片无法展示
|

  • 页面效果 非常帅

网络异常,图片无法展示
|

  • 接下来 如何使用 preload 优化字体加载呢 ?

网络异常,图片无法展示
|

  • 页面效果

网络异常,图片无法展示
|

  • 举个 prefetch 的例子
  • 我们在 preload.html 主页使用 prefetch 尝试提前加载 后续页面需要用到的css

网络异常,图片无法展示
|

  • 提升 后续使用 加载 速度

网络异常,图片无法展示
|

  • 如何动态加载 后续补充 就是 封装 两个方法 , 然后 在适当时间调用

4、预渲染页面

网络异常,图片无法展示
|

  • 尝试 使用 react-snap 启动预渲染技术
1、安装  yarn add --dev react-snap
  2、配置一下 
复制代码
  • 配置 直接看官网

网络异常,图片无法展示
|

  • 先看一下 没有预渲染参与时FCP 首屏加载时间

网络异常,图片无法展示
|

  • 配置 预渲染后 使用预渲染的结果为

网络异常,图片无法展示
|

  • 可以看到 有明显的提升
  • 但 预渲染有个问题我们常规的 css 都不是 内联的是放在外部的单文件,导致 会先加载 html 后加载 css 时 会闪烁,解决方法是尽量将重要的内容 内联写在 html 中

网络异常,图片无法展示
|

网络异常,图片无法展示
|

5、window 窗口化 提高列表性能

  • 可以解决的问题

网络异常,图片无法展示
|

1、第一个 例子

1、安装插件 npm i - D react-window 
 2、写一个 ListComponent 做一个窗口显示 部分 list 
 3、在 About 组件内 使用 ListComponent 组件
 4、查看页面效果 
复制代码
  • ListComponent.jsx
import { FixedSizeList } from "react-window";
import model from "../model";
// 定义 item
const items = [];
for (let i = 0; i < 100; i++) {
  items.push(
    model.map((item, index) => (
      <img
        src={item.image}
        alt={item.name}
        key={index}
        width={100}
        height={90}
      />
    ))
  );
}
const Content = ({ index, style }) => {
  // 扩展样式
  let styleExtend = {
    ...style,
    borderBottom: "1px solid #fff",
    display: "flex",
    alignItems: "center",
    justifyContent: "center",
  };
  return <div style={styleExtend}>{items[index]}</div>;
};
const ListComponent = (props) => (
  // 固定长度的list 非固定还有另外一种
  <FixedSizeList
    width={400}
    height={360}
    itemSize={120}
    itemCount={100}
    className={props.className}
  >
    {Content}
  </FixedSizeList>
);
export default ListComponent;
复制代码
  • About.jsx
import SolidSvg from "../img/icon/address-card-solid.svg";
import ListComponent from "./components/ListComponent";
import { withStyles } from "@material-ui/core/styles";
const styles = () => ({
  listContainer: {
    backgroundColor: "#353740",
    border: "2px solid #bcbcbc",
    borderRadius: "20px",
  },
});
class About extends Component {
  render() {
    return (
      <div>
        {/* <SolidSvg width={100} color={"#f3f3f3"} /> */}
        <ListComponent className={this.props.classes.listContainer} />
      </div>
    );
  }
}
export default withStyles(styles)(About);
复制代码
  • 页面效果展示

网络异常,图片无法展示
|

  • 不过其实 网络 部分 可以 优化, 因为 在向上或向下过程中 都会发起网络请求

2、第二个 例子  上下 左右 滚动

网络异常,图片无法展示
|

1、定义一个 Cell 定位行列
 2、使用 这个 Cell 
 3、查看 滚动效果 
复制代码
  • 定义 Cell

网络异常,图片无法展示
|

  • 使用 Cell

网络异常,图片无法展示
|

  • 查看 滚动效果 可实现上下左右滚动 非常nice

网络异常,图片无法展示
|

3、实现 上下 左右 滚动后 如何快速定位到 某行或某列 ?

1、改写成 class 组件因为要使用 React.createRef()
2、取一个位置 
3、点击click 到这个位置
4、页面效果 
复制代码
  • React.createRef()

网络异常,图片无法展示
|

  • 取位置

网络异常,图片无法展示
|

  • click

网络异常,图片无法展示
|

  • 页面效果  点击后 到对应位置 非常nice

网络异常,图片无法展示
|

6、 使用骨架组件减少布局移动 ?

  • 感觉这个东西 是有效的 可以用在项目上, 减少页面布局抖动
  • 这个抖动用 command shift + P  找到这个选项 页面刷新会展示出蓝色部分

网络异常,图片无法展示
|

1、安装 npm install -d react-placeholder
2、复制 一份 Cart组件 到 Contact 并做一些删减 
3、简单使用方法 直接 用官网的例子进行改动 
4、查看 页面效果 对比
复制代码
  • Contact.jsx  有些没有使用到 可去掉
import MaterialUICard from "@material-ui/core/Card";
import CardActions from "@material-ui/core/CardActions";
import CardContent from "@material-ui/core/CardContent";
import Button from "@material-ui/core/Button";
import Typography from "@material-ui/core/Typography";
import { withStyles } from "@material-ui/core/styles";
import "./animation.css";
import CardMedia from "@material-ui/core/CardMedia";
import { LazyLoadImage } from "react-lazy-load-image-component";
import ReactPlaceholder from "react-placeholder/lib";
import {
  TextBlock,
  MediaBlock,
  TextRow,
  RectShape,
  RoundShape,
} from "react-placeholder/lib/placeholders";
const awesomePlaceholder = (
  <div className="my-awesome-placeholder">
    <RectShape
      color="#aaa"
      style={{
        width: 300,
        height: 200,
        marginTop: "20px",
        marginBottom: "20px",
      }}
    />
    <TextBlock rows={2} color="#aaa" style={{ width: 300, height: "1rem" }} />
  </div>
);
const styles = (theme) => ({
  root: {
    margin: theme.spacing(1),
    willChange: "transform",
    width: 300,
  },
  card: {
    width: 300,
    height: 300,
  },
  cardSpinning: {
    width: 300,
    animation: "3s linear 1s infinite running rotate",
  },
  media: {
    height: 200,
    width: 300,
    objectFit: "cover",
    backgroundColor: "#aaa",
    animation: "react-placeholder-pulse 1.5s infinite",
  },
});
class Contact extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      ready: false,
    };
  }
  becomeReady = () => {
    setTimeout(() => {
      this.setState({
        ready: true,
      });
    }, 2000);
  };
  render() {
    return (
      <div className={this.props.classes.root}>
        {/*添加点击事件,触发动画*/}
        <ReactPlaceholder
          ready={this.state.ready}
          customPlaceholder={awesomePlaceholder}
        >
          <MaterialUICard onClick={this.handleClick}>
            <CardMedia
              component="img"
              className={this.props.classes.media}
              image={this.props.image}
              height="200"
              onLoad={this.becomeReady()}
            />
            <CardContent>
              <Typography gutterBottom variant="h6" component="h2">
                {this.props.description}
              </Typography>
              <Typography component="p">{this.props.description}</Typography>
            </CardContent>
          </MaterialUICard>
        </ReactPlaceholder>
      </div>
    );
  }
}
export default withStyles(styles)(Contact);
复制代码
  • 在 About.jsx 中使用

网络异常,图片无法展示
|

  • 比较重要的部分 1、使用 map 遍历 非常重要 并且可以添加上 key 2、如何更改或者取消掉 placeholder 状态呢 ?

网络异常,图片无法展示
|

  • willUnmount 时清除

网络异常,图片无法展示
|

3、需要设置 placeholder 前后的 尺寸相同 这样 效果更好 更小的开销

  • 页面 效果 (添加 placeholder 时)

网络异常,图片无法展示
|

  • 页面 效果 (placeholder 结束 显示 正常内容时)

网络异常,图片无法展示
|

  • 完结  感谢阅读~ 🎉🎉🎉


相关文章
|
3月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
Flex 布局 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 2009年,W3C 提出了一种新的方案----Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。 一、Flex 布局是什么? Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。
301 0
|
8月前
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
490 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
|
缓存 前端开发 JavaScript
利用代码分割优化前端性能:策略与实践
在现代Web开发中,代码分割是提升页面加载性能的有效手段。本文介绍代码分割的概念、重要性及其实现策略,包括动态导入、路由分割等方法,并探讨在React、Vue、Angular等前端框架中的具体应用。
|
11月前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
624 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
编解码 前端开发 开发者
探索无界:前端开发中的响应式设计深度实践与思考###
本文将带你领略响应式设计的精髓,一种超越传统页面布局限制的设计策略,它要求开发者以灵活多变的思维,打造能够无缝适应各种设备与屏幕尺寸的Web体验。通过深入浅出的讲解、实际案例分析以及技术实现细节的探讨,本文目的是激发读者对于响应式设计深层次的理解与兴趣,鼓励在实际应用中不断创新与优化。 ###
425 10
|
编解码 前端开发 开发者
前端开发中的响应式设计实践
前端开发中的响应式设计实践
|
编解码 前端开发 UED
探索无界:前端开发中的响应式设计深度解析与实践####
【10月更文挑战第29天】 本文深入探讨了响应式设计的核心理念,即通过灵活的布局、媒体查询及弹性图片等技术手段,使网站能够在不同设备上提供一致且优质的用户体验。不同于传统摘要概述,本文将以一次具体项目实践为引,逐步剖析响应式设计的关键技术点,分享实战经验与避坑指南,旨在为前端开发者提供一套实用的响应式设计方法论。 ####
328 4
|
人工智能 资源调度 数据可视化
【AI应用落地实战】智能文档处理本地部署——可视化文档解析前端TextIn ParseX实践
2024长沙·中国1024程序员节以“智能应用新生态”为主题,吸引了众多技术大咖。合合信息展示了“智能文档处理百宝箱”的三大工具:可视化文档解析前端TextIn ParseX、向量化acge-embedding模型和文档解析测评工具markdown_tester,助力智能文档处理与知识管理。
|
前端开发 JavaScript 开发者
构建工具对比:Webpack与Rollup的前端工程化实践
【10月更文挑战第11天】本文对比了前端构建工具Webpack和Rollup,探讨了它们在模块打包、资源配置、构建速度等方面的异同。通过具体示例,展示了两者的基本配置和使用方法,帮助开发者根据项目需求选择合适的工具。
367 3
|
JavaScript 前端开发 Docker
拿下奇怪的前端报错(二):nvm不可用报错`GLIBC_2.27‘‘GLIBCXX_3.4.20‘not Found?+ 使用docker构建多个前端项目实践
本文介绍了在多版本Node.js环境中使用nvm进行版本管理和遇到的问题,以及通过Docker化构建流程来解决兼容性问题的方法。文中详细描述了构建Docker镜像、启动临时容器复制构建产物的具体步骤,有效解决了不同项目对Node.js版本的不同需求。
679 1

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    665
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    277
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    247
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    194
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    301
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    442
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    193
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    135
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    203
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    279