淘宝大促前转化下降 (淘宝大促转化低)

淘宝大促价格策略,淘宝大促前转化下降

作者:森郎

转发链接:https://mp.weixin.qq.com/s/8kKVOHBxyrOvE054ELlM_Q

前言

作为一名前端工程师,更高的性能、更流畅的体验是长久不变的追求目标。而作为大促锋线,会场页面的性能表现直接影响了亿万消费者的购买体验。上一篇《细聊 618 大促背后的淘系前端技术体系》,那么在今年的天猫618,我们是如何让消费者们在各个会场中能够逛的放心、挑的称心、买的开心呢?

本文将简要介绍今年的618,我们是如何通过缓存优化、请求优化等方案来应对性能挑战,并如何通过监控测试等手段来保障大规模的会场页面的性能。

变化与挑战

今年的618大促,在终端渲染方案上,淘系营销活动团队与终端架构团队深入合作,第一次大规模在会场域落地了PHA(Progressive Hybrid App)方案,并在主会场使用了web方案。这一变化对页面的资源加载、执行耗时都带来了挑战。而在业务玩法上,今年的会场在内容化、本地化等方向发力,短视频、红人直播等在H5页面上同层*放播**,这对页面的内存占用等提出了一定的要求。

淘宝大促价格策略,淘宝大促前转化下降

说到挑战,首先,新用户、低端机、弱网络等在大促期间的占比明显增加,带来了较大的劣化长尾影响。其次,天猫、淘宝的小二们在618期间创建了大量的会场页面,如何在大规模的体量下仍然整体保持高性能水位,这对业务配套的检测监控方案也提出了一定的要求。

方案详解

在性能优化的落地过程中,我们根据会场页面的前端时序(如下图所示),将会场的性能优化拆分为了资源加载、数据请求、模块渲染等环节。

淘宝大促价格策略,淘宝大促前转化下降

当前的会场所使用的渲染方案是一套页面、模块、数据相分离的异步式方案。在资源请求上,可分为三个部分:一是HTML文档(不同页面之间相同),二是包含了rax、loader、render等在内的基础JS(不同页面之间相同),三是页面所使用的各个UI模块的JS+CSS资源(不同页面之间不同)。数据请求由页面的render统一发起,并在数据网关层将当前页面的不同模块的商品列表、店铺信息等数据在组装后合并返回。

淘宝大促价格策略,淘宝大促前转化下降

结合上述的变化挑战与实际线上的性能情况,今年618会场的性能保障方案可主要概括为上图的三个环节。下面将简要介绍各个环节的策略与实现。

▐ 资源请求优化

✎ 页面预缓存

在手机淘宝、天猫等app内,我们利用了端侧提供的静态资源缓存方案,将HTML和基础JS等资源,推送下发至客户端。在客户端的webview请求资源时,端侧可根据域名来匹配已下发的缓存包,在匹配成功后直接从本地缓存中读取对应的HTML和JS资源,而无需每次都请求网络、大大缩短了页面的初始化时间。例如,主会场的html加载耗时在推送缓存后可平均减少70+%、命中率可达到97%。

✎ 模块资源缓存

模块的JS+CSS资源,因为不同页面所使用的模块不同(例如男装会场和家装会场),并且总计有上百个模块,无法做到全量的提前缓存。这里我们通过捞取top流量页面的方式,仅将首屏相关的核心模块做了模块缓存下发,较好的缓解了模块请求的耗时。

✎ 模块按需加载

除了刚提到的模块缓存下发,今年的618会场还通过“模块按需加载”的优化方式,最小化的控制了当前页面的模块数量,这对首屏的JS资源请求、数据请求都有一定的缩减。在实现方案上,通过在数据网关层先读取服务端所缓存的定向投放条件,判断当前访问的URL参数、客户端信息等是否满足模块的展示条件(例如,搜索框模块仅在手淘内才展示)。不满足条件时,则直接从页面中移除这一模块。例如,在外部浏览器里打开618超酷数*会码**场时,页面所加载的JS资源大小可因此减少40+%。

淘宝大促价格策略,淘宝大促前转化下降

▐ 数据请求优化

为了给消费者们推荐最贴心的好物,现在的大促会场使用的更多是千人千面、个性化的算法推荐数据。但推荐所带来的算法耗时增加,使得数据请求成为了当前会场性能的耗时最长板。如果能够降低当前会场的数据请求耗时,那么首屏时间也会随之明显减少。

所以在今年的618会场中,我们落地了一套基于线上实时埋点的请求优化方案,通过更精简的首屏模块数量来实现了对首屏接口耗时的直接优化。

在方案中,通过采样上报的方式获取到了模块高度,并结合设备信息、页面模块排序、个性化数据等条件,个性化的控制了每次访问的首屏模块加载数量。例如,小明在访问数*会码**场时只需要加载5个模块,而小强只需要加载4个模块。以线上RT情况为例,针对于单个会场,方案可使得首屏耗时平均减少100+ms。

