Instagram.com网站性能优化之路:第一部分

news/2024/5/19 8:25:21/文章来源:https://blog.csdn.net/m0_37411791/article/details/103046413

原文:https://instagram-engineering.com/making-instagram-com-faster-part-1-62cc0c327538

作者:Glenn Conner

翻译:奶爸码农

近年来,instagram.com发布了许多功能-我们推出了故事,过滤器,创建工具,通知和消息直递,以及许多其他功能和优化。但是,随着产品功能的增长,一个不幸的副作用是我们的网络性能开始下降。在过去的一年中,我们有意识地努力来改善这一状况。到目前为止,我们的不懈努力已使Feed页的加载时间累计提升了近50%。这一系列博客文章将概述我们为实现这些改进所做的一些工作。

确定正确的资源下载和执行的优先级,并减少页面加载期间的浏览器卡顿时间是提高Web应用程序性能的主要手段之一。在我们的案例中,其中许多类型的优化被证明比减小代码大小更为直接,减小代码大小通常影响很小,并且只有在进行了许多增量改进后才开始累加(尽管我们将在以后的文章中进行讨论)。它们对产品开发的破坏也较小,需要较少的代码更改和重构。因此,我们开始将精力集中在这一领域-资源预加载。

JavaScript, XHR, 和图片预加载

作为一般原则,我们希望尽早通知浏览器加载页面所需的资源。作为开发人员,我们经常提前知道我们将需要哪些资源,但是浏览器可能要等到页面加载过程的后期才意识到这些资源。这些资源主要包括那些由JavaScript动态获取的资源(其他脚本,图像,XHR请求等),因为浏览器只有先解析并执行一些其他JavaScript才能发现这些依赖资源。

无需等待浏览器自己发现这些资源,我们可以向浏览器提示它应该立即开始获取这些资源。我们这样做的方法是使用HTML预加载标签。他们看起来像这样:

<link rel="preload" href="my-js-file.js" as="script" type="text/javascript" />

在Instagram,我们将这些预加载提示用于关键页面加载路径上的两种资源:动态加载的JavaScript和预加载XHR GraphQL数据请求。动态加载的脚本是通过import('...')为特定客户端路由加载的脚本。我们维护服务器端入口点和客户端路由脚本之间的映射列表-因此,当我们在服务器端收到页面请求时,我们知道特定服务器端入口点将需要哪些客户端路由脚本,并且我们可以在渲染初始页面HTML时为这些特定于路由的脚本添加预加载。

例如,对于FeedPage入口点,我们知道客户端路由器最终将请求FeedPageContainer.js,因此可以添加以下内容:

<link rel="preload" href="/static/FeedPageContainer.js" as="script" type="text/javascript" />

同样,如果我们知道将为特定页面入口点发出特定的GraphQL请求,那么我们应该预加载该XHR请求。这一点特别重要,因为这些GraphQL查询有时可能会花费很长时间,并且在此数据获取之前无法展现页面。因此,我们希望服务器能够在页面生命周期中尽早返回数据。

<link rel="preload" href="/graphql/query?id=12345" as="fetch" type="application/json" />

在较慢的连接上,页面加载行为的优化更加明显。通过模拟的快速3G连接(下面的第一个加载瀑布流-没有任何预加载),我们看到FeedPageContainer.js及其关联的GraphQL查询仅在Consumer.js完成加载后才开始。但是,在进行预加载的情况下,只要页面HTML可用,FeedPageContainer.js及其GraphQL查询都可以开始加载。这也减少了加载任何非关键的延迟加载脚本的时间,这可以在第二个瀑布流中看到。这里,FeedSidebarContainer.js和ActivityFeedBox.js(取决于FeedPageContainer.js)几乎在Consumer.js完成之后立即开始加载。

预加载优先级的好处

除了可以更快地开始下载资源外,链接预加载还具有增加异步脚本下载的网络优先级的额外好处。这对于关键加载路径上的异步脚本而言非常重要,因为这些脚本的默认优先级为“低”。这意味着XHR请求和viewport中的图像将具有更高的网络优先级,而viewport之外的图像将具有相同的网络优先级。这可能导致呈现页面所需的关键脚本被阻止或必须与其他资源共享带宽。谨慎使用可以对我们希望浏览器在初始加载期间如何优先确定内容的优先级(如果我们知道应该优先分配哪些资源)进行控制。

预加载优先级的问题

