前端性能优化初体验

本文分享了在Preact项目中进行前端性能优化的经验,包括bundle.js过大问题的解决,代码分割策略,以及利用Gzip压缩减少文件大小。通过动态import实现Code Splitting,去除多余import,使用SplitChunksPlugin优化第三方库加载,以及启用Gzip压缩,显著减少了文件大小和加载时间。
摘要由CSDN通过智能技术生成

项目前端使用 Preact

笔者初次使用 webpack,尝试过从头配置,屡战屡败

最终选择,配置 preact.config.js,进行优化

前言

简单交代一下在 Preact 脚手架工具的基础上如何自定义配置:

// package.json
  "scripts": {
    ...
    "npab": "preact build --no-prerender --analyze"
  }

进入正题!


情况概览

原先项目打包后,总文件大小为5.5MB

在这里插入图片描述

Fast3G下,首次加载时长平均在15秒-20秒

在这里插入图片描述

在这里插入图片描述


优化过程

问题一:bundle.js 过大

A计划:切分代码

Code Splitting,通过动态 import 的方式,减少页面初载时,所需加载资源的体积(按需加载)

React可使用:loadable-components;react-loadable 等

Preact可使用:preact-async-route 等

:之前在实践时,使用的为 loadable-components,印象中是因 react-loadable 在使用过程中出现了警告,仅供参考。相关的讨论 => 传送门

B计划:去掉多余 import

在这里插入图片描述

太诡异了,哪来这么多 antd (无中生有 啊这…

排查代码后,会发现是多余的import在作祟。去掉之后,马上清爽了许多

在这里插入图片描述

问题二:代码分割待改进

原先的代码分割,业务代码和第三方模块你中有我,我中有你,容易出现:①重复加载相同的模块,②一方修改之后,整个的hash发生变化,影响缓存

这里使用SplitChunksPlugin,笔者的分割思路为:

  1. vendor: 常用第三方模块,使用频次较高
  2. antd:打包使用频次较高的部分,不全部单独打包,减少体积(这块首次加载肯定会载入
  3. moment:频次不高但也不低,比较大,但首次加载时不需载入
// preact.conf.js
export default {
    webpack(config, env, helpers, options) {
        config.optimization.splitChunks.chunks = "all";
        config.optimization.splitChunks.minChunks = 4;
        config.optimization.splitChunks.cacheGroups = {
            antd: {
                name: 'antd',
                test: /antd|@ant-design/, // 匹配文件
                priority: -10  // 优先级配置项
            },
            moment: {
                name: 'moment',
                test: /moment/,
                minChunks: 3, // 共享模块最小块数
                priority: -10 
            },
            vendors: {
                name: 'vendors',
                test: /[\\/]node_modules[\\/]/,
                priority: -20   // 优先级配置项
            }
        }
    },
}

打包完后,总文件大小为3.1MB

在这里插入图片描述

【日常疑问】第三方库分离后,首次加载所需时间反而增加了,该怎么平衡

第三方库分离后,意味着需要加载的文件变大了,导致时间不减反增(心态炸了

在这里插入图片描述

使用 Chrome 开发者工具中 Coverage 查看代码利用率后,疑惑更深,这不利用率更…??

在这里插入图片描述

在这里插入图片描述

前半个问题,通过平衡minChunks的大小,可以有一定改进(细微,细微…

再者,可以考虑使用CDN来进行优化,不在一棵树上吊死

后半个问题,查看一些成熟大型的网页首屏的代码利用率后,会发现这是正常的事情

在这里插入图片描述

想提高利用率的话,可以考虑优化业务代码,使用 Tree Shaking 减少业务代码等

(你问我咋没实践?啊这,因为用完后面的压缩,觉得挺好的,然后… 下次一定!

在这里插入图片描述

注: 因笔者为在原有配置上再定义,故省去了配置hash的步骤。hash的配置,有利于命中缓存,减少请求。其中,又分为 hash,chunkhash,及contenthash,三者的区别及具体的使用见后文参考链接。

问题三:文件都比较大

正在优化的项目比较大,所以用压缩,解压的时间换传输过程中的时间就很划算了。这里使用的压缩方案为 Gzip 传送门

Gzip 压缩背后的原理,是在一个文本文件中找出一些重复出现的字符串、临时替换它们,从而使整个文件变小

对于多媒体文件则没有必要采用Gzip,因为多数多媒体文件本身就是采用了有损压缩

对有损压缩的文件再进行 Gzip,效果不显著

法一:改 niginx/nginx.conf,设在http上

傻瓜操作,去掉其原有的所有#

// 开启或关闭gzip
gzip on;  
// 是否在header中添加Accept-Encoding
gzip_vary on; 
// 反向代理时是否启用压缩
gzip_proxied any;
// 压缩级别,越大,越好,越占CPU
gzip_comp_level 6;
// 压缩需要的缓冲区大小,此时为以8k为单位,申请16*8k
gzip_buffers 16 8k;
// 针对的协议版本
gzip_http_version 1.1;
// 进行压缩的文件最小字节数
gzip_min_length 1024;
// 压缩的文件类型
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; 

法二:改 sever 下的配置

server {
     listen  3389;
     server_name localhost;

     location / {
         root /var/www/finaldoc;
         index index.html;
     }

     gzip on;
     gzip_vary on;
     gzip_buffers 16 8k;
     gzip_comp_level 6;
     gzip_min_length 1024;
     gzip_types text/plain text/css application/javascript text/xml application/xml text/javascript; 
}

配置完之后,不要忘记重启 Nginx => sudo service nginx restart

在这里插入图片描述

在这里插入图片描述

哦~! 这就是看孩子从不及格走向高分的快乐吗!(感动的热泪


总结

笔者就项目的情况,只实践了性能优化过程的几步

网上很多优秀的文章还提到了其他更多的优化方式,值得大家去实践

希望能对你有所帮助 ~


参考文章

优化路线

React 16 加载性能优化指南:整体的路线可参考

前端性能优化三部曲(加载篇):整体的路线可参考

前端性能优化原理与实践:详细的知识点介绍与梳理,推荐阅读

具体问题

Should I use react-loadable or loadable-components for code splitting?

Webpack 4 如何优雅打包缓存文件:3种 hash 的区分

项目不知道如何做性能优化?不妨试一下代码分割:Chrome 开发者工具中 Coverage 的使用

前端工程师不可不知的Nginx知识

入门系列之在Nginx配置Gzip:修改 nginx.conf

工具

Lighthouse:文中评估页面性能的工具

网页性能分析不完全指南:使用 Chrome 开发者工具的 performance 面板分析运行时性能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值