4 步缩减脚本评估时间 (Script Evaluation Time)

https://touch.marfeel.com/resources/blog/reduce-script-evaluation-time#:~:text=Script evaluation is an indicator of how much,between parsing the script and executing the script

当你开始尝试优化你的站点运行更快一点的时候,从 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的更多相关文章

  1. jQuery 3.0的buildFragment

    在 jQuery3.0中,buildFragment 是一个私有函数,用来构建一个包含子节点 fragment 对象.这个 fragment 在 DOM1 中就已经有了,所有浏览器都支持.当频繁操作( ...

  2. JanusGraph 创建索引步骤(composite index)踩坑总结

    前言 JanusGraph是一个图数据库引擎,安装及入门可以参考 JanusGraph 图数据库安装小记.为了提高查询速度,在使用过程中一般要为某些属性创建索引.这篇随笔主要是记录创建索引过程中踩过的 ...

  3. HTML Entry 源码分析

    简介 从 HTML Entry 的诞生原因 -> 原理简述 -> 实际应用 -> 源码分析,带你全方位刨析 HTML Entry 框架. 序言 HTML Entry 这个词大家可能比 ...

  4. 解密jQuery内核 DOM操作的核心buildFragment

    文档碎片是什么 http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-B63ED1A3 DocumentFragment is a & ...

  5. ssh reverse tunnel

    ssh反向通道的可用场景之一:从外网访问内网的主机.所必须的是你需要一个有ssh登录权限的公网主机. 步骤如下(将内网主机称作A,公网ssh主机地址为hostP ): 1.在内网A上执行 :local ...

  6. Discrete.Differential.Geometry-An.Applied.Introduction(sig2008)笔记

    -------------------------------------------------------------- Chapter 1: Introduction to Discrete D ...

  7. [译]开始学习webpack

    写在前面: 文章翻译自petehunt大神的petehunt/webpack-howto,作为学习webpack的开始.fork了一份,翻译后的在这里https://github.com/zjzhom ...

  8. Xml 学习

    XML概述 XML的历史背景 GML(1969):通用标记语言 IBM公司的一些专家们一起研究的一个课题: 软件必须有高度的可移植性,而且必须有一个统一的标准.为了实现软件的一处编写多处运行这个愿景所 ...

  9. 从零开始学习前端JAVASCRIPT — 5、JavaScript基础BOM

    1:BOM(Browser  Object  Model)概念 window对象是BOM中所有对象的核心. 2:window属性(较少用) self:self代表自己,相当于window. windo ...

  10. jquery-1.11.1.js

       每次想要使用这个js时,总是要到官网上下载,太麻烦,现在把它收录了 jquery-1.11.1.js /*! * jQuery JavaScript Library v1.11.1 * http ...

随机推荐

  1. Cookie、sessionStorage、localStorage的区别 ?

    共同点:都是保存在浏览器端的. 区别: 1.cookie数据始终携带在同源的http请求中,即cookie在浏览器和服务器间来回传递,而sessionStorage和Localstorage不会自动把 ...

  2. es6有哪些新特性?

    1. let 和 ocnst ,可以定义块级作用域 2. 新增了箭头函数,箭头函数简化了函数定义的定义 3.新增了promise解决回调地狱问题 ps:回调地狱是我们异步请求服务器数据时,通过then ...

  3. 03 Transformer 中的多头注意力(Multi-Head Attention)Pytorch代码实现

    3:20 来个赞 24:43 弹幕,是否懂了 QKV 相乘(QKV 同源),QK 相乘得到相似度A,AV 相乘得到注意力值 Z 第一步实现一个自注意力机制 自注意力计算 def self_attent ...

  4. 妙用编辑器:使用Notepad--的标记颜色功能更高效的阅读日志文件

    应用场景 在日常维护工作中,经常需要查看一些日志,以判断系统的运行状态或者进行问题定位,当系统出现故障时,一般都会有特殊的关键字,但对于浩如烟海的日志来说,识别这些关键字信息还是非常费眼力的,比如有如 ...

  5. jmeter使用beanshell完成签名计算,附与python代码对比

    签名计算过程: 1.ticket计算:时间戳加+随机数字拼接后md5加密 2.组装公共参数+ticket+时间戳+业务参数 beanshell代码实现: import java.util.*;impo ...

  6. C#/.NET/.NET Core技术前沿周刊 | 第 11 期(2024年10.21-10.31)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  7. Avalonia开源控件库强力推荐-Semi.Avalonia

    Avalonia是什么? Avalonia是一个强大的框架,使开发人员能够使用.NET创建跨平台应用程序.它使用自己的渲染引擎绘制UI控件,确保在Windows.macOS.Linux.Android ...

  8. 4.3 Linux压缩文件或目录为.zip格式(zip命令)

    我们经常会在 Windows 系统上使用 ".zip"格式压缩文件,其实".zip"格式文件是 Windows 和 Linux 系统都通用的压缩文件类型,属于几 ...

  9. GPU 环境搭建指南:使用 GPU Operator 加速 Kubernetes GPU 环境搭建

    本文主要分享如何使用 GPU Operator 快速搭建 Kubernetes GPU 环境. 1. 概述 上一篇文章 GPU 使用指南:如何在裸机.Docker.K8s 等环境中使用 GPU 分享了 ...

  10. 低功耗4G模组:MQTT通信功能

    ​ 今天我们来学习使用合宙Air708E开发板的MQTT通信基本功能. 一.MQTT介绍 MQTT是一种低开销.低带宽占用的即时通讯协议,可以用极少的代码和带宽为远程设备提供实时可靠的消息服务.它适用 ...