测试基础 前端性能优化 (提升 13 倍)

花菜 · 2023年04月27日 · 最后由 花菜 回复于 2023年05月05日 · 8703 次阅读

1、背景

有好几个童鞋跟我反馈,你测试平台在线 demo 加载好慢啊

慢确实是慢,但这事情不能赖我呀,肯定是腾讯云的锅。

腾讯云 8m 带宽的服务器,可是我斥巨资购入的呀

image-20230426203251930

image-20230426203746466

这可是价值 5040 元的服务器啊!(虽然实付只是 198😝)

image-20230426204038997

好家伙,续费的时候,加了这个峰值带宽是啥意思?那我现在的带宽是不是 8M?我还真测了一下

image-20230426205126674

腾讯云大佬如果看到了,别打我,我不是黑腾讯云,只是想引起你们的注意(万一把我招进去了呢)

算了,算了。这个锅还是我自己来背

2、为什么慢?

打开 Chrome 开发者工具,一看(chuck-xxx.js 忽略,是我自己安装 Chrome 插件的 js)

image-20230426205613332

vendor.xxxx.js 是啥,为啥这么大?

问一下 ChatGPT

image-20230426205956156

哦,原来是第三方依赖啊,那到底依赖了啥

通过webpack-bundle-analyzer分析,可以看到monaco-editor这个模块占大头,超过 1/3 了!

然而在项目中,只有一个地方用到,这太不合理,要干掉!

image-20230426193205800

3、优化方案

monaco-editor很强,很优秀(你是个好人,但我们不合适)

既然monaco-editor很大,但编辑器还是得有,那用啥来代替呢?

那还是继续问一下 ChatGPT

image-20230426210639860

3.1 CodeMirror 方案

CodeMirror 这个是比较出名的,在虾皮的时候,看前端同学也是用了这个。

那就先用这个是试试。

哦豁,这东西默认安装是 vue3 版本,然而当前项目是 vue2

降低版本到适配 vue2 的版本

结果问题又来,这玩意默认高度是 300px,真的坑,初始化的配置还不能直接设置高度

一顿操作后,菜鸡如我,并没有解决这个问题,暂时放弃

image-20230426211206152

3.2 Ace 方案

所幸 CodeMirror 翻车后,还有 plan B,那就 Ace,看 ChatGPT 的回答,应该更加符合这次的需求

那就选它了!

用 Ace 替换掉 Monaco 之后

看看 webpack-bundle-analyzer,app.js 从 15.82MB 降低到了 10.19MB,降低 5.63MB

前面看到的 Monaco 是 6.1MB,算下来 Ace 就是 0.47MB,Monaco 是 Ace 的 12.98 倍(标题有了)!

image-20230426193131143

4、收益

4.1 打包容量

打包整体的容量减少了 14M!

image-20230426213311695

4.2 打包速度

打包时间缩短约 36s,相当可观呀!

image-20230426213527039

4.3 首页加载容量

减少了 0.4MB,看着不算很大?不行,我就想吹一下

image-20230426214019478

4.4 首页加载速度

可以通过下面两个地址实测

CloudFlare CDN 访问

腾讯云访问

账号密码
test
test2020

5、总结

引用一句 Facebook(现在 Meta) 著名的口号和价值观

"Done is better than perfect"(完成比完美更好)

目前项目完成度比较高了(仅限接口层面)

性能方面做一些调整还是必要的

原文在这里

共收到 13 条回复 时间 点赞
花菜 #15 · 2023年05月05日 Author
Karaser 回复

嗯嗯,Monaco 是非常强大的编辑器,只是我项目使用的地方不多,就换成体积更小的呢

花菜 回复

没恶意,只是 Monaco 的功能还是比较丰富的,可能不是所有场景都能把它替换掉。

花菜 #13 · 2023年05月04日 Author
Karaser 回复

怎么说,达到相同的效果,但是资源占用降低了。算不算优化呢?
这个问题也有童鞋提过,但我个人觉得算是优化。
当然这不是那么的高大上,比如用 rust 重写啥 js 组件之类的。

虽然问 gpt 还挺有意思的,但是换了个工具也叫优化嘛😂

花菜 #11 · 2023年04月29日 Author
陈恒捷 回复

感谢指导和批评。我另外写了一篇文章作出改进
https://testerhome.com/topics/36370

思路挺不错,每个步骤也很清晰,感谢分享

但恕我直言,标题 13 倍这个数据,有点太标题党了。。。这个优化主要是 js 瘦身了 0.4mb 左右,实际加载时间上提升应该不大明显。建议标题还是严谨一些吧。

是不是应该要加一些 sdk 采集加载速度情况,针对加载速度慢的瓶颈点进行优化,更容易出效果?比如 js 由于上行带宽限制导致人多时慢,是不是更适合上 cdn,或者拆分 + 按需加载来解决?

花菜 将本帖设为了精华贴 04月28日 10:59

教科书般的优化示例。😆

0x7C00 回复

感谢回复,后续试试增加 compression-webpack-plugin
目前 Nginx 已经加了,gzip 不然真的太慢
这个配置是参考别人的,用下来效果提升是比较明显

刚好之前也遇到过前端加载非常慢问题,经过优化也有几倍提升,也在此一同分享下。

  1. 如果 js 过大,而又必须使用,可以考虑异步。 vue3 中对于组件的导入可以使用 defineAsycComponent(() => import('@/components/xxx'))
  2. 如果是 nginx 代理,可以考虑开启以下配置:
# 开启gzip
gzip on;
# 启用gzip压缩的最小文件小于设置值的文件将不会压缩
gzip_min_length 1k;
# 设置压缩所需要的缓冲区大小
gzip_buffers 16 64k;
# 设置gzip压缩针对的HTTP协议版本
gzip_http_version 1.1;
# gzip 压缩级别1-9数字越大压缩的越好也越占用CPU时间
gzip_comp_level 3;
gzip_types text/plain application/x-javascript application/javascript text/javascript text/css application/xml application/x-httpd-php image/jpeg image/gif image/png;
# 是否在http header中添加Vary: Accept-Encoding建议开启

同时项目中配置

vue.config.js
const CompressionWebpackPlugin = require('compression-webpack-plugin');
// 定义压缩文件类型
const productionGzipExtensions = ['js', 'css']

留下个疑问,之前前端项目在 vue2 的时候访问特别慢,链接路径也打不开,后面升级到 vue3,再经过以上优化快很多,不是专业前端开发,所以也搞不懂是不是 vue2 自己使用的姿势不对?

作为菜鸡的我表示,长见识了。

3楼 已删除

如果你有更多的前端知识,欢迎留言一起沟通哦

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册