分享人:Leo Liu(刘璐)云智慧前端开发工程师,负责云智慧ITSM产品的前端开发工作,拥有丰富的toB行业前端开发经验,致力于改善前端架构以及性能优

云智慧数字化运维管理产品DOSM是面向企业IT服务管理领域的新一代ITSM服务管理产品。通过高效的流程引擎,支持多样化的工单流程、多种工单处理&分配方式以及动态表单等功能,帮助企业实现数字化转型。

问题描述:

在客户内网环境下,因带宽比较低,静态资源加载会很慢,导致加载页面的时候,白屏的时间比较长,大概有 15 到 30 秒这样一个时间,导致用户体验会很不好。

当用户在打开网页时, 最直观的感受就是页面内容出来的速度,我们要做的优化工作, 也主要是为了解决这个问题。那么如何提高页面加载和渲染速度呢?一般来说有 三个方面:

  1. 代码逻辑的优化。优秀的代码设计和编写可以有效减少渲染页面使用的内存和速度(比如虚拟DOM)。
  2. SSR服务器渲染。将首屏所有内容在服务器端渲染成html静态代码后,直接输出给浏览器,可以有效加快用户访问站点时首屏的加载时间。
  3. 提升静态文件的加载速度,而这方面大致又可分为下面几点:

— 加快静态文件下载速度

— 减少静态文件的文件大小

— 减少静态文件请求数量,从而减少发起请求的次数(对于浏览器页面来说,请求的开销比网速的开销要大)

解决方案:

加快静态文件下载速度:

gzip压缩,下面的代码会对文件大小大于10240,并且压缩率好于0.8的js、css文件进行gzip压缩。

var CompressionWebpackPlugin = require('compression-webpack-plugin')webpackConfig.plugins.push(
new CompressionWebpackPlugin({
asset: '[path].gz[query]',
algorithm: 'gzip',
test: new RegExp(
'\\.(' +
config.build.productionGzipExtensions.join('|') +
')$'
),
threshold: 10240,
minRatio: 0.8
})
)

增加nginx配置


gzip_static on;
gzip_http_version 1.1;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;

减少静态文件的文件大小

在dev模式下的打包文件分析如下:

发现代码结构中存在较大问题的两个文件为图中红框所示 ⬆️

(注:当前打包文件体积为DEV环境下的打包体积,生产环境下包的体积会等比例缩小)

进一步展开分析:

一. 打包方面

体积最大的文件(8.79MB)中存在两个较为明显的问题:

1.antd中的icon静态资源库较大且有两个库分别引入打包导致较大的资源被重复打包两次

2.Echarts图表库资源仅在部分页面中使用但依然被打包在了公共资源文件中

体积第二的文件(4.05MB)中存在以下两个问题

1.wangEditor.js文件和iconfont.js文件过大

2.pages文件依然存在被拆分的可能性

减少静态文件请求数量

使用splitChunks方式拆分后的结果如下 ⬇️

存在问题:文件虽然体积变小,但数量增多且重复代码数量增加。请求时依然会占用过多的网络资源,所以将splitChunks的处理方式进行优化

module.exports = {
configureWebpack:config =>{
return {
optimization: {
splitChunks: {
chunks: 'async',
minSize: 30000,
maxSize: 0,
minChunks: 1,
maxAsyncRequests: 6,
maxInitialRequests: 4,
automaticNameDelimiter: '~',
cacheGroups: {
vendors: {
name: `chunk-vendors`,
test: /[\\/]node_modules[\\/]/,
priority: -10,
chunks: 'initial'
},
common: {
name: `chunk-common`,
minChunks: 2,
priority: -20,
chunks: 'initial',
reuseExistingChunk: true
}
}
}
}
}
}
};

用splitChunks插件来控制Webpack打包生成的js文件的内容的精髓就在于, 防止模块被重复打包,拆分过大的js文件,合并零散的js文件。最终的目的就是减少请求资源的大小和请求次数。因这两者是互相矛盾的,故要以项目实际的情况去使用SplitChunks插件,需切记中庸之道。

页面用户体验方面

使用谷歌浏览器开发者工具模拟 Fast 3G 网络条件下的页面加载过程

在JS没有解析加载完成之前展示当前页面,会处于长时间的白屏,带来了一定的用户体验问题。