▐ 监控检测

这次的618使用了两套检测机制来保障会场性能。第一套是模块级检测,通过与H5自动化测试平台等打通,批量化的对所有大促模块进行了性能检测,从中发现了例如部分模块的引用图片未压缩、资源域名未收敛等问题。

淘宝大促价格策略,淘宝大促前转化下降

第二套则是页面级检测,在小二们完成了会场页面的配置填写后,批量化的对所有的618会场进行了自动检测,使得一些页面加载、数据请求、模块渲染等相关性能问题,可在上线前得以被发现和修复。

而性能监控上,与双11整体保持一致,今年618使用了一套接近于FMP的性能指标,以自定义采集上报的方式、联动前端监控平台,实现了分钟级的性能看板,帮助我们更快的发现线上性能问题、并作出针对性的调整。

▐ 降级策略

同层*放播**组件的引入对会场页面的内存占用提出了较高的要求,尤其是低端机、老系统等。针对这个问题,今年的618会场域统一接入了客户端所提供的降级平台,可直接根据机型、系统版本、客户端版本等条件动态的执行降级策略。例如,可设置在手淘版本≤9.5.0 + iOS版本≤10时不*放播**商品短视频等等。

今年的618会场,线上整体稳定性良好,未出现因会场内存占用过高而导致的客户端crash飙高情况。

整体回顾

性能优化,功在平时,成在大促。在今年的618大促中,通过上述的优化方案和保障手段,最终达成了预期的体验目标。

淘宝大促价格策略,淘宝大促前转化下降

但在过程中,也发现了一些可继续深挖的性能优化点。例如,可以结合端智能等客户端的能力帮助大促主会场提前完成页面数据、依赖资源的预加载,甚至是页面的预渲染。我们会在后面的一场场大促中持续迭代优化,为消费者们提供没有最好、只有更好的购物体验。

总结

618,这一场持续了20多天的年中促销活动,对于亿万消费者们来说是一场狂欢盛宴,而对于在背后默默支撑这一场大促的所有工程师们,则更像是一场极客马拉松,痛并快乐着。

推荐JavaScript学习相关文章

《使用Canvas实现一个在线发牌游戏「附源码」》

《基于Canvas实现的高斯模糊(上)「JS篇」》

《基于Canvas实现的高斯模糊(下)「JS篇」》

《由浅入深,66条JavaScript面试知识点(一)》

《由浅入深,66条JavaScript面试知识点(二)》

《由浅入深,66条JavaScript面试知识点(三)》

《由浅入深,66条JavaScript面试知识点(四)》

《由浅入深,66条JavaScript面试知识点(五)》

《由浅入深,66条JavaScript面试知识点(六)》

《由浅入深,66条JavaScript面试知识点(七)》

《为什么 setTimeout 有最小时延 4ms ?》

《如何处理 Node.js 中出现的未捕获异常?》

《Angular v10.0.0 正式发布,不再支持 IE9/10》

《基于 Docker 的 SSR 持续开发集成环境实践》

《细聊图解webpack 指南手册》

《一文带你彻底搞懂 NPM 知识点「进阶篇」》

《细聊webpack性能优化面面观》

《JS实现各种日期操作方法汇总》

《「实践」细聊前端性能优化总结》

《「实践」浏览器中的画中画(Picture-in-Picture)模式及其 API》

《「多图」一文带你彻底搞懂 Web Workers (上)》

《「多图」一文带你彻底搞懂 Web Workers (中)》

《深入细聊前端*载下**总结「干货」》

《细品西瓜*放播**器功能分析(上)「实践」》

《细品西瓜*放播**器功能分析(下)「实践」》

《细聊50道JavaScript基础面试题「附答案」》

《webpack4主流程源码解说以及动手实现一个简单的webpack(上)》

《webpack4主流程源码解说以及动手实现一个简单的webpack(下)》

《细聊前端架构师的视野》

《细聊应用场景再谈防抖和节流「进阶篇」》

《前端埋点统一接入方案实践》

《细聊微内核架构在前端的应用「干货」》

《一种高性能的Tree组件实现方案「干货」》

《进击的JAMStack》

《前后端全部用 JS 开发是什么体验(Hybrid + Egg.js经验分享)上》

《前后端全部用 JS 开发是什么体验(Hybrid + Egg.js经验分享)中》

《前后端全部用 JS 开发是什么体验(Hybrid + Egg.js经验分享)下》

《一文带你搞懂 babel-plugin-import 插件(上)「源码解析」》

《一文带你搞懂 babel-plugin-import 插件(下)「源码解析」》

《JavaScript常用API合集汇总「值得收藏」》

