Netflix 网站性能优化案例学习

简介: 本文主要给大家分享Netflix.com 桌面版是如何提升交互时间的,欢迎阅读。

image.png

原文作者:Addy Osmani

译者:UC 国际研发 Jothy


太长不看版:没有实现 Web 性能的万能武器。 简单的静态页面由于使用最小的 JavaScript 进行服务端渲染而快速展示。 在谨慎使用情况下,库可以为复杂页面提供巨大的价值。

本文主要给大家分享Netflix.com 桌面版是如何提升交互时间的,欢迎阅读。

Netflix 是最受欢迎的视频流服务之一。 自 2016 年在全球推出以来,该公司发现许多新用户不仅在移动端注册,而且还用了不太理想的网络连接。

通过改进 Netflix.com 注册过程的 JavaScript 和使用预获取(prefetch)技术,开发团队为移动和桌面用户提供了更好的用户体验以及多项改进。

加载和交互时间减少了 50%(对于 Netflix.com 上已注销的桌面主页)

由于从 React 和其他客户端库切换到原生 JavaScript,JavaScript 包大小减少了 200kB。 React 仍在服务器端使用。

预获取 HTML,CSS 和 JavaScript(React)将未来导航可交互时间缩短了 30%。

通过少传输 JS 来缩短交互时间

Netflix 开发者进行了性能优化的区域是注销后的主页,用户可以在该页上注册或登录该站点。

image.png

Netflix.com主页,适用于新用户和未登录的用户

该页面最初包含 300kB 的 JavaScript,其中一些是 React 和其他客户端代码(如 Lodash 等工具库),还有一些是保存 React 状态所需的上下文数据。

所有 Netflix 的网页都由 React 实现服务端渲染,生成 HTML,然后服务客户端应用,因此保持最新优化的主页结构就像保持一致的开发体验一样,都非常重要。

image.png

主页选项卡是最早使用 React 编写的组件示例

使用 Chrome 的 DevTools 和 Lighthouse 模拟在 3G 网络上加载的已退出(未登录)的主页,页面显示需要 7 秒才能加载出来,这对于一个简单的登录页面来说太长了,因此这部分的提升潜力得到了关注。 通过一些性能审计,Netflix 发现他们的客户端 JS 成本很高。

image.png

通过关闭浏览器中的 JavaScript 并观察网站的哪些元素仍然可以运行,开发团队可以确定已退出(未登录)主页是否真的需要 React 才能运行。

由于页面上的大多数元素都是基本 HTML,因此可以使用纯 JavaScript 替换 JavaScript 点击处理和类添加等其余元素。最初使用 React 构建的页面语言切换器被换成了不到 300 行的原生 JavaScript 代码重构。

移植到原生 JavaScript 的完整组件列表如下:

  • 基本互动(主页中间的标签)
  • 语言切换器
  • Cookie 横幅(适用于非美国访问者)
  • 用于分析的客户端日志
  • 性能测量和日志
  • 广告归因像素引导代码(出于安全原因而在 iFrame 中沙箱化)

image.png

尽管 React 的初始占用空间仅为 45kB,但删除了 React、客户端的几个库和相应的应用代码后,JavaScript 的总大小减少了超过 200kB,最终使 Netflix 已退出(未登录)主页的交互时间缩短了 50% 以上。

image.png

在实验室环境中,我们可以验证用户已能使用 Lighthouse(trace) 快速与 Netflix 主页进行交互。 桌面 TTI < 3.5s。

image.png

来自该领域的指标又是怎么样? 使用 Chrome 用户体验报告,我们可以看到首次输入延迟 - 从用户首次与网站互动到浏览器实际响应该互动的时间 - 对 97% 的桌面版 Netflix 用户来说很快。 这太棒了。

image.png

预取后续页面的 React

为了进一步提升用户浏览已退出(未登录)主页时的性能,Netflix 利用了用户在登录页上花费的时间来预获取用户可能进入的下一页的资源。

这是通过使用两种技术实现的 - 内置的 浏览器 API 和 XHR 预获取。

内置浏览器 API 包含页面头标记中的简单链接标记。 它向浏览器建议可以预取资源(例如 HTML,JS,CSS,图片),但它不能保证浏览器能实际获取到该资源,并且它缺乏其他浏览器的完全支持。

image.png

