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. PS安装插件提示无法加载扩展未正确签署 的解决办法

    PS安装插件提示无法加载扩展未正确签署解决方式 win系统: 1.打开"运行"窗口(点击电脑左下角"开始"菜单,从打开的菜单中依次点击"所有程序&qu ...

  2. ASP.NET Core OData 9的发布,放弃 .NET Framework

    Microsoft 于 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9 包. 这个新包将ASP.NET Core与.NET 8 OData库保持一致,改变了OData ...

  3. Nuxt.js 应用中的 page:finish 钩子详解

    title: Nuxt.js 应用中的 page:finish 钩子详解 date: 2024/10/9 updated: 2024/10/9 author: cmdragon excerpt: pa ...

  4. /proc/pids/smaps

    Linux内存管理 -- /proc/{pid}/smaps讲解 基本介绍 /proc/PID/smaps 文件是基于 /proc/PID/maps 的扩展,他展示了一个进程的内存消耗,比同一目录下的 ...

  5. day18-方法

    何谓方法? System.out.println() System->类 out->对象 println()->方法 Java方法是语句的集合,它们在一起执行 一个功能. 方法是解决 ...

  6. Spring 实现 3 种异步流式接口,干掉接口超时烦恼

    大家好,我是小富- 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable.WebAsyncTask 和 DeferredResult.CompletableFuture等均可实现 ...

  7. 妙用编辑器:使用Notepad--列编辑功能批量生成维护命令

    应用场景 在日常工作中,维护人员可能会要批量生成一些配置命令,示例如下:添加12个分组 ADD GROUP:GID=1,FCN=646322; ADD GROUP:GID=1,FCN=646322; ...

  8. 一文读懂 KubeSphere 企业版 4.0:多品类生态价值赋能的里程碑

    近日,青云科技 KubeSphere 团队革新先行,重磅发布了沉淀数年.倾力打造的全新分布式云原生可扩展开放架构--KubeSphere LuBan,以及在此之上构建的化整为零.全能开放.随时随地自由 ...

  9. OpenGL with GLFW GLAD and CMAKE

    0. 前言 首先,无论是在youtube还是网站上,许多OpenGL的环境配置都是在VS studio里配置的,个人比较喜欢使用VS code,以及Cmake. 下文给出了一个Cmake版本关于 GL ...

  10. hasOwnProperty()方法

    hasOwnProperty()方法可以检测对象是否有某个属性 var man = { legs:2, hands:2, heads:1 } man.hasOwnProperty("head ...