《推荐10个常用的图片处理小帮手(上)「值得收藏」》

《推荐10个常用的图片处理小帮手(下)「值得收藏」》

《JavaScript 中ES6代理的实际用例》

《12 个实用的前端开发技巧总结》

《一文带你搞懂搭建企业级的 npm 私有仓库》

《教你如何使用内联框架元素 IFrames 的沙箱属性提高安全性?》

《细说前端开发UI公共组件的新认识「实践」》

《细说DOM API中append和appendChild的三个不同点》

《细品淘系大佬讲前端新人如何上王者「干货」》

《一文带你彻底解决背景跟随弹窗滚动问题「干货」》

《推荐常用的5款代码比较工具「值得收藏」》

《Node.js实现将文字与图片合成技巧》

《爱奇艺云剪辑Web端的技术实现》

《我再也不敢说我会写前端 Button组件「实践」》

《NodeX Component - 滴滴集团 Node.js 生态组件体系「实践」》

《Node Buffers 完整指南》

《推荐18个webpack精美插件「干货」》

《前端开发需要了解常用7种JavaScript设计模式》

《浅谈浏览器架构、单线程js、事件循环、消息队列、宏任务和微任务》

《了不起的 Webpack HMR 学习指南(上)「含源码讲解」》

《了不起的 Webpack HMR 学习指南(下)「含源码讲解」》

《10个打开了我新世界大门的 WebAPI(上)「实践」》

《10个打开了我新世界大门的 WebAPI(中)「实践」》

《10个打开了我新世界大门的 WebAPI(下)「实践」》

《「图文」ESLint 在中大型团队的应用实践》

《Deno是代码的浏览器,你认同吗?》

《前端存储除了 localStorage 还有啥?》

《Javascript 多线程编程​的前世今生》

《微前端方案 qiankun(实践及总结)》

《「图文」V8 垃圾回收原来这么简单?》

《Webpack 5模块联邦引发微前端的革命?》

《基于 Web 端的人脸识别身份验证「实践」》

《「前端进阶」高性能渲染十万条数据(时间分片)》

《「前端进阶」高性能渲染十万条数据(虚拟列表)》

《图解 Promise 实现原理(一):基础实现》

《图解 Promise 实现原理(二):Promise 链式调用》

《图解 Promise 实现原理(三):Promise 原型方法实现》

《图解 Promise 实现原理(四):Promise 静态方法实现》

《实践教你从零构建前端 Lint 工作流「干货」》

《高性能多级多选级联组件开发「JS篇」》

《深入浅出讲解Node.js CLI 工具最佳实战》

《延迟加载图像以提高Web网站性能的五种方法「实践」》

《比较 JavaScript 对象的四种方式「实践」》

《使用Service Worker让你的 Web 应用如虎添翼(上)「干货」》

《使用Service Worker让你的 Web 应用如虎添翼(中)「干货」》

《使用Service Worker让你的 Web 应用如虎添翼(下)「干货」》

《前端如何一次性处理10万条数据「进阶篇」》

《推荐三款正则可视化工具「JS篇」》

《如何让用户选择是否离开当前页面?「JS篇」》

《JavaScript开发人员更喜欢Deno的五大原因》

《仅用18行JavaScript实现一个倒数计时器》

《图文细说JavaScript 的运行机制》

《一个轻量级 JavaScript 全文搜索库,轻松实现站内离线搜索》

《推荐Web程序员常用的15个源代码编辑器》

《10个实用的JS技巧「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(一)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(二)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(三)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(四)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(五)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(六)「值得收藏」》

《深入JavaScript教你内存泄漏如何防范》

《手把手教你7个有趣的JavaScript 项目-上「附源码」》

《手把手教你7个有趣的JavaScript 项目-下「附源码」》

《JavaScript 使用 mediaDevices API 访问摄像头自拍》

《手把手教你前端代码如何做错误上报「JS篇」》

《一文让你彻底搞懂移动前端和Web 前端区别在哪里》

《63个JavaScript 正则大礼包「值得收藏」》

《提高你的 JavaScript 技能10 个问答题》

《JavaScript图表库的5个首选》

《一文彻底搞懂JavaScript 中Object.freeze与Object.seal的用法》

《可视化的 JS:动态图演示 - 事件循环 Event Loop的过程》

《教你如何用动态规划和贪心算法实现前端瀑布流布局「实践」》

《可视化的 js:动态图演示 Promises & Async/Await 的过程》

《原生JS封装拖动验证滑块你会吗?「实践」》

《如何实现高性能的在线 PDF 预览》

《细说使用字体库加密数据-仿58同城》

《Node.js要完了吗?》

《Pug 3.0.0正式发布,不再支持 Node.js 6/8》

《纯JS手写轮播图(代码逻辑清晰,通俗易懂)》