预加载的问题在于,它提供的额外控制会带来额外条件,即正确设置资源优先级。例如,当在移动和wifi网络非常慢且丢包严重的地区进行测试时,我们注意到<link rel =“ preload” as =“ script”>脚本的网络请求的优先级高于script标记。关键页面呈现路径上的JavaScript捆绑包数量的增加,导致总页面加载时间增加。这源于我们在页面上布置预加载标签的方式。我们只是为将由客户端路由器作为当前页面的一部分异步下载的捆绑软件提供预加载提示。

<!-- preloaded async route bundles -->
<link rel="preload" href="SomeConsumerRoute.js" as="script" />
<link rel="preload" href="..." as="script" />
...
<!-- critical path scripts to load the initial page -->
<script src="Common.js" type="text/javascript"></script>
<script src="Consumer.js" type="text/javascript"></script>

在登出页面的示例中,我们在Common.js和Consumer.js之前过早下载(预加载)SomeConsumerRoute.js,并且由于预加载的资源以最高优先级下载但并未解析/编译,因此它们阻止了Common&Consumer能够开始解析/编译。Chrome数据保护程序团队还发现了预加载的类似问题,并在此处撰写了有关其解决方案的文章。在他们的情况下,他们选择始终将异步资源的预加载放在请求它们的资源的脚本标记之后。在我们的案例中,我们选择了一种稍微不同的方法。我们决定为所有脚本资源准备一个preload标签,并按照需要的顺序放置它们。这确保了我们能够尽早开始在页面中预加载所有脚本资源(包括直到将某些服务器端数据添加到页面之后才能呈现为HTML的同步脚本标签),并确保我们能够可以控制脚本资源加载的顺序。

<!-- preloaded critical path scripts -->
<link rel="preload" href="Common.js" as="script" />
<link rel="preload" href="Consumer.js" as="script" />
<!-- preloaded async route bundles -->
<link rel="preload" href="SomeConsumerRoute.js" as="script" />
...
<!-- critical path scripts to load the initial page -->
<script src="Common.js" type="text/javascript"></script>
<script src="Consumer.js" type="text/javascript"></script>
<script src="SomeConsumerRoute.js" type="text/javascript" async></script>

图片预加载

instagram.com上的主要页面之一是Feed,其中包含图片和视频的无限滚动Feed流。我们通过加载初始批次的帖子,然后在用户向下滚动Feed时加载其他批次来实现此目的。但是,我们不希望用户每次到达提要的底部时都等待(加载新一批帖子时),因此对于用户体验而言,在用户到达信息流底部之前,先加载新批次对于用户体验而言非常重要。

由于以下几个原因,在实践中很难做到这一点:

  • 我们不希望屏幕外批量加载占用用户当前正在查看的部分Feed的CPU和带宽优先级。

  • 我们不想过分地预加载内容,以免浪费用户带宽,而用户可能再也不需要向下滚动查看内容,但是另一方面,如果预加载不足,则用户经常会在信息流结尾阻塞 。

  • Instagram.com设计为可在各种屏幕尺寸和设备上使用,因此我们使用img srcset属性(可让浏览器根据用户屏幕尺寸决定使用哪种图像分辨率)来显示提要图像。这意味着确定要预加载的图像分辨率并不容易,并且存在预加载浏览器永远不会使用的图像的风险。

我们用于解决该问题的方法是构建一个优先任务,以处理异步工作的排队(在这种情况下,是下一批帖子的预加载)。预加载任务最初以空闲优先级排队(使用requestIdleCallback),因此除非浏览器未做任何其他重要工作,否则它不会开始。但是,如果用户滚动到离当前内容的末尾足够近的时候,我们将通过取消挂起的空闲回调并将此预加载任务立即触发,从而将该预加载任务的优先级提高到“高优先级”。

下一批帖子的JSON数据到达后,我们将对该预加载的一批帖子中的所有图像进行顺序的后台预加载排队。我们按照帖子在Feed流中显示的顺序(而不是并行显示)顺序预加载,以便我们可以优先下载和显示最接近用户Viewport的帖子中的图像。为了确保我们实际上预取了正确的图像大小,我们使用了一个隐藏的媒体预取组件,其尺寸与当前Feed匹配。该组件内部是一个,它使用srcset属性,与真实的Feed帖子相同。这意味着我们可以将图像的选择留给浏览器来预取,以确保它使用与渲染真实提要帖子时相同的逻辑来选择正确的图像,并且显示在媒体预取组件上。这也意味着,只要我们使用设置为与目标显示组件相同尺寸的媒体预取组件,就可以预取站点其他表面(例如,个人资料页面)上的图像。