预取技术的比较

另一方面,XHR 预获取多年来一直是浏览器标准,当 Netflix 团队促使浏览器缓存资源时,其成功率达到 95%。 由于 XHR 预获取不能用于预获取 HTML 文档,因此 Netflix 使用它来预获取后续页面的 JavaScript 和 CSS。

注意:Netflix 的 HTTP 响应头配置阻止了使用 XHR 的 HTML 缓存(它们在第二页的 HTML 上没有缓存)。 Link Prefetch 正按预期工作,因为即使在某个点上没有缓存,它也可以在 HTML 上工作。

image.png

通过使用内置的浏览器 API 和 XHR 预取 HTML,CSS 和 JS,交互时间减少了 30%。 此实现不需要重写 JavaScript,也不会对已退出(未登录)主页的性能产生负面影响,因此它提供了一种有价值的工具,可以在极低风险的情况下提升页面性能。

image.png

实现预获取后,Netflix 开发人员通过分析页面上交互时间指标的减少,以及使用 Chrome 的开发者工具直接测量资源的缓存命中率来观察到了提升。

Netflix 已退出(未登录)主页 - 优化摘要

通过在 Netflix 已退出(未登录)主页上预获取资源以及优化客户端代码,Netflix 极大的提升了其注册过程中的交互时间指标。通过使用内置浏览器 API 和 XHR 预获取技术来预获取未来页面,Netflix 将交互时间缩短了 30%。这是对于二次加载而言,其中包含单页面应用注册流程的引导代码。

Netflix 团队进行的代码优化表明,虽然 React 是一个有用的库,但它可能无法为每个问题提供充分的解决方案。通过从第一个登录页面上的客户端代码中删除用于注册的 React 代码,交互时间的改进率提高了 50% 以上。减少客户端的交互时间也能使用户以更高的速率点击注册按钮,这表明代码优化可以带来更好的用户体验。

虽然 Netflix 没有在主页上使用 React,但他们为后续页面预获取了它。这使他们能够在单页面应用注册过程的其余部分中利用客户端 React。

有关这些优化的更多详细信息,请参阅 Tony Edwards 的 A+ 演讲:

https://www.youtube.com/watch?time_continue=1&v=V8oTJ8OZ5S0

结论

Netflix 通过密切关注 JavaScript 的成本,发现了改善交互时间的机会。 要了解你的网站是否有改进机会,请问问你的性能工具。

Netflix 做出的权衡是使用 React 对登录页面进行服务端渲染,同时也在其上预获取 React/其余注册流程的代码。 这样不仅可以优化首次加载性能,还可以优化其余注册流的加载时间,因为它是一个单页面应用,因此需要下载更大的 JS 包。

考虑是否利用原生 JavaScript 是网站中流量的选项。 如果你必须需要使用库,那么请尝试仅下载用户所需的代码。 预获取等技术有助于缩短未来页面导航的页面加载时间。

额外的提醒

Netflix 考虑使用 Preact,但对于交互性低的简单页面流而言,使用原生 JavaScript 对于它们的堆栈来说是一个更简单的选择。

Netflix 尝试使用 Service Workers 进行静态资源缓存。 当时,Safari 不支持该API(现在支持了),但他们正在再次探索。 Netflix 注册流程相比会员体验,需要对更多旧版浏览器支持。许多用户都会在较旧的浏览器上注册,但会在其原生移动应用或电视设备上观看 Netflix。

Netflix 登录页面非常动态化。 这是他们注册流程中最严格的 A/B 测试页面,它使用机器学习模型,根据位置,设备类型和许多其他因素来自定义消息和图像。 在近 200 个国家的支持下,每种衍生产品都存在不同的本地化,法律和价值信息传递挑战。 有关 A/B 测试的更多信息,请参阅 Ryan Burgess 的「 Testing Into A Better User Experience」。

感谢 Netflix UI 工程师,Tony Edwards,Ryan Burgess,Brian Holt,Jem Young,Kristofer Baxter(Google),Nicole Sullivan(Chrome)和 Houssein Djirdeh(Chrome)的评论和贡献。

