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在线地址直接替换本地依赖

相关推荐
轻口味20 分钟前
命名空间与模块化概述
开发语言·前端·javascript
前端小小王1 小时前
React Hooks
前端·javascript·react.js
迷途小码农零零发1 小时前
react中使用ResizeObserver来观察元素的size变化
前端·javascript·react.js
娃哈哈哈哈呀1 小时前
vue中的css深度选择器v-deep 配合!important
前端·css·vue.js
旭东怪2 小时前
EasyPoi 使用$fe:模板语法生成Word动态行
java·前端·word
ekskef_sef3 小时前
32岁前端干了8年,是继续做前端开发,还是转其它工作
前端
sunshine6414 小时前
【CSS】实现tag选中对钩样式
前端·css·css3
真滴book理喻4 小时前
Vue(四)
前端·javascript·vue.js
蜜獾云4 小时前
npm淘宝镜像
前端·npm·node.js