《JavaScript 20 年 中文版之创立标准》

《值得收藏的前端常用60余种工具方法「JS篇」》

《箭头函数和常规函数之间的 5 个区别》

《通过发布/订阅的设计模式搞懂 Node.js 核心模块 Events》

《「前端篇」不再为正则烦恼》

《「速围」Node.js V14.3.0 发布支持顶级 Await 和 REPL 增强功能》

《深入细品浏览器原理「流程图」》

《JavaScript 已进入第三个时代,未来将何去何从?》

《前端上传前预览文件 image、text、json、video、audio「实践」》

《深入细品 EventLoop 和浏览器渲染、帧动画、空闲回调的关系》

《推荐13个有用的JavaScript数组技巧「值得收藏」》

《前端必备基础知识:window.location 详解》

《不要再依赖CommonJS了》

《犀牛书作者:最该忘记的JavaScript特性》

《36个工作中常用的JavaScript函数片段「值得收藏」》

《Node + H5 实现大文件分片上传、断点续传》

《一文了解文件上传全过程(1.8w字深度解析)「前端进阶必备」》

《【实践总结】关于小程序挣脱枷锁实现批量上传》

《手把手教你前端的各种文件上传攻略和大文件断点续传》

《字节跳动面试官:请你实现一个大文件上传和断点续传》

《谈谈前端关于文件上传*载下**那些事【实践】》

《手把手教你如何编写一个前端图片压缩、方向纠正、预览、上传插件》

《最全的 JavaScript 模块化方案和工具》

《「前端进阶」JS中的内存管理》

《JavaScript正则深入以及10个非常有意思的正则实战》

《前端面试者经常忽视的一道JavaScript 面试题》

《一行JS代码实现一个简单的模板字符串替换「实践」》

《JS代码是如何被压缩的「前端高级进阶」》

《前端开发规范:命名规范、html规范、css规范、js规范》

《【规范篇】前端团队代码规范最佳实践》

《100个原生JavaScript代码片段知识点详细汇总【实践】》

《关于前端174道 JavaScript知识点汇总(一)》

《关于前端174道 JavaScript知识点汇总(二)》

《关于前端174道 JavaScript知识点汇总(三)》

《几个非常有意思的javascript知识点总结【实践】》

《都2020年了,你还不会JavaScript 装饰器?》

《JavaScript实现图片合成*载下**》

《70个JavaScript知识点详细总结(上)【实践】》

《70个JavaScript知识点详细总结(下)【实践】》

《开源了一个 JavaScript 版敏感词过滤库》

《送你 43 道 JavaScript 面试题》

《3个很棒的小众JavaScript库,你值得拥有》

《手把手教你深入巩固JavaScript知识体系【思维导图】》

《推荐7个很棒的JavaScript产品步骤引导库》

《Echa哥教你彻底弄懂 JavaScript 执行机制》

《一个合格的中级前端工程师需要掌握的 28 个 JavaScript 技巧》

《深入解析高频项目中运用到的知识点汇总【JS篇】》

《JavaScript 工具函数大全【新】》

《从JavaScript中看设计模式(总结)》

《身份证号码的正则表达式及验证详解(JavaScript,Regex)》

《浏览器中实现JavaScript计时器的4种创新方式》

《Three.js 动效方案》

《手把手教你常用的59个JS类方法》

《127个常用的JS代码片段,每段代码花30秒就能看懂-【上】》

《深入浅出讲解 js 深拷贝 vs 浅拷贝》

《手把手教你JS开发H5游戏【消灭星星】》

《深入浅出讲解JS中this/apply/call/bind巧妙用法【实践】》

《手把手教你全方位解读JS中this真正含义【实践】》

《书到用时方恨少,一大波JS开发工具函数来了》

《干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React)》

《手把手教你JS 异步编程六种方案【实践】》

《让你减少加班的15条高效JS技巧知识点汇总【实践】》

《手把手教你JS开发H5游戏【黄金矿工】》

《手把手教你JS实现监控浏览器上下左右滚动》

《JS 经典实例知识点整理汇总【实践】》

《2.6万字JS干货分享,带你领略前端魅力【基础篇】》

《2.6万字JS干货分享,带你领略前端魅力【实践篇】》

《简单几步让你的 JS 写得更漂亮》

《恭喜你获得治疗JS this的详细药方》

《谈谈前端关于文件上传*载下**那些事【实践】》

《面试中教你绕过关于 JavaScript 作用域的 5 个坑》

《Jquery插件(常用的插件库)》

《【JS】如何防止重复发送ajax请求》

《JavaScript+Canvas实现自定义画板》

《Continuation 在 JS 中的应用「前端篇」》

作者:森郎

转发链接:https://mp.weixin.qq.com/s/8kKVOHBxyrOvE054ELlM_Q