4 步缩减 Script Evaluation Time
4 步缩减脚本评估时间 (Script Evaluation Time)
当你开始尝试优化你的站点运行更快一点的时候,从 Google Lighthost 测试开始可能应该是你的第一步。
总起来说,如果你希望从 Google 得到更多流量,除了遵循优化页面性能的建议之外,什么是更好的策略呢?不幸的是,它确实不是那么简单。
一旦你看到你的分数,你就不得不深入页面的细节去寻找隐藏的角度来找到问题。最常见的一个罪魁祸首,主线程的阻塞者和看不见的锚点,即 Script Evaluation。

在这里你可以看到,这个页面花费了将近 7 秒时间进行 Script Evaluation,它无疑需要被压缩掉。

这是目前花费时间最长的部分,它阻塞了主线程。对脚本的解析和求值的花费依赖于你的设备和 CPU。
检查解析的代价,这里是来自 Google developer 博客的在从低祷告的硬件上解析并求值一个 1Mb 的压缩的脚本的时间。

这显然严重影响到用户怎样才能快速开始使用该站点,所以删掉这个时间对于为用户提供快速体验至关重要。
在本文中,我们将涵盖 Script Evaluation 是什么,你如何可以压缩掉这个时间,已得到快速响应的页面和更高的 Lighthouse 分数。
什么是 Script Evaluation?
现代的浏览器使用编译器,优化和技巧来帮助你的页面执行尽可能的快速。但是这会实质上改变代码的执行。也就是说,对于你编写的简单代码来说,你编写的代码与实际执行的可能会很大不同。
伴随着下载的页面的尺寸,我们所使用的每个脚本都伴随一个相关的执行代价。Script Evaluation 是关于多少代码需要运行在页面上的指示器。实际上,脚本的评估是解析脚本步骤与执行脚本之间的一个阶段。
问题是脚本评估的时间会阻塞主线程的时间,伤害用户体验并影响到页面性能测试工具,像 Lighthouse 的分数。另外,这些脚本通常是在主线程上被解析和编译的。

如何缩减 Script Evaluation Time?
幸运的是,有多种方式来通过快速加载页面来使用 JavsScript 并不会损坏功能性。如果我们首先处理用户第一次需要的部分来加载页面,我们可以设置一个更为高效的加载顺序,特定的资源优先,删除无用代码来减少代码尺寸。
缩减 Script Evaluation time:
- 通过代码拆分来仅仅发送用户需要的代码
- 紧缩并压缩代码
- 删除无用代码
- 使用 PRPL 模式通过缓存来缩减网络流量
代码拆分
一开始的几秒钟对于用户至关重要。你需要制造良好的第一印象,考虑一下你需要如何做来制造第一印象,第一界面很少需要完全将 JavaSCript 加载到页面来提供功能。用户需要标题、图像以及菜单快速加载,让他们的第一次点击快速开始工作。
这意味着你可以拆分你的 JavaScript 块,仅仅发送初始路由需要的代码,使用模块化的脚本块,比如 webpack,当用户请求的时候,仅仅动态导入关键的代码片段。
通过仅仅提供需要解析和编译的代码,可以得到更小的脚本评估时间和更快的页面加载速度。
紧缩和压缩
页面上运行的脚本包含大量的冗余内容,空白以及其它不会增加任何功能的部分,但这些也需要被 Evaluated,紧缩可以删除这些内容。
就像压缩图片得到更小的尺寸但可以保持类似的质量,类似 Terser 这样的 JavaSCript 压缩工具将创建紧缩之后的版本。它可以为你提供更小但完全有效和工作的代码文件,这样可以缩减 Evaluation 时间。
压缩可以缩减网络传输时间。
删除无用代码
另一个方式是找到并删除任何不会使用的代码。
为了找到无用代码,你需要分析的代码包,打开 DevTools,点击 Network,选中 disable cache,并重新加载页面。
你将看到所有运行页面所使用的代码 - 以及有多少是不会被使用的。