针对页面白屏问题,在组件中添加 骨架屏动画过渡效果,增加用户等待时间的体验

推荐的性能优化分析处理方向

React Profiler

React Profiler API 会分析渲染和渲染成本,以帮助识别应用程序中卡顿的原因。


import React, { Fragment, unstable_Profiler as Profiler } from "react";

Profiler 接受一个 onRender 回调函数,当被分析的渲染树中的组件提交更新时,就会调用它。


const callback = (id, phase, actualTime, baseTime, startTime, commitTime) => {
console.log(`${id}'s ${phase} phase:`);
console.log(`Actual time: ${actualTime}`);
console.log(`Base time: ${baseTime}`);
console.log(`Start time: ${startTime}`);
console.log(`Commit time: ${commitTime}`);
}const Demo = ({ props }) => (
<Fragment>
<Profiler id="Demo" onRender={callback}>
</Fragment>
)

列的宽度表示 component(和它的 children)最近一次渲染所花费的时间。如果这个 component 在本次 commit 中没有被重新渲染,那其所展示的时间表示上一次 render 的耗时。一个列越宽,其所代表的 component 渲染耗时就越长。

列的颜色表示在本次 commit 中该 component(和它的 children)所花费的时间。黄色代表耗时较长、蓝色代表耗时较短,灰色代表该 component 在这次 commit 中没有被(重新)渲染。

Profiler 的 onRender 回调接收描述渲染内容和所花费时间的参数:

  • id: 生提交的 Profiler 树的 id。如果有多个 profiler,它能用来分辨树的哪一部分发生了“提交”。

  • phase: "mount" (首次挂载) 或 "update" (重新渲染),判断是组件树的第一次装载引起的重渲染,还是由 props、state 或是 hooks 改变引起的重渲染。

  • actualDuration: 次更新在渲染 Profiler 和它的子代上花费的时间。

  • baseDuration: 在 Profiler 树中最近一次每一个组件 render 的持续时间。这个值估计了最差的渲染时间。

  • startTime: 本次更新中 React 开始渲染的时间戳。

  • commitTime: 本次更新中 React commit 阶段结束的时间戳。在一次 commit 中这个值在所有的 profiler 之间是共享的,可以将它们按需分组。

  • interactions: 当更新被制定时,“interactions” 的集合会被追踪。

service worker

将一些静态资源及部分依赖项文件(react,antd等)使用service worker处理,增加前端本地资源的缓存能力,减少网络资源请求。

关于service worker:

  • 它是一个 JavaScript 线程, 所以它不能直接接触DOM. service worker 可以与一些页面通信(这些页面通过postMessage接口发出信息),而这些页面可以操作DOM(如果需要的话)

  • Service worker 是一个可编程的网络代理,它允许你控制网络如何从你的页面发出请求。

  • 不使用时会停止运行,在你下一次需要时又会重启。所以,在一个service worker的 onfetch 和 onmessage处理函数里,你不能指望会有一个全局的service worker的状态标志。如果你的确需要存储并复用service worker的状态,它提供了一个API可以用来连接DB: IndexedDB API

  • 可视化大屏开源地址:

    飞鱼平台(FlyFish)是云智慧公司自主设计、研发的一款低门槛、高拓展性的低代码应用开发平台,为数据可视化开发场景提供了高效的一站式解决方案。

    飞鱼提供丰富的组件和应用模板库,可通过拖拉拽的形式完成数据可视化开发,零开发背景的用户也可完成数据可视化开发工作。同时,飞鱼也提供了灵活的拓展能力,支持组件开发、自定义函数与全局事件等配置,面向复杂需求场景能够保证高效开发与交付。

    Github地址: CloudWise-OpenSource · GitHub

    Gitee地址: 云智慧: Cloud Wise Everything,云智慧。

    在线地址: 云智慧