这样做的综合效果是,将照片加载时间减少了25%(将Feed帖子添加到DOM和该帖子中的图像实际完全加载之间的时间),以及将用户在Feed的末尾等待下一页所花费的加载时间减少了56%。

写在最后

这是Instagram网址优化的第一部,在第二部分会介绍如何通过数据推送的方式提升性能,第三部分会介绍基于缓存优先进行渲染,第四部分会介绍优化代码大小和执行优化。请关注奶爸码农公众号,第一时间获得最新信息。

奶爸码农』从事互联网研发工作10+年,经历IBM、SAP、陆金所、携程等国内外IT公司,目前在美团负责餐饮相关大前端技术团队,定期分享关于大前端技术、投资理财、个人成长的思考与总结。

推荐阅读:

网站性能指标这么多,你到底选对了吗?

这里有几个编写JavaScript的进阶方法

手把手撸代码实现Virtual Dom && Diff

听听Vue.js作者尤雨溪如何比较前端三大框架

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_844842.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Instagram.com网站性能优化之路:第二部分 - 数据推送

近年来&#xff0c;Instagram发布了许多功能-我们推出了故事&#xff0c;过滤器&#xff0c;创建工具&#xff0c;通知和消息直递&#xff0c;以及许多其他功能和优化。但是&#xff0c;随着产品功能的增长&#xff0c;一个不幸的副作用是我们的网络性能开始下降。在过去的一年…

Instagram网站性能优化之路:第三部分 - 缓存优先

原文&#xff1a;https://instagram-engineering.com/making-instagram-com-faster-part-3-cache-first-6f3f130b9669作者&#xff1a;Glenn Conner翻译&#xff1a;奶爸码农近年来&#xff0c;Instagram发布了许多功能-我们推出了故事&#xff0c;过滤器&#xff0c;创建工具&…

Instagram.com网站性能优化之路:完结篇-代码大小和执行优化

近年来&#xff0c;Instagram发布了许多功能-我们推出了故事&#xff0c;过滤器&#xff0c;创建工具&#xff0c;通知和消息直递&#xff0c;以及许多其他功能和优化。但是&#xff0c;随着产品功能的增长&#xff0c;一个不幸的副作用是我们的网络性能开始下降。在过去的一年…

让网站更快、更可访问与更安全 - 这里有来自谷歌的新建议

这是奶爸码农第67篇原创文章&#xff0c;点击上方蓝字关注从6月30日到7月2日&#xff0c;Google的网络平台团队将Web.dev LIVE的网络社区召集在一起&#xff0c;这是一个在线技术分享活动&#xff0c;旨在讨论平台和工具生态系统的最新发展&#xff0c;使开发人员有机会相互交流…

aspnet网站开发实例_「前言」网站开发实例:公文处理系统(登记部分)一

需求分析与市场分析(简版)电子公文的归档工作是档案管理工作和电子政务建设的重要内容之一&#xff0c;电子公文归档系统作为一个连接办公自动化系统和数字档案管理系统的桥梁&#xff0c;在文档一体化管理体系中占据着重要位置。与传统纸质文档登记归档相比&#xff0c;电子公…

shell脚本监控网站,异常则进行邮件报警

服务器系统centos7.6 1、安装邮箱服务,一般服务器都已经安装了&#xff0c;查看是否安装。 yum list mailx rpm -qa | grep mail 查看是已经安装了。 未安装的执行命令安装即可。 yum -y install mailx 配置mail&#xff0c;配置文件路径/etc/mail.rc vim /etc/mail.rc 在尾部…

云上网站通用解决方案

在创业型公司或阿米巴模式经营的公司&#xff0c;新项目发布初期存在较大的不确定性&#xff0c;既要考虑项目未来的扩展性&#xff0c;又要衡量项目的运营成本。本解决方案为客户提供低成本&#xff0c;敏捷快捷的最佳实践。 典型行业&#xff1a;传统企业、游戏和零售等行业…

阿里云企业通用场景解决方案--企业建站

业务痛点及解决方案* 从企业前期筹备到创立初期&#xff0c;一站式服务为初创企业提供便利&#xff0c;让初创企业得到省心、省时、省钱的服务 阿里云解决方案 一站式提供从公司注册到财税法等各项代办服务&#xff0c;高效透明&#xff0c;省时省心。 解决方案简介 公司注…

搭建网站的简单粗暴方法概述

作者&#xff1a;fearlazy个人主页&#xff1a;fearlazy.com 对于不懂网站的人来说想要搭建自己的网站还是比较 困难的。好在现在很多东西都可以用现成的&#xff0c;这使得我们要搭建一个网站的时间成本大大降低了。在这里我们使用阿里云服务器wampserverzblog的组合方式简…