类似 Webpack 这样的包分析器可以帮助你找到每块代码的作用。
如果你不能拆分一个库,还可能使用一个替换品来完成同样的功能,或者你的开发自己构建一个方案,这样的话,多数无用的库可以整个删除。
压缩网络
特别有效的一种方式是缩减网络时间。通过使用长时间的缓存来避免重新获取不会变化的资源。HTTP 缓存可以确保浏览器可以指出理想的时间来放置传输不变的内容。
使用这 4 种技术,你可以奇迹般的缩减你的脚本的 Evaluation 时间,放置阻塞主线程,
4 步缩减 Script Evaluation Time的更多相关文章
- jQuery 3.0的buildFragment
在 jQuery3.0中,buildFragment 是一个私有函数,用来构建一个包含子节点 fragment 对象.这个 fragment 在 DOM1 中就已经有了,所有浏览器都支持.当频繁操作( ...
- JanusGraph 创建索引步骤(composite index)踩坑总结
前言 JanusGraph是一个图数据库引擎,安装及入门可以参考 JanusGraph 图数据库安装小记.为了提高查询速度,在使用过程中一般要为某些属性创建索引.这篇随笔主要是记录创建索引过程中踩过的 ...
- HTML Entry 源码分析
简介 从 HTML Entry 的诞生原因 -> 原理简述 -> 实际应用 -> 源码分析,带你全方位刨析 HTML Entry 框架. 序言 HTML Entry 这个词大家可能比 ...
- 解密jQuery内核 DOM操作的核心buildFragment
文档碎片是什么 http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-B63ED1A3 DocumentFragment is a & ...
- ssh reverse tunnel
ssh反向通道的可用场景之一:从外网访问内网的主机.所必须的是你需要一个有ssh登录权限的公网主机. 步骤如下(将内网主机称作A,公网ssh主机地址为hostP ): 1.在内网A上执行 :local ...
- Discrete.Differential.Geometry-An.Applied.Introduction(sig2008)笔记
-------------------------------------------------------------- Chapter 1: Introduction to Discrete D ...
- [译]开始学习webpack
写在前面: 文章翻译自petehunt大神的petehunt/webpack-howto,作为学习webpack的开始.fork了一份,翻译后的在这里https://github.com/zjzhom ...
- Xml 学习
XML概述 XML的历史背景 GML(1969):通用标记语言 IBM公司的一些专家们一起研究的一个课题: 软件必须有高度的可移植性,而且必须有一个统一的标准.为了实现软件的一处编写多处运行这个愿景所 ...
- 从零开始学习前端JAVASCRIPT — 5、JavaScript基础BOM
1:BOM(Browser Object Model)概念 window对象是BOM中所有对象的核心. 2:window属性(较少用) self:self代表自己,相当于window. windo ...
- jquery-1.11.1.js
每次想要使用这个js时,总是要到官网上下载,太麻烦,现在把它收录了 jquery-1.11.1.js /*! * jQuery JavaScript Library v1.11.1 * http ...
随机推荐
- .Net技术栈
一.后端 1. 框架 C# 异步多线程 委托 事件 标准事件模式 泛型 特性 反射 Linq Lambda Expression表达式树 PLinq IO文件操作 XML操作 .Net IOC/DI依 ...
- Js运算符(操作符)
算数运算符 a = 1 + 1 // 2 a = 10 - 5 // 5 a = 10 / 5 // 2 a = 10 / 0 // js中除以0不会报错,结果是Infinity a = 2*2 // ...
- SpringBoot 实现文件上传
参考:Java springboot进阶教程 文件上传功能实现 后端代码编写 常见错误分析与解决 在 Service 业务层接口中增加一个上传文件的方法 因为文件并不是上传至数据库中,所以不需要编写 ...
- USB总线-Linux内核USB3.0 Hub驱动分析(十四)
1.概述 USB Hub提供了连接USB主机和USB设备的电气接口.USB Hub拥有一个上行口,至少一个下行口,上行口连接上一级的Hub的下行口或者USB主机,连接主机的为Root Hub,下行口连 ...
- 2024年8月中国数据库排行榜:OceanBase攀升再夺冠,达梦跃入三甲关
在这个炽热的季节,随着巴黎奥运会的盛大开幕,全球将目光聚集在了体育的无限魅力和竞技的巅峰对决上.如同奥运赛场上的激烈角逐,中国数据库界也上演着一场技术与创新的较量,各个数据库产品正在中国乃至全球舞台上 ...
- Docker挂载jar包运行脚本
下载镜像 docker pull openjdk:8 执行命令 docker run -d -p 9001:8081 -v /opt/springboot-docker-1.0.jar:/var/li ...
- 以 Kubernetes 原生方式实现多集群告警
作者:向军涛.雷万钧 来源:2023 上海 KubeCon 分享 可观测性来源 在 Kubernetes 集群上,各个维度的可观测性数据,可以让我们及时了解集群上应用的状态,以及集群本身的状态. Me ...
- fiddler限速配置&mock配置
一.限速配置 1.开启性能选项 2.找到对应的参数入口 3.修改对应的从参数 解释下 这2个参数是如何做到限速的 4.request-trickle-delay(上传数据限制) 默认值是300,他的意 ...
- The 2024 ICPC Asia East Continent Online Contest (I) G
Link: The Median of the Median of the Median 考虑二分答案,对中位数进行二分,每次去判断是否比中位数大即可. 我们钦定了一个中位数 \(x\),对于 \(\ ...
- mouseup模拟drag与click事件冲突
今天要说一个很隐晦的东西,一般可能很难碰到,碰到了可能很难解决.就是当我们自己用mousestart,mousemove,mouseup做自定义拖拽效果的时候,如果这个时候配上click就会引发一个拖 ...