目录
相关文章
|
5月前
|
数据采集 存储 缓存
SpringBoot与布隆过滤器的完美邂逅:高效防护大规模数据的奇妙结合【实战】
SpringBoot与布隆过滤器的完美邂逅:高效防护大规模数据的奇妙结合【实战】
228 0
|
2月前
|
开发框架 负载均衡 Java
当热门技术负载均衡遇上 Spring Boot,开发者的梦想与挑战在此碰撞,你准备好了吗?
【8月更文挑战第29天】在互联网应用开发中,负载均衡至关重要,可避免单服务器过载导致性能下降或崩溃。Spring Boot 作为流行框架,提供了强大的负载均衡支持,通过合理分配请求至多台服务器,提升系统可用性与可靠性,优化资源利用。本文通过示例展示了如何在 Spring Boot 中配置负载均衡,包括添加依赖、创建负载均衡的 `RestTemplate` 实例及服务接口调用等步骤,帮助开发者构建高效、稳定的应用。随着业务扩展,掌握负载均衡技术将愈发关键。
61 6
|
1月前
|
Cloud Native 安全 Java
Micronaut对决Spring Boot:谁是微服务领域的王者?揭秘两者优劣,选对框架至关重要!
【9月更文挑战第5天】近年来,微服务架构备受关注,Micronaut和Spring Boot成为热门选择。Micronaut由OCI开发,基于注解的依赖注入,内置多种特性,轻量级且启动迅速;Spring Boot则简化了Spring应用开发,拥有丰富的生态支持。选择框架需考虑项目需求、团队经验、性能要求及社区支持等因素。希望本文能帮助您选择合适的微服务框架,助力您的软件开发项目取得成功!
119 2
|
2月前
|
Java API UED
【实战秘籍】Spring Boot开发者的福音:掌握网络防抖动,告别无效请求,提升用户体验!
【8月更文挑战第29天】网络防抖动技术能有效处理频繁触发的事件或请求,避免资源浪费,提升系统响应速度与用户体验。本文介绍如何在Spring Boot中实现防抖动,并提供代码示例。通过使用ScheduledExecutorService,可轻松实现延迟执行功能,确保仅在用户停止输入后才触发操作,大幅减少服务器负载。此外,还可利用`@Async`注解简化异步处理逻辑。防抖动是优化应用性能的关键策略,有助于打造高效稳定的软件系统。
58 2
|
2月前
|
SQL 前端开发 关系型数据库
芋道框架万字详解(前后端分离)、若依框架、yudao-cloud保姆级攻略
芋道框架万字详解(前后端分离)、若依框架、yudao-cloud保姆级攻略
1864 4
|
2月前
|
Dubbo Java Nacos
【实战攻略】破解Dubbo+Nacos+Spring Boot 3 Native打包后运行异常的终极秘籍——从零开始彻底攻克那些让你头疼不已的技术难题!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但使用Dubbo+Nacos+Spring Boot 3进行GraalVM native打包后常遇运行异常。本文剖析此问题及其解决策略:确认GraalVM版本兼容性;配置反射列表以支持必要类和方法;采用静态代理替代动态代理;检查并调整配置文件;禁用不支持的功能;利用日志和GraalVM诊断工具定位问题;根据诊断结果调整GraalVM配置。通过系统排查方法,能有效解决此类问题,确保服务稳定运行。
81 0
|
4月前
|
前端开发 搜索推荐 Java
【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理,以及遇到的困难和总结
【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理,以及遇到的困难和总结
27 0
|
Java 微服务 Spring
Github星标百万!终于有人将Spring技术精髓收录成册
全面剖析Spring Framework核心特征及新增功能,助你轻松掌握Java企业级应用程序开发深入介绍Spring Boot高级功能,助你将微服务快速部署到云端
|
5月前
|
消息中间件 Java 网络架构
穿越消息之路:深入探讨Spring Integration的魅力
穿越消息之路:深入探讨Spring Integration的魅力
470 0
|
11月前
|
Java 程序员 Nacos
道德缺失。阿里内部Spring Cloud高薪笔记流失,GitHub夜获星百万
都说Java程序员工资高、涨薪快,但实际上我们大多数人都深知自己涨薪道路坎坷。眼看有的人一年翻一番,自己还在20k左右徘徊。 要想大幅度的涨薪,我们的首选大多都跳槽。只是跳槽有门槛,而且不能频繁跳,按照平跳来算,跳一次也就能涨20~30%,只有在跳进大厂的时候,你才可能会大幅度涨薪。