记网站由http改为https的几个步骤

环境&#xff1a;centos7 apache 1.申请证书 最新申请证书请参考&#xff1a;https://www.fearlazy.com/index.php/post/315.html 下载证书&#xff1a; 根据自己的web服务器选择下载即可。 2.上传证书到服务器 可以在web服务器程序目录下创建一个目录存放证书 mkdir /et…

微服务接入oauth2_分分钟让自己的网站接入 GitHub 第三方登录功能

今日干货刚刚发表查看:66666回复:666公众号后台回复 ssm&#xff0c;免费获取松哥纯手敲的 SSM 框架学习干货。OAuth2 和小伙伴们已经聊了很多了&#xff0c;咱们来一个实际点的案例练练手。这里我才用 GitHub 来做第三方登录。为什么是 GitHub 呢&#xff1f;有两方面考虑&…

求导数(导数计算器)网站 Derivative Calculator

Derivative Calculator 比如求x的平方的导数, 输入pow(x, 2), 点击go. 点击go, 然后会生成如下结果&#xff0c;包括了响应的函数图形.

LaTex常用技巧7:常用网站(公式和表格编辑器)

本文记录了本人编辑LaTex表格和公式常用的网站&#xff1a; 表格编辑器公式编辑器表格编辑器 网站1&#xff1a; 表格 编辑和生成器 支持LaTex Markdown多种格式 跟Markdown LaTex csv sql等和表格相关的都可以在这个网站里面找到。TableConvert 网站2&#xff1a; Tables G…

一个包含简明教程的网站:cheat-sheets.org

你听过Cheat-Sheets.org吗&#xff1f;在这里可以看到各种简明教程&#xff0c;包含了大部分的编程语言&#xff0c;C、C#、Jave、Python、sql、html、css、matlab、qt、mfc、shell、R……甚至还有photoshop、illustrator各种快键键汇总&#xff0c;真的短小精悍&#xff01;&a…

科研英文写作常用网站【持续更新】

1. bing词典 https://www.bing.com/dict?FORMZ9LHS4 例句很丰富。还没有广告。 2.英语表达同义替换 2.1 https://kmcha.com/similar 2.2 https://synonym.wordhippo.com/ 2.3 https://www.powerthesaurus.org/

太强了?京东大咖10年经验汇总:亿级流量网站核心架构笔记

经历过“双11”和“618”的同学都知道&#xff0c;在大促时如何保证系统的高并发、高可用是非常重要的事情。因此在备战大促时&#xff0c;有些通用原则和经验可以帮助我们在遇到高并发时&#xff0c;构建更可用的系统&#xff0c;如限流、降级、水平扩展和隔离解耦等。通过这些…

服务器论坛有哪些_网站降权常见的处理方法都有哪些?

要说在网站优化过程中害怕出现的情况&#xff0c;降权就是其中的一个&#xff0c;要知道网站降权会导致网站流量大幅度下降&#xff0c;关键词排名消失等现象&#xff0c;那么大家是否了解网站降权常见的处理方法都有哪些吗?1.网站服务器的稳定性在网站优化的过程中大家都会了…

【技巧】用手机访问局域网内Apache网站

写在前面 之前不知道还有这么一个技巧&#xff0c;以前手机真机测试webApp都是开电脑的WiFi&#xff0c;然后在手机里开启代理来访问这个网站。这样对设备的依赖性比较大&#xff0c;试想哪天没带笔记本电脑&#xff0c;或者在没有WiFi发射器的台式机里怎么用这个方式&#xf…

网站备案地点选择_建设项目环境影响登记表(备案)操作指南 (汽修行业收藏版)...

汽修行业示例一、请在取得营业执照后按照以下步骤进行备案操作■1、打开上海市生态环境局网站(http://sthj.sh.gov.cn)&#xff0c;点击首页中部“网上办事大厅”■2、点击“建设项目环境影响登记表备案”下方的“在线办理”■3、认真阅读各项告知信息和《建设项目环境影响登记…

[软件测试] - No.5 Linux 下使用 xampp搭建ecshop网站

一、安装配置xampp 1. 在linux系统中&#xff0c;百度xampp&#xff0c;下载linux版本。下载并提取后的文件如图所示&#xff1a; 2. 在终端中执行 上述命令&#xff0c;启动xampp 安装界面&#xff0c;一直点击next至安装成功&#xff1a; 3.安装成功以后&#xff0c;切换到/…