前端性能优化 - 阶段性总结

前言

最近做性能优化,发现总是曾经做过的性能优化方案和分析工具都忘了,需要重新搜集资料,并进行开发。于是开始记录,留作以后查询。

性能分析工具

  • Performance
  • Lighthouse
  • Memory
  • Vue Devtools / React Developer Tools
  • webpack-bundle-analyzer
  • rollup-plugin-visualizer

性能指标

项目记录

分析

项目性能分析是性能优化最重要的一项工作,通过性能分析可以找到具体的性能问题所在,便于优化。一般来说,性能优化的过程是:

  • 性能分析
  • 性能优化
  • 结果验证

循环往复,性能优化是一个长期工作,需要时时监控,在性能下降时及时优化。

lighthouse 性能分析结果

由这个结果可以看到,这个网站的性能相当差,按50分为及格线可以说刚刚及格,于是可以简单根据这个测试结果设置一个基础目标,将性能分提升到90分以上。

问题分析

真实优化过程是分析一个问题,解决一个问题,验证一个问题,在这里为了方便观看,就将问题都直接汇总。

前端实际上是对资源的加载和渲染,所以以资源加载过程做状态划分。

资源加载

资源加载的优化可以分为两个方面。

  • 加载速度
  • 加载体积

先从加载资源体积开始优化。要优化加载资源的体积,可以对资源进行压缩,也可以减少传输的资源。

首先是压缩资源。

现在的打包构建工具例如 vite 和 webpack 都自动支持对静态资源的压缩。在默认压缩基础上,我们可以配置打开 gizp 压缩进行传输。

gzip 压缩

在 vite 中可以使用vite-plugin-compression2插件进行压缩。

javascript 复制代码
import { defineConfig } from 'vite'
import { compression } from 'vite-plugin-compression2'
import { visualizer } from "rollup-plugin-visualizer";

export default defineConfig({
  plugins: [
    // ...your plugin
    compression(),
    // 分析打包结果
      visualizer({
        open: true, // 构建结束后自动在浏览器中打开报告
        gzipSize: true, // 显示经过 gzip 压缩后的文件大小
        brotliSize: true, // 显示经过 brotli 压缩后的文件大小
        filename: "stats.html" // 报告生成的文件名称
      })
  ]
})

通过打包分析可以看到,相对于未压缩资源,资源体积压缩效果非常明显,达到了100%。

同时需要对nginx进行配置,启用gizp资源。

bash 复制代码
# nginx.conf 文件 
http {
    include       mime.types;
    default_type  application/octet-stream;

    # 添加对 .mjs 文件的支持
    types {
        application/javascript js mjs;  # 同时支持 .js 和 .mjs
    }
    # 开启gzip
    gzip on;
    # 静态压缩
    gzip_static on;
    # 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
    gzip_min_length 1k;
    # gzip 压缩级别,1-10,数字越大压缩的越好,也越占用CPU时间
    gzip_comp_level 2;
    # 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png image/jpg;
    # 是否在http header中添加Vary: Accept-Encoding,建议开启
    gzip_vary on;
    # 禁用IE 6 gzip
    gzip_disable "MSIE [1-6]\.";
 }
分包

vite 分包有两种方式,一种是动态分包一种是静态分包。动态分包是vite根据import自动处理,比如动态加载路由,静态分包是将一些稳定不会变化的包单独打包,比如vue。

这里主要说静态分包。manualChunks 接收一个对象或者函数,将配置的第三方包单独生成,key为包的前缀。

css 复制代码
export default defineConfig(({ mode }) => {
    build: {
      rollupOptions: {
        output: {
          manualChunks: {
            vue: ["vue", "pinia", "vue-router"],
            naive: ["naive-ui"]
          }
        }
      }
    }
  };
});

第二次分析

做完以上优化,可以再次看下 lighthouse 性能分数。

现在已经78分了,距离我们的目标只差12分了,胜利近在眼前。

项目中具体优化

以上是一些通用的优化策略,接下来需要根据具体问题来进行优化。

normalize.css

项目中采用的社区的 normalize.css npm 包,这导致 normalize.css 文件需要单独加载,这阻塞了页面渲染,所以我们可以将 normalize.css 配置提取到 index.html 中,以加快渲染。

图片懒加载

分析首页是列表型页面,具有大量图片,所以针对首屏中不显示的图片,可以设置懒加载。

图片资源压缩

由于图片是运营人员上传,所以可以在上传时自动压缩,并转换为 webpg 等较高性能的压缩格式。

还有其他的方案则是结合具体情况具体分析。以上都是针对用户首次进入网页的性能优化,我们还可以使用缓存,cdn等方案提升用户后续进入网页的性能。

最终

完成目标,如果条件允许,可以上服务端渲染,首页性能会有质的提升。

相关推荐
@HNUSTer5 小时前
基于 HTML、CSS 和 JavaScript 的五子棋游戏
前端·javascript·css·游戏·html
百锦再5 小时前
Vue核心知识:动态路由实现完整方案
前端·javascript·vue.js·前端框架·vue·路由·动态
aloha_6 小时前
江口村青年爱心基金会管理制度 - 暂定
前端
拉不动的猪6 小时前
刷刷题24
前端·javascript·面试
aloha_6 小时前
关于成立江口村青年爱心基金会的倡议
前端
Smile_Gently6 小时前
v-code-diff 配置
前端·javascript·vue.js
werch6 小时前
兼容移动端ios,安卓,web端底部软键盘弹出,输入框被遮挡问题
android·前端·ios
成功助力英语中国话6 小时前
visual studio 2022中如何添加项目到解决方案中
前端·ide·visual studio
互联网动态分析7 小时前
Tomcat:Java Web应用的强大支撑
java·前端·tomcat
敲代码中7 小时前
CSS_复合选择器
前端·javascript·html