首屏哪些地方可以优化呢?

197 阅读2分钟

首先在优化首屏渲染之前,我们得先理解白屏是什么

白屏其实就是用户输入 URL 到请求服务器拿到得数据并解析 DOM 的过程。

  1. 用户输入URL,例如 www.baidu.com
  2. DNS 解析,浏览器首先会检查本地缓存中是否有该域名的IP地址,有就会用缓存,反之会向 DNS 服务器发送请求,解析对应的 ip 地址。
  3. 建立连接,获取对应的 ip 地址之后,浏览器与服务器建立 TCP 连接,这个过程包含三次握手。
  4. 发送请求,建立连接之后向服务器发送请求,请求页面资源,服务器响应数据 (HTML文档)。
  5. 浏览器解析 HTML文档,构建 DOM 树,遇到样式时,暂停 HTML 解析,下载样式文件,构建样式树。
  6. 样式树和DOM树结合,生成渲染树,用来绘制页面。
  7. 解析脚本文件,在遇到 script 时,会下载 script 代码,并执行 script 代码,这个过程可能会有回流和重绘。
  8. 在样式树和DOM树结合之后,确认DOM的最终结果,浏览器页面将内容绘制到屏幕上。
  9. 绘制最终页面,用户看到最终页面结果。

总结:在浏览器解析 head 标签或者渲染 body 标签时,就是白屏的结束点,以上所有的步骤都可能导致延长白屏时间。

(webpack) vue2 打包分析

使用 webpack-bundle-analyzer 打包分析,检查较大的依赖

这里我们以花裤衩(PanJiaChen/vue-element-admin: :tada: A magical vue admin https://panjiachen.github.io/vue-element-admin)为例

  1. 创建一个新的文件 项目/webpack.config.js
npm i webpack-bundle-analyzer -D
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer")
if(process.env.NODE_ENV === "production"){
module.exports = {
plugins: [new BundleAnalyzerPlugin()]
}
} else {
module.exports = {}
}
  1. 在 vue.config.js 中使用

configureWebpack: require("./webpack.config"),

  1. 运行打包命令
  2. 优化

    移除未使用的依赖
    对于较大的依赖可以使用 splitChunksPlugin 拆分,vite 不太好支持
    懒加载非立即加载的模块 import()
    平替大依赖,例如 lodash-es 和 lodash

GZIP 压缩打包

gzip 所有浏览器都支持,将静态文件或者script文件打包压缩 20%-30%
webpack 配置:

const CompressionPlugin = require('compression-webpack-plugin');
module.exports = {
  plugins: [
    new CompressionPlugin({
      test: /.(js|css|html|svg)$/,
      threshold: 10240,
    }),
  ],
};

vite 配置:

import compressPlugin from 'vite-plugin-compression';
export default defineConfig({
  plugins: [
    compressPlugin({
      ext: '.gz',
      algorithm: 'gzip',
      deleteOriginFile: false,
    }),
  ],
});

减少首页请求

确保浏览器的请求数量不会大于浏览器的最大请求数,否则会排队请求。
对于大数据的首页请求,可以使用骨架屏,或者使用打包数据。

懒加载

对于多模块下,可以使用 const MyComponent = import("xxx")
也可以使用 Vue3 Suspence 组件来配合异步加载组件

    <Suspence>
        <template #default>
            <MyComponent />
        </template>
        <template #fallback>
            组件加载中...
        </template>
    </Suspence>