前端优化 | DOSM Web项目优化分析 ( 附解决方案及代码)相关推荐

  1. 前端小白浅谈seo优化以及web性能优化方案

    写在前面 这是好久之前的工作了,之前还没用vue spa 做项目的时候,都是用的原生js写项目,纯html,css,js写项目,真的是每个页面引用css,js各种文件写到头痛, 那个时候做一个大型网站 ...

  2. 前端开发:Web性能优化有哪些方法?

    Web性能优化,主要分为前端和后台两个部分性能优化,后台性能优化决定了Web能不能用,前端优化决定了其好不好用,也就是牵涉到前端用户体验和Web易用性等情况,所以前端性能与用户体验是有着极大的关联的. ...

  3. python Web项目知识点分析

    django项目知识点分析 1.异步任务celery和中间人rabbitmq ​ 1.1 celery提供异步任务,遇到耗时操作的任务都可以交给celery来完成 ​ 1.2 通信过程是,生产者(任务 ...

  4. 【Android 性能优化】应用启动优化 ( 阶段总结 | Trace 文件分析及解决方案 | 源码分析梳理 | 设置主题的方案总结 ) ★

    文章目录 一. 常用的耗时方法优化方案 ( 重要 ) 二. 源码分析梳理 1. 应用启动时间计算相关源码分析 2. Launcher 应用中启动 Android 应用流程 三. 启动白屏解决方案 An ...

  5. android 启动优化方案,Android 项目优化(五):应用启动优化

    介绍了前面的优化的方案后,这里我们在针对应用的启动优化做一下讲解和说明. 一.App启动概述 一个应用App的启动速度能够影响用户的首次体验,启动速度较慢(感官上)的应用可能导致用户再次开启App的意 ...

  6. css优化,js优化以及web性能优化

    Css优化总结 对于css的优化可以从网络性能和css语法优化两方面来考虑. Css性能优化方法如下: 1.css压缩 Css 压缩虽然不是高端的知识,但是很有用.其原理也很简单,就是把我们css代码 ...

  7. 木其工作室代写程序 [原]java web项目各种乱码的解决方案

    淘宝网上专业IT程序代写 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.ne ...

  8. java web项目优化记录:优化考试系统

    考试系统在进行压力測试时发现,并发量高之后出现了button无反应.试题答案不能写到数据库的问题,于是针对这些核心问题,进行了优化. 数据库方面: Select语句:Select * from TEB ...

  9. saas java框架_XMReport-提供web项目Java套打解决方案

    简介 XMReport是国内首款支持在线编辑,维护的控件式报表产品.XMReport报表产品分为设计器与引擎两个部分,其中报表设计器是完全基于HTML5技术,提供优秀跨平台的支持,用户无需安装客户端或 ...

最新文章

  1. [K/3Cloud]关于数据库sa密码更改,管理中心登录不上的问题。
  2. 【Java】数据结构---二叉树 详解
  3. C的function call與stack frame心得
  4. nginx集群_windows环境下搭建简单Nginx+Tomcat集群
  5. c语言禁止优化某段代码,C语言优化小技巧
  6. pytorch 语义分割loss_关于pytorch语义分割二分类问题的两种做法
  7. SpringBoot指南(八)——SpringBoot整合Redis
  8. java mac 怎么删_做java服务器开发,并发布到linux,那MacBookPro开发是绝佳工具
  9. web前后台数据交互的四种方式
  10. Posterino for Mac(图片拼贴编辑器)
  11. linux mkdir基础命令总结
  12. c++简单程序实现——小公主养成记
  13. 嵌入式、单片机开发必备软件
  14. PanDownload:登录百度账号提示浏览器版本太低,点击下载webkit内核,然后重启软件即可
  15. MySQL B+树如何实现联合索引
  16. Spring security oAuth2 密码错误中英文提示问题
  17. 训练网络时,loss损失的问题
  18. JavaWeb框架(四):JavaWeb项目基于三大组件实现的公司管理系统
  19. ODB++数据解析二
  20. cve-2005-1794

热门文章

  1. 苹果设计可变色Apple Watch表带,智能穿戴玩法多
  2. Teamviewer检测为商业用途的解决方案
  3. 微型计算机联想c325,寓教于乐一体机 联想IdeaCentre B325评测
  4. 基于博客系统的访客日志记录----代码合集
  5. “免费午餐”成为销量第一,看明星吉杰淘宝直播如何抓取粉丝眼球
  6. 链接元宇宙,开启新纪元
  7. 电脑开不了机 ,怎么解决?
  8. 在线教育项目【老师服务】
  9. 67. 把字符串转换成整数
  10. 裴礼文数学分析中的典型问题与方法练习 1.1.5 解答貌似有问题.