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

news/2024/5/19 11:18:20/文章来源:https://blog.csdn.net/m0_37411791/article/details/103094576

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

在第1部分中,我们介绍了数据和资源预加载,在第2部分中,我们介绍了通过直接向客户端推送数据而不是等待客户端请求数据来提高性能,在第3部分中,我们介绍了缓存优先渲染。

代码大小和执行优化

在第1-3部分中,我们介绍了各种方法,这些方法可以优化关键路径的静态资源和数据查询的加载模式。但是,还有一个我们尚未涉及的关键领域,对于提高Web应用程序的性能至关重要,尤其是在低端设备上-向用户交付更少的代码,尤其是更少的JavaScript。

这看起来似乎很明显,但是这里有几点需要考虑。业界普遍认为,通过网络下载的JavaScript的大小是重要的(即压缩后的大小),但是我们发现真正重要的是压缩前的大小,因为即使在本地缓存,也需要在用户设备上进行解析和执行。

如果您的站点有很多重复用户(较高的浏览器缓存命中率)或在移动设备上访问您的站点的用户,则尤其如此。在这些情况下,JavaScript在CPU上的解析和执行性能成为主要的限制因素,而不是网络下载时间。

例如,当我们为JavaScript资产实施Brotli压缩时,我们发现整个网络的压缩后大小减少了近20%,但是从最终用户的角度来看,总体页面加载时间没有统计上的显著减少。

另一方面,我们发现压缩前JavaScript尺寸的减小始终可以提高性能。在关键路径上执行的JavaScript和主页完成后动态导入的JavaScript之间也应加以区分。

理想情况下,减少应用程序中的JavaScript总量虽然很不错,但短期内要进行优化的关键是关键路径上执行的JavaScript数量(我们使用称为“每条路由的关键字节数”的指标进行跟踪) )。

延迟加载的动态导入JavaScript通常不会对页面加载性能产生重大影响,因此,将不可见或与交互相关的UI组件从初始页面包中移出并动态导入包是一种有效的策略。

从长远来看,重构我们的UI以减少关键路径上的脚本数量对于提高性能至关重要,但这是一项艰巨的任务,需要时间。在短期内,我们进行了许多项目,以对产品开发人员透明的方式提高现有代码的大小和执行效率,并且几乎不需要重构现有产品代码。

内联引用

我们使用Metro(与React Native使用的捆绑器)打包前端Web资产,因此我们可以直接访问内联引用。内联需求将需求/导入模块的成本在实际使用时首次转移。

这意味着您可以避免为未使用的功能付出执行成本(尽管您仍将支付下载和解析它们的成本),并且可以在应用程序启动时更好地摊销执行成本,而不是进行大量的前期计算。

const config = {
transformer: {
getTransformOptions: () => {
return {
transform: { inlineRequires: true },
};
},
},
};

module.exports = config;

我们可以看下下面这个例子:

const foo = require('foo');
const bar = require('bar');

module.exports = function baz() {
foo();
}

