vue 首屏加载性能优化方案(一)gzip压缩篇超详细版

前言解读

当在部署访问 SPA单页面应用 时 需要一次性加载所有前端资源,导致文件体积较大。这会增加加载时间并增耗用户的带宽

在 vue项目中,会将我们的所有生产环境第三方依赖打包 chunk-vendors.js 文件中,如引入的库众多,那这个文件则会变大,在游览器加载这个文件时所花费的时间也会更长

让 vue 这类的单页面应用项目体验极差

首次加载或者刷新页面时出现白屏要等待许久的时间,让用户产生这个网站很卡的错觉

如果优化这个速度呢?

首先来分析一下打包出来的 dist 文件

打包资源分析

但是打包出来的文件都是经过加密处理的,怎么知道这些打包的文件哪些是

如果是 vue-cli 脚手架直接在打包命令后面加上 --report 即可,vue-cli 已经集成内置解析工具

在dist目录会生成一个 report.html, 直接打开即可

js 复制代码
"scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build --report",
    "lint": "vue-cli-service lint"
},

或者使用 **webpack **脚手架 安装 webpack-bundle-analyzer 可视化资源分析工具

js 复制代码
npm install webpack-bundle-analyzer -D

可以详细看到哪些依赖文件占据了大部分空间

来测试一下未优化时挂在服务器部署后加载的速度

在游览器控制台中 使用 performance.timing.loadEventEnd 和 performance.timing.navigationStart 来获取页面加载所需的总时间

performance.timing.loadEventEnd 表示浏览器加载完页面上的所有资源(如图像、CSS、JavaScript 等)的时间点。它表示浏览器完成了页面加载的所有工作,并且可以开始对页面进行渲染和交互。
performance.timing.navigationStart 表示浏览器开始加载页面的时间点。它表示浏览器接收到请求并开始加载页面的第一个字节的时间点。

页面总加载时间为3.8秒,从网络看到 仅是加载 chunk-vendors.js 就花费了 2.4 秒,这还是测试的demo项目情况下,如果是真实的项目,加载时间可能会更长

这种情况下,就必须要进行优化了

本篇文章主要讲讲gzip压缩的使用

gzip压缩

1、nginx 开启

在部署前端页面的nginx服务中,修改server项配置,以开启gzip压缩

js 复制代码
server {
    listen       8080;
    server_name  ************;
 
    # 开启gzip
    gzip on;
    # 进行压缩的文件类型。
	gzip_types text/plain text/css application/javascript application/json;
	# 是否在http header中添加Vary: Accept-Encoding,建议开启
	gzip_vary on;
	# 允许使用预压缩的 .gz 文件
	gzip_static on;
	# 设置 Gzip 压缩级别
	gzip_comp_level 5;
	# 设置响应数据的最小长度以启用 Gzip 压缩
	gzip_min_length 256;
	# 指定启用压缩的代理列表
	gzip_proxied any;
	# 禁用 Gzip 压缩的浏览器 User-Agent 列表
	gzip_disable "msie6";
	# 配置内存缓冲区的数量和大小
	gzip_buffers 16 8k;
    
}

2、vue2 + vue-cli 项目中配置

脚手架使用的是vue-cli的情况

安装 compression-webpack-plugin 压缩插件

js 复制代码
npm i compression-webpack-plugin@5.0.2 --save-dev

注意这里的版本为 @5.0.2 ,适配 webpack 4,如果使用最新的版本可能导致安装失败,注意版本冲突

然后在vue.config.js中进行插件配置

json 复制代码
//引入gzip插件
const CompressionPlugin  = require("compression-webpack-plugin");

module.exports = {
  // 部署应用包时的基本 URL
  publicPath: "./",
  // 是否需要生产环境的 source map(源映射文件,帮助开发者在浏览器的开发者工具中,将错误和日志定位到原始代码的具体位置)
  productionSourceMap: false,
  // 是否使用包含运行时编译器的 Vue 构建版本
  runtimeCompiler: true,
  // 是否在开发下通过eslint-loader在每次保存时lint代码, 需要安装@vue/cli-plugin-eslint
  lintOnSave: true,
  // webpack额外配置
  configureWebpack: {
    plugins: [
      new CompressionPlugin({
        algorithm: 'gzip',
        test: /\.(js|css|html|svg)$/, // 匹配文件名
        deleteOriginalAssets: false, // 不删除源文件
        threshold: 1024, // 对超过1k的数据压缩
        minRatio: 0.8, // 压缩比
      }),
    ],
  }
}

配置后打包并保留未压缩的源文件对比

依赖包chunk-vendors.js文件从 1.2m 多变成了 300kb 左右

3、vue3 + vite 项目中配置

安装 **vite **压缩插件 vite-plugin-compression

js 复制代码
npm i vite-plugin-compression --save-dev

vite.config.js 文件中添加以下配置:

js 复制代码
import compression from 'vite-plugin-compression'

export default {
  plugins: [
    compression({
      algorithm: 'gzip', // 压缩算法,可选['gzip','brotliCompress','deflate','deflateRaw']
      threshold: 10240, // 如果体积大于10kb阈值,则进行压缩,参数单位为b
    }),
  ],
}

4、游览器内开启

某些浏览器默认开启了 Gzip 压缩,一些浏览器默认开启了 Gzip 压缩功能,如果网站没有开启 Gzip 压缩,但用户使用的是默认开启 Gzip 压缩的浏览器,那么请求可能会被浏览器压缩,并返回 "Content-Encoding: gzip" 响应头。

此功能在 控制台 => 网络条件 中开启

注:此方法并不保证所有游览器实现,因为不当作可靠的实现方案,仅作为可选项的操作方法

优化效果

配置好之后,打开浏览器访问,F12 查看控制台,如果该文件资源的响应头里显示有Content-Encoding: gzip 标识,表示浏览器支持并且启用了gzip压缩的资源

下面开启后的效果

响应头返回了gzip标识

加载时候从 3.8秒 直接变成了毫秒级 0.4秒

加载速度直接变成了毫秒级,这个速度提升还是非常大的!比较建议在项目中配置,可以让页面体验大大提升

本篇中讲述了gzip的具体开启配置方法,用压缩文件大小来达到提升加载速度的办法

下一篇讲述 使用远程cdn在线地址直接替换本地依赖

相关推荐
To_OC14 小时前
别再串行写 await 了,Promise.all 才是并行请求的正确打开方式
前端·javascript·promise
vipbic15 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy15 小时前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志15 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
invicinble16 小时前
c端系统,其实更像一个信息展示平台
前端
李姆斯17 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
名字还没想好☜18 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司18 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
江华森19 小时前
Web 开发基础:HTTP 与 REST
前端·网络协议·http
IT_陈寒19 小时前
Redis的KEYS命令把我搞崩溃了,改用SCAN才活过来
前端·人工智能·后端