神族九帝's blog 神族九帝's blog
首页
网盘 (opens new window)
线报 (opens new window)
商城 (opens new window)
  • 复习指导
  • HTML
  • CSS
  • JavaScript
  • 设计模式
  • 浏览器
  • 手写系列
  • Vue
  • Webpack
  • Http
  • 前端优化
  • 项目
  • 面试真题
  • 算法
  • 精选文章
  • 八股文
  • 前端工程化
  • 基础篇
  • 进阶篇
  • 高级篇
  • 计算机基础
  • 高频考点
  • 精简题
  • 综合问题
  • 复习题
  • vue
  • vue2源码学习
  • 剖析vuejs内部运行机制
  • TypeScript 入门实战笔记
  • vue3源码学习
  • 2周刷完100道前端优质面试真题
  • npm发包
  • 重学node
  • 前端性能优化方法与实战
  • webpack原理与实战
  • webGl
  • 前端优化
  • Web3
  • 更多
  • 网站
  • 资源
  • Vue资源
  • 收藏的一些API
  • 未来要做的事
  • 宝塔面板+青龙面板
  • 安卓手机当服务器使用
  • 京东自动评价代码
  • 搭建x-ui免流服务器(已失效)
  • 海外联盟
  • 好玩的docker
  • 导航
GitHub (opens new window)

神族九帝,永不言弃

首页
网盘 (opens new window)
线报 (opens new window)
商城 (opens new window)
  • 复习指导
  • HTML
  • CSS
  • JavaScript
  • 设计模式
  • 浏览器
  • 手写系列
  • Vue
  • Webpack
  • Http
  • 前端优化
  • 项目
  • 面试真题
  • 算法
  • 精选文章
  • 八股文
  • 前端工程化
  • 基础篇
  • 进阶篇
  • 高级篇
  • 计算机基础
  • 高频考点
  • 精简题
  • 综合问题
  • 复习题
  • vue
  • vue2源码学习
  • 剖析vuejs内部运行机制
  • TypeScript 入门实战笔记
  • vue3源码学习
  • 2周刷完100道前端优质面试真题
  • npm发包
  • 重学node
  • 前端性能优化方法与实战
  • webpack原理与实战
  • webGl
  • 前端优化
  • Web3
  • 更多
  • 网站
  • 资源
  • Vue资源
  • 收藏的一些API
  • 未来要做的事
  • 宝塔面板+青龙面板
  • 安卓手机当服务器使用
  • 京东自动评价代码
  • 搭建x-ui免流服务器(已失效)
  • 海外联盟
  • 好玩的docker
  • 导航