使用内联引用可以将其转换为如下所示(您可以通过在浏览器开发人员工具的Instagram JS源代码中搜索r(d[来找到这些内联要求))

module.exports = function baz() {
require('foo')();
}

如我们所见,它实际上是通过将对所需模块的本地引用替换为需要该模块的函数调用而起作用的。这意味着除非实际使用该模块中的代码,否则永远不需要该模块(因此也就不会执行该模块)。在大多数情况下,这非常有效,但是要注意会导致问题的一些极端情况,即具有副作用的模块。例如:

// Module A

window.globalState = { 'foo': 'bar' };

// Module B

module.exports = function() {
console.log(window.globalState);
}

// Module C

const A = require('A');
const B = require('B');

B();

没有内联引用,模块C将输出{'foo':'bar'},但是当我们启用内联引用时,它将输出undefined,因为B对A具有隐式依赖性。这是一个人为的示例,但还有其他示例。

在现实世界中,这种情况可能会产生影响,例如,如果模块在其初始化过程中进行了一些日志记录,该怎么办-启用内联请求可能导致该日志记录停止发生。

通过linters来检查在模块作用域级别立即执行的代码,这在大多数情况下是可以避免的,但是我们必须从此优化中将某些文件列入黑名单,例如需要立即执行的运行时polyfills。在整个代码库中尝试启用内联需求之后,我们发现Feed TTI(互动时间)和Display Done分别提高了12%和9.8%,并认为处理这些次要情况对于提高性能是值得的。

现代浏览器代码优化

推动采用诸如Babel之类的编译器/编译器工具的主要驱动器之一,是允许开发人员使用现代的JavaScript编码习惯,同时在缺乏支持的浏览器中可以运行。

从那时起,出现了这些工具的许多其他重要场景,包括诸如Typescript和ReasonML之类的JS编译语言,诸如JSX和Flow类型注释之类的语言扩展以及针对诸如国际化之类的时间AST操纵。

因此,这个额外的编译步骤不太可能很快在前端开发工作流程中消失。不过,话虽如此,但值得回顾的是,在2019年是否仍然有达到此目的的原始目的(跨浏览器兼容性)。

大多数主要浏览器的最新版本现在都很好地支持ES2015和更新功能(例如async / await),因此绝对有可能直接提供包含这些更新功能的JavaScript -但是我们必须首先回答两个关键问题:

  • 如果有足够的用户能够利用这一点,因为这个将增加额外的构建复杂性(因为您仍然需要维护旧版浏览器的旧版转换步骤)

  • 如果直接提供ES2015+的代码是否对性能有帮助

要回答第一个问题,我们首先必须确定要在不进行转译的情况下提供哪些功能,以及我们要为不同的浏览器支持多少个构建变体。我们选择了两个版本,一个版本需要支持ES2017语法,另一个版本可以移植回ES5(此外,我们还添加了一个可选的polyfill捆绑包,该捆绑包仅适用于缺少运行时支持的旧版浏览器。最近的DOM API)。

通过在服务器端进行一些基本的用户代理嗅探来检测对这些组的支持,从而确保从客户端检测要加载的捆绑软件起,没有运行时成本或额外的往返时间。

考虑到这一点,我们确定了instagram.com的56%的用户可以在不进行任何代码转换或运行时polyfill的情况下获得ES2017版本的服务,并且考虑到该百分比只会随着时间的推移而增加– 考虑到能够使用它的用户数量,似乎值得支持两个版本。

至于第二个问题-直接交付ES2017的性能优势是什么-首先让我们看一下Babel在将一些常见的构造转换回ES5方面的实际作用。左列是ES2017代码,右列是已编译的ES5兼容版本。

Class (ES2017 vs ES5)

Async/Await (ES2017 vs ES5)

Arrow functions (ES2017 vs ES5)

Destructuring assignment (ES2017 vs ES5)

从中我们可以看到,在编译这些语法时有相当大的开销(即使您在较大的代码库上分摊了某些运行时帮助程序函数的成本)。对于Instagram,当我们从构建中删除所有ES2017转码插件时,我们看到核心JavaScript包的大小减少了5.7%。

在测试中,我们发现使用ES2017捆绑包的用户与未使用ES2017捆绑包的用户相比,提要页面的端到端加载时间缩短了3%。

写在最后

尽管到目前为止取得的进展令人印象深刻,但到目前为止,我们所做的工作只是开始。在Redux存储/ Reducer模块化,更好的代码拆分,将更多JavaScript执行移出关键路径,优化滚动性能,适应不同的带宽条件等方面,还有大量的改进空间。

推荐阅读

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

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

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

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

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

相关文章

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

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

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

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

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

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

云上网站通用解决方案

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

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

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

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

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

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

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

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

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

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

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

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

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

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

你听过Cheat-Sheets.org吗?在这里可以看到各种简明教程,包含了大部分的编程语言,C、C#、Jave、Python、sql、html、css、matlab、qt、mfc、shell、R……甚至还有photoshop、illustrator各种快键键汇总,真的短小精悍!&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”的同学都知道,在大促时如何保证系统的高并发、高可用是非常重要的事情。因此在备战大促时,有些通用原则和经验可以帮助我们在遇到高并发时,构建更可用的系统,如限流、降级、水平扩展和隔离解耦等。通过这些…

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

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

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

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

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

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

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

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

搭建个人网站

许久没有更博了,当初开博的时候还是一个刚保研的大四学生,如今已是研究生毕业两年,混迹银行业的IT码农,生活还算如意,追求不止于此,2016年初终于发布了自己首个个人网站,写篇文章分享网站的技术…

apache2.4在本地打开laravel项目_开源导航网站-WebStack-Laravel

前言:因为工作,需要使用的网站比较多,所以一直想为公司搭建一款私有的导航网站。本来想自己写,可是不会前端呀。只好去github上看看有没有大神分享的开源导航网站。虽然不太好找但还是找到了。项目地址:https://github…

阿里云免费https 宝塔配置,网站不可访问

阿里云申请我就不说了,百度一大把 宝塔配置也不说了,google一大把 建议有能力用google或者bing 有两点会导致无法访问 1、你用了cdn,当然这个我没遇到,因为我没有cdn 2、需要去你阿里云账号里面安全规则里面添加一个新规则就是s…