GitHub (opens new window)
  • vue2源码学习

  • 剖析vuejs内部运行机制

  • TypeScript 入门实战笔记

  • vue3源码学习

  • 2周刷完100道前端优质面试真题

  • npm发包

  • 重学node

  • 前端性能优化方法与实战

    • 00 开篇词 开启刻意练习之路,进阶前端性能技术专家
    • 01 体系总览:性能优化体系及关键指标设定
    • 02 性能瓶颈点:从 URL 输入到页面加载整过程分析
    • 03 案例分析:移动端 M 站性能优化落地注意事项
      • 04 指标采集:首屏时间指标采集具体办法
      • 05 指标采集:白屏、卡顿、网络环境指标采集方法
      • 06 工具实践:性能 SDK 及上报策略设计
      • 07 平台实践:如何从 0 到 1 搭建前端性能平台
      • 08 诊断清单:如何实现监控预警并进行问题诊断
      • 09 优化手段:首屏秒开的 4 重保障
      • 10 优化手段:白屏 300m 和界面流畅优化技巧
      • 11 工具实践:如何进行性能专项测试
      • 12 理论分析:Hybrid 下的性能优化整体分析
      • 13 高级进阶:保证首次加载为秒开的离线包设计
      • 14 高级进阶:瞒天过海的骨架屏及 SSR 优化手段
      • 15 高级进阶:WebView 层及代码架构层面优化
      • 16 黑科技:详解预请求、预加载及预渲染机制
      • 17 横向对比:百度、阿里云、美团性能方案对比
      • 18 性能演进:RN、Flutter、小程序和 Enhance Hybrid
      • 19 成长之路:前端技术专业能力与业务产出平衡
      • 20 结束语 开启性能优化实践之路
    • webpack原理与实战

    • webGl

    • 前端优化

    • Web3

    • 更多

    • 学习笔记
    • 前端性能优化方法与实战
    wu529778790
    2021-09-20

    03 案例分析:移动端 M 站性能优化落地注意事项

    2014 年底我刚刚入职 58 同城,高级总监有一天找到我说,咱们性能问题经常出现,能不能给优化一下。刚开始我的想法是,天下武功,唯快不破,召集几个高 T,短平快解决掉问题。

    很快我发现这个任务很模糊,现在性能是怎样的,不清楚,也没法量化,而要让这个任务清晰,需要搭建一个性能监控平台,而搭建性能监控平台,不单需要前端团队去开发,还需要和数据组一起协作,对性能采集数据做统计分析,想到这些,我瞬间头大了。

    根据多年工作经验,我意识到,性能优化,无论在哪个公司都属于跨团队的事情。比如,我当时就需要房产和招聘这两个业务部门,以及前端和后端这两个职能团队的支持。为了确保目标清晰、一致,也为了协作顺利,快速完成任务,我们专门成立了一个项目组进行性能立项和实施。

    这一讲呢,我就以当时的这个案例来为你介绍下,除了必要的优化技术手段,在性能优化整个过程中,我们需要注意些什么问题。

    性能立项

    性能立项就是通过成立一个项目组,用项目化的运作方式来解决性能问题。整个立项流程包括团队成员确定、技术调研开展、项目目标制定、获取业务侧支持、项目名字选定,需求范围和优先级确定等过程。

    不知道你有没有发现,这个立项不是先定需求范围和优先级,然后再制定项目目标和成立项目团队。为什么呢?

    因为这个性能优化项目,是探索性的项目需求。

    探索性项目需求,有别于日常的业务项目。业务项目一般都有明确的项目目标和需求修改范围。比如,修改首页金刚位模块,提升首页到列表页的转户率。这个项目,需求文档和 UI 图会给出具体模块修改点、样式、内容等,前端开发完成后,产品和 UI 进行验收即可。而探索性项目需求,目标不确定,一般需要先选定项目团队,做完技术调研,才能确定出项目目标。

    因为探索性项目需求中的项目目标制定、获取业务侧支持、项目立项时机这三点和常规项目不太一样,下面我就为你重点介绍一下。

    项目目标制定

    性能项目的目标制定是一个正推和反推结合的过程。

    正推是指,从线索 -> 本质或痛点问题 -> 解决方案 -> 目标。我们寻找到项目线索,找到性能具体问题,试验了解决方案,得到一个结果。

    这个项目中,最终项目首屏时间可以减少 10%,对应 VPPV 可以提升 3%。但是我判断,3%的收入提升这个结果对公司来说,吸引力不够,因为平时波动都有 2%,要达成一个“性感”的目标,至少需要提升 10%的收入提升。

    什么叫 VPPV 呢?VPPV 就是详情页的 UV 除以列表页的 PV,这个指标和最终收入正相关,通俗一点来说就是,来店里的用户中,有多少最后买了东西。为了方便介绍,这里我省去了VPPV 到广告收入的转化过程,用 VPPV 代替收益。

    那么,怎么实现 10% 的收入提升呢?这时候就需要反推的过程。

    什么叫反推呢?这是它的过程:从目标->解决方案->本质或痛点->线索。想要 10% 的收入提升(VPPV),至少需要 30% 的性能提升,对应的方案、问题痛点、性能线索都要能支持这个结果。

    最后,我把正推和反推结合起来就能得出一个目标,即通过性能提升 30%,实现收入提升 10%。

    获取业务侧支持

    项目目标制定完,接下来就是如何说服业务侧支持这个项目。因为前端团队一般都投入在各个业务方向,要做性能优化,就需要说服业务将部分前端资源投到这个性能优化项目上来。

    此时,为了评估值不值得花时间在这上面,前端同学会和你提到项目收益,比如,他会问,加载时间提升了多少,可以学习新技术 react hook,vue3等。

    一般业务同事想到项目收益,通常是流量增加多少、转化率提升多少,跳失率降低多少等。要想让对方理解性能优化项目的收益,我们就要了解业务的关注点,从业务的角度去思考,去回答。

    以这个项目为例,我们给项目起了名字叫奥林匹亚项目,更高更快更强的意思。

    有关它的预期收益,我们最初想的是,通过请求资源优化,将首屏时间提升 30%。后来为了让业务同事更直观理解项目收益,我们就把目标修改成了“通过性能提升 30%,提升页面 VPPV 10%”。

    业务看到后面一个目标很有共鸣,觉得我们不是为了自己做一个技术项目,而是实实在在想提升业务体验,帮助达成业务收入指标。

    立项时机

    看到这个小标题,你可能要问了,什么时候立项合适,这有什么讲的呀,不是项目之初就开始立项吗?

    对此,我的理解是,一定要先做好技术可行性调研,性能优化是横向项目,会涉及多个业务,最好在试点两个业务后,再正式立项。否则,会出现你用了一个列表页筛选优化的方案,适合 A 业务场景,却不适合 B 业务场景的问题。

    做完这些后,我们就可以正式开始立项了。以下是我们的立项信息。

    投入资源:前端 FE10 人,后端RD 4 人,UI设计 4 人,测试 2 人。
    投入价值:20 人,2 个月,40 人月,约 XXw。
    收获价值:访问量,VPPV 提升 10%,订单提升 8%,约 XXX 万美金/季度。

    立项完成后,接下来我们就可以去找性能线索,有针对性地去优化。此时,就需要依赖于性能监控预警平台。

    当时我们一开始也想过从 0 到 1 完整做一个性能监控平台,但因为时间和人力关系,只能作罢。最后,我们直接选取了一个运维同事已经在用的一个开源展示平台,来做数据展示,至于具体的数据指标定义和采集,就需要我们自己来做了。

    性能诊断优化

    有了性能监控平台,也有了性能数据,接下来就是结合页面加载过程,进行性能问题诊断和优化了。

    页面加载的性能瓶颈点在上一讲我已经介绍过了,在这里就不多说了。当时我们主要是通过本地缓存方案来减少客户端请求数,同时让运维同事对静态资源配置了合理的过期时间,实现静态资源的强缓存方案。另外还对页面做了 DNS 预解析处理,也对一些广告和帮帮页(58 同城的 WebIM 应用,用于用户的咨询使用)做了懒加载。

    为了确保页面解析不会中断,我们还对列表页的加载资源做了处理,也制定了 CSS 相关的规范,确保嵌套层次更少,让规则解析更简单。原先列表页的筛选功能使用的是同步技术,每次完成筛选,整个页面都需要重新加载一次,这一次我们把它修改成了 SPA 单页面应用,每次筛选后,只请求数据接口即可,不用整个页面都请求。

    现在回过头来看,列表页改成单页面应用的方案,对我们最终 VPPV 的提升贡献最大,且在当时的情况下,属于比较前沿的解决方案。而弱网下的性能优化,当时我们花了很长时间才发现问题原因,它是当时的一个难点,也是前端优化中的盲区。所以,接下来我向你重点介绍一下这两个。

    列表页改单页面应用

    列表页主要用来展示分类下的列表信息,根据用户的筛选项,将搜索结果展示给用户。

    把列表页改成单页面,面临的第一个难题就是 VUE/React 还处于早期阶段,贸然给业务同事使用,会趟不少坑。还有就是,这些页面都在搜索引擎和其他 App 做了广告投放,需要考虑 SEO, 也就是说,URL 要和原来的页面保持一致的同时,支持爬虫够抓取和解析。

    我调研过程中发现,与直接切换 VUE/React 技术栈相比,现有的列表页模板修改成单页面应用,风险上要小很多,所以最终采用的是列表页模板的单页面实现。

    另外我还发现,浏览器的 History API 方案刚好能够支持单页面应用和原页面URL保持一致。具体来说,通过其中的 pushState 修改 URL 和历史记录,能确保筛选后的 URL 和原来保持一致,通过它的回退等功能操作,也可以回到上一个页面。

    对于SEO这块儿,为了确保爬虫能够抓取解析这个页面,如果页面逻辑和数据展现是通过JavaScript 动态获取加载数据,那么爬虫就无法解析抓取到的页面。为此,我额外提供了一套服务端模板,如果页面访问头是爬虫的话,就走服务端模板,反之如果是个人用户的话,就走单页面应用。

    弱网下性能优化

    当时上线前夕刚好遇到招聘业务,最后发现数据并不及预期,怎么回事呢?我们怎么测试都没发现问题,后来在家里 2G 网络下测试了一下,发现白屏了。问题是不是出在这里呢?

    接下来,我就针对用户网络分布做了网络测速,网络测速过程中,发现我们的弱网(2G、 3G)用户超过 50%。

    于是,接下来我们就针对弱网环境做了以下优化手段。

    • 因为弱网下一个请求都需要 2s,而原来的列表页数据接口请求大约26个请求,于是我们就尽可能合并请求,最后合并到了 11个。

    • 小图标采用 Base64 Encoding 的方式,内嵌于页面中,不用额外发网络请求来获取。

    • 针对弱网(特别是移动网络),不自动加载图片,只显示本占位图。

    通过以上优化方式后,首屏时间从 2.5s 提升到 1.5s。

    最后,还有一个教训就是,如果性能优化涉及多条业务线,最好是先把一条业务打透,确保收入数据确实提升了,再推广到其他业务。

    当时我们的性能优化涉及五条业务线:二手,房产,招聘,黄页,二手车。我在做优化的时候同时选了招聘和房产业务,结果因为一个问题,业务收入没有如预期的那样提升 10%,而是直接降低了 20%,并且是两条业务数据一起降,业务部门对此意见很大。

    我印象中每天晚上 12 点计算出统计数据后,发一封邮件告诉业务同学和老板,今天的数据是利好还是利空。如果是利空,还需要顶着业务同学压力,通过性能优化,把收入数据优化提升上去,这个过程中非常艰难。

    小结

    溪风的思维导图.png

    我们经过性能立项、性能采集和性能监控诊断,最后落实实施。到了这一步就结束了吗?不,还有几个点,还要思考:这个项目到底沉淀下来了什么,是造轮子还是为业务打下了坚厚的基建基础?

    当然,性能监控预警平台肯定是一个大的沉淀,但是除此之外呢?怎么确保一个新人,在做性能优化时也能做到 80 分的水平?所以,这就需要我们把那些优化过程中的最佳实践沉淀下来。

    未来如果有人 Review 这段代码,你希望学到什么?之前一个阿里的朋友,提到这个问题,他的回答是,希望有人抱拳说受教了。当时我们没有这么高的期望,只希望后来的同学看到这段代码时,别吐槽给留了一些坑。

    所以,我也希望,在实际工作当中,你在性能优化之后记得把经验沉淀下来,可以写成文档或代码。这一点记得我在第一讲的时候也提到过,在这里我再强调一下。

    好了讲完这些,给大家留一个问题。

    优化前后如何对比数据,如果我们只是对比上线前后的数据,怎么排除这段时间业务升级带来的影响?

    可以把答案写在评论区哦,下一讲我将介绍首屏时间指标采集。


    微信图片_20210218174704.png

    《大前端高薪训练营》

    12 个月打磨,6 个月训练,优秀学员大厂内推,点击报名,高薪有你!


    # 精选评论

    # **好:

    这个案例分析确实学到了,主要学到如何推动事情的这个方式,多谢

    # **5741:

    性能分析过程没有或者说细节太少,性能优化分析深度不足,这是我看完给的评价

    #     讲师回复:

        感谢反馈,让我了解到大家的期望,后续将持续改进。

    # **华:

    这节课程学到了何为立项,立项预研和成立阶段,以及立项之后的技术与业务部门的权衡利弊。关于最后的问题,希望老师有空解答一下

    #     讲师回复:

        有收获就好,点赞。本质上是要做AB测试,分50%流量到优化前版本,分50%流量到优化后版本,近期升级,AB版都要升,08讲有专门讲到

    # **6400:

    通过AB test 来实现?不过没想到具体的方案,求老师指点

    #     讲师回复:

        如果公司没有ABtest的方案,需要先从后端去实现这个方案,可以采用随机数取模的方式去做分流,纯前端的方案我们还在实现中,实现完可以和你沟通。

    # **亮:

    想要 10% 的收入提升(VPPV),至少需要 30% 的性能提升 这个结论是怎么推出来的呢

    #     讲师回复:

        这个是在我们业务根据转化率推算+实验得出的。和业务转化率,业务收入类型(如广告型业务)、业务当前性能现状有关。

    # **5741:

    学习新技术 react hook,vue3 和提高移动端M站的性能有什么必然关系?没看出来

    #     讲师回复:

        可能我没表达清楚,这里是想说,前端工程师普遍看重的项目收益来源于用了什么新技术,我希望的技术价值为业务创造了什么价值。

    # **娟:

    列表页模板的单页面实现可以具体说说吗?

    #     讲师回复:

        15年底借助h5 pushstate做的单页面模板,现在的话可以直接用vue了。

    编辑 (opens new window)
    上次更新: 2021/09/20, 16:50:45
    02 性能瓶颈点:从 URL 输入到页面加载整过程分析
    04 指标采集:首屏时间指标采集具体办法

    ← 02 性能瓶颈点:从 URL 输入到页面加载整过程分析 04 指标采集:首屏时间指标采集具体办法→

    最近更新
    01
    好玩的docker
    07-04
    02
    我的第一个NFT
    07-03
    03
    海外迅雷
    06-01
    更多文章>
    Power by vuepress | Copyright © 2015-2023 神族九帝
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    ×