百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

必看!2024 年 Web 双端使用 JavaScript 的全新趋势

zhezhongyun 2025-04-26 22:39 7 浏览

家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。

JavaScript 对于创建交互式 Web 体验至关重要,其发展大大增强了 Web 的动态性。JavaScript 从下载、解析到执行的每个阶段都需要大量的浏览器资源。太少的 JavaScript 可能会损害用户体验和业务目标,而过度使用则会导致加载时间缓慢、页面响应迟钝和用户参与度低。

本文将重估 JavaScript 在 Web 上的作用,并为设计流畅、高效的用户体验提供建议。但是,因为篇幅有限,关于动态导入、Web workers、代码或图片压缩技术、Source Maps、Interaction to Next Paint (INP)、Total Blocking Time (TBT)、Long Tasks 、Scheduler API、Synchronous XHR等主题可以参考文末资料。

1. 页面应该加载多少 JavaScript

JavaScript 的体积大小一直在持续增加,2024 年 JavaScript 的负载中位数增长了 14%,在移动设备上达到 558kb,在桌面上达到 613kb。

这种持续增长的体积趋势确实令人担忧。虽然设备功能正在不断改进,但并非每个用户都能使用最新技术。同时,更大的 JavaScript 包体积会给设备资源带来额外的压力,从而影响性能,尤其是对于使用较旧或功能较弱的硬件用户而言。

2. 每个页面应该有多少个 JavaScript 请求

网页上的每个资源都会触发至少一个请求,同时如果该资源请求其他资源,请求量就会迅速增加。

对于脚本请求,风险更高。发送的请求越多,加载的 JavaScript 就越多,同时触发瓶颈的可能性就越大,因为脚本会在主线程上争夺资源。这种资源争夺可能会影响性能,例如:延迟启动等。

<script type="module" src="main.js"></script>
<script nomodule src="fallback.js"></script>
// 加载js文件
import { name as squareName, draw } from "./shapes/square.js";
import { name as circleName } from "https://example.com/shapes/circle.js";
// 引入ESM 方式

2024 年,移动页面中位数发出 22 个 JavaScript 请求,而第 90 个百分位数的请求飙升至 68 个。与去年相比,中位数增加了 1 个请求,第 90 个百分位数增加了 4 个请求,是一个微妙但明显的增长。

桌面端情况类似,中位数跃升至 23 个 JavaScript 请求,第 90 个百分位数攀升至 70 个请求。明显看到中位数增加了 1 个请求,第 90 个百分位数增加了 5 个请求。

虽然这些增长乍一看似乎影响不大,但其标志着网络行为的持续演变。自 2019 年以来 JavaScript 请求数量稳步增长,这预示着未来 JavaScript 请求增长速度可能会大大超过性能改进速度。

随着 JavaScript 的增加,未使用的 JavaScript 字节数也在增加,大约有一半下载的字节在页面加载期间未使用。

开发者可以通过Chrome开发者工具的Coverage面板查看未使用的字节数

3.JavaScript 打包器和转译器现状

JavaScript 打包器和转译器通过优化应用程序的构建和交付方式改变了 Web 开发,例如: webpack 和 Parcel 通过将多个文件打包成一个 Bundle,从而减少了 HTTP 请求数量并缩短了加载时间。

const path = require('path');
module.exports = {
  entry: './src/index.js',
  // 指定入口文件
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js',
  },
};

而 Babel 类似的转译器允许开发人员使用现代 JavaScript 功能,同时确保跨浏览器的兼容性。

3.1 打包器

webpack 和 Parcel 等 JavaScript 打包器将多个 JavaScript 文件打包成一个 Bundle 以简化用户交付。其分析代码及其依赖项,优化最终输出以减少 HTTP 请求的数量。通过合并文件,打包器可以缩短加载时间和提高性能。

虽然 Webpack 在所有网站上的使用率仍稳定在 5%,但最近的趋势表明,在移动和桌面端排名前 1,000 的网站中,Webpack 的使用率有所下降。

Parcel 是 webpack 第二大热门替代方案,在开发者中的采用率很高。然而,最近的趋势表明其使用率有所下降,从去年移动网站的 1.3% 下降到今年的 0.3%。桌面平台也出现了类似的情况,反映出 JavaScript 打包工具格局的转变。

Parcel 使用工作线程并行构建代码,利用计算机上的所有核心

3.2 转译器

如下图所述:

排名前 10,000 的移动网站中有 12% 使用 Babel,无论排名如何,移动网站的采用率始终高于桌面网站。这些趋势凸显了 Babel 的突出地位,尤其是在顶级和移动优化网站中,表明其在现代网络开发中的重要性日益提高。

4. 网页请求 JavaScript 方式的转换

在快节奏的 Web 开发中,JavaScript 的加载方式可以决定网站的性能。

4.1 async、defer、module 和 nomodule

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Script Attributes Example</title>
    <script async src="async-script.js"></script>
    <script defer src="defer-script.js"></script>
    <script type="module" src="module-script.js"></script>
    <script nomodule src="nomodule-script.js"></script>
</head>
<body>
    <h1>Script Attributes Example</h1>
</body>
</html>

在优化 JavaScript 加载时,开发人员可以使用几个强大的属性,例如:

  • async 属性允许脚本在 HTML 解析继续时异步加载,并在脚本可用时立即执行。
  • defer 属性将脚本执行推迟到 HTML 解析完成之后,且保持延迟脚本的顺序。

对于现代 Web 应用程序,module 属性表示脚本是 JavaScript 模块,默认情况下启用 ES6 导入 / 导出语法和严格模式。同时,nomodule 属性还为不支持 ES6 模块的浏览器指定了回退脚本,确保了更广泛的兼容性。

如上图所述,2024 年 async 使用率显著增加,桌面和移动设备上的页面使用率从 76% 增加到 87%。 defer 使用率从 42% 略微增加到 47%, async 和 defer 属性的组合从 28-29% 略微下降到 22%。

module 使用率仍然很低,为 4%,而 nomodule 显示采用率极低甚至为零,这表明现代 JavaScript 模块系统仍未在网络上广泛流行。

4.2 preload, prefetch 和 modulepreload

资源提示在优化浏览器性能方面发挥着至关重要的作用,其指示哪些资源应该尽早获取。Preload 用于获取当前导航所需的资源,确保关键资产在需要时立即可用。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Resource Preloading Example</title>
    <!-- Preload critical resources -->
    <link rel="preload" href="critical.js" as="script">
    <link rel="preload" href="important.css" as="style">
    <link rel="prefetch" href="optional.js">
    <link rel="prefetch" href="optional.css">
    <link rel="modulepreload" href="module.js">
</head>
<body>
    <h1>Resource Preloading Example</h1>
    <script src="critical.js"></script>
    <link rel="stylesheet" href="important.css">
</body>
</html>

Modulepreload 具有类似的用途,其用于预加载 JavaScript 模块,帮助高效加载模块化脚本。另一方面,Prefetch 是为下一次导航所需的资源而设计的,其允许浏览器预测并为未来的页面转换做好准备。

preload 的使用率从 2022 年桌面版的 16.4% 大幅下降到 2024 年 7.5%。prefetch 的采用率从 2022 年的约 1.0% 大幅增加到 2024 年的整体 4.8%。模块预加载的使用率在这两年都保持在非常低的水平,2022 年徘徊在 0.1% 左右,2024 年也显示出类似的低百分比 0.7%。

4.3 注入脚本

脚本注入使用 document.createElement 创建 HTMLScriptElement 并通过 DOM 插入方法将其添加到 DOM,或使用 innerHTML 将 <script> 标记作为字符串注入。虽然在许多用例中很常见,但这种做法会绕过浏览器的预加载扫描器,使脚本在初始 HTML 解析期间无法检测到,从而对性能指标 LCP 产生负面影响,尤其是当注入的脚本触发长任务或动态解析大量标记时。

// 创建一个新的 script 元素
var script = document.createElement('script');
// 设置脚本的来源(src)
script.src = 'https://example.com/your-script.js';
// 可选:设置脚本的类型(type),通常为 'text/javascript'
script.type = 'text/javascript';
// 可选:设置脚本在加载完成后执行的回调函数
script.onload = function() {
    console.log('脚本加载完成并执行');
};
// 可选:设置脚本加载失败时的回调函数
script.onerror = function() {
    console.error('脚本加载失败');
};
// 将脚本元素插入到文档的 head 或 body 中
document.head.appendChild(script);
// 或者 document.body.appendChild(script);

2024 年的图表显示,第 50 个百分位数的注入脚本百分比显着下降,从 2022 年的 25% 上升到 2024 年的 21%。在更高的百分位数,两年之间的趋势保持一致,2022 年和 2024 年的第 90 个百分位数都有 70% 的脚本被注入。早期百分位数的注入略有上升,但总体而言,脚本注入的模式在较高的资源水平上保持稳定。

5. JavaScript 框架使用占比

如上图所述,jQuery 仍然是网络上使用最广泛的库,出现在 74% 的页面上。这很大程度上要归功于 WordPress,但即使在 WordPress 之外,jQuery 仍然是许多网站的主导选择。

core-js (41%) 的广泛采用也是意料之中的,因为许多 Web 应用程序都依赖于 Babel,而 Babel 经常使用 core-js 为缺失的 JavaScript 功能提供 polyfill。随着浏览器不断发展并原生支持更多现代功能,这个数字应该会下降,从而减少 Web 应用程序中不必要的字节。

jQuery Migrate 出现在 33% 的页面上,这表明大量网站仍然依赖较旧的 jQuery 版本。同样,jQuery UI 仍在 22% 的页面上使用,尽管大部分已被弃用。

React 的使用率较去年的 8% 略有增长,达到 10%,但由于 JavaScript 生态系统竞争加剧,其增长已趋于平稳。与此同时,GSAP(9%)、OWL Carousel(8%)、Slick(8%)、LazySizes(8%)和 FancyBox(7%)等库继续得到广泛使用,尤其是在性能和动画密集型应用程序中。

随着 Web 生态系统不断现代化,我们预计其中一些遗留库(尤其是基于 jQuery 的库)将随着时间的推移而逐渐减少,转而采用更原生的解决方案和现代框架。

参考资料

本篇文章大部分内容来自Abdul Haddi Amjad和 Nishu Goel发布的文章《A Report on How the Web is Really Using JavaScript》,但是对部分内容进行了修改。

https://almanac.httparchive.org/en/2024/javascript

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script

https://webpack.js.org/

https://parceljs.org/

相关推荐

JPA实体类注解,看这篇就全会了

基本注解@Entity标注于实体类声明语句之前,指出该Java类为实体类,将映射到指定的数据库表。name(可选):实体名称。缺省为实体类的非限定名称。该名称用于引用查询中的实体。不与@Tab...

Dify教程02 - Dify+Deepseek零代码赋能,普通人也能开发AI应用

开始今天的教程之前,先解决昨天遇到的一个问题,docker安装Dify的时候有个报错,进入Dify面板的时候会出现“InternalServerError”的提示,log日志报错:S3_USE_A...

用离散标记重塑人体姿态:VQ-VAE实现关键点组合关系编码

在人体姿态估计领域,传统方法通常将关键点作为基本处理单元,这些关键点在人体骨架结构上代表关节位置(如肘部、膝盖和头部)的空间坐标。现有模型对这些关键点的预测主要采用两种范式:直接通过坐标回归或间接通过...

B 客户端流RPC (clientstream Client Stream)

客户端编写一系列消息并将其发送到服务器,同样使用提供的流。一旦客户端写完消息,它就等待服务器读取消息并返回响应gRPC再次保证了单个RPC调用中的消息排序在客户端流RPC模式中,客户端会发送多个请...

我的模型我做主02——训练自己的大模型:简易入门指南

模型训练往往需要较高的配置,为了满足友友们的好奇心,这里我们不要内存,不要gpu,用最简单的方式,让大家感受一下什么是模型训练。基于你的硬件配置,我们可以设计一个完全在CPU上运行的简易模型训练方案。...

开源项目MessageNest打造个性化消息推送平台多种通知方式

今天介绍一个开源项目,MessageNest-可以打造个性化消息推送平台,整合邮件、钉钉、企业微信等多种通知方式。定制你的消息,让通知方式更灵活多样。开源地址:https://github.c...

使用投机规则API加快页面加载速度

当今的网络用户要求快速导航,从一个页面移动到另一个页面时应尽量减少延迟。投机规则应用程序接口(SpeculationRulesAPI)的出现改变了网络应用程序接口(WebAPI)领域的游戏规则。...

JSONP安全攻防技术

关于JSONPJSONP全称是JSONwithPadding,是基于JSON格式的为解决跨域请求资源而产生的解决方案。它的基本原理是利用HTML的元素标签,远程调用JSON文件来实现数据传递。如果...

大数据Doris(六):编译 Doris遇到的问题

编译Doris遇到的问题一、js_generator.cc:(.text+0xfc3c):undefinedreferenceto`well_known_types_js’查找Doris...

网页内嵌PDF获取的办法

最近女王大人为了通过某认证考试,交了2000RMB,官方居然没有给线下教材资料,直接给的是在线教材,教材是PDF的但是是内嵌在网页内,可惜却没有给具体的PDF地址,无法下载,看到女王大人一点点的截图保...

印度女孩被邻居家客人性骚扰,父亲上门警告,反被围殴致死

微信的规则进行了调整希望大家看完故事多点“在看”,喜欢的话也点个分享和赞这样事儿君的推送才能继续出现在你的订阅列表里才能继续跟大家分享每个开怀大笑或拍案惊奇的好故事啦~话说只要稍微关注新闻的人,应该...

下周重要财经数据日程一览 (1229-0103)

下周焦点全球制造业PMI美国消费者信心指数美国首申失业救济人数值得注意的是,下周一希腊还将举行第三轮总统选举需要谷歌日历同步及部分智能手机(安卓,iPhone)同步日历功能的朋友请点击此链接,数据公布...

PyTorch 深度学习实战(38):注意力机制全面解析

在上一篇文章中,我们探讨了分布式训练实战。本文将深入解析注意力机制的完整发展历程,从最初的Seq2Seq模型到革命性的Transformer架构。我们将使用PyTorch实现2个关键阶段的注意力机制变...

聊聊Spring AI的EmbeddingModel

序本文主要研究一下SpringAI的EmbeddingModelEmbeddingModelspring-ai-core/src/main/java/org/springframework/ai/e...

前端分享-少年了解过iframe么

iframe就像是HTML的「内嵌画布」,允许在页面中加载独立网页,如同在画布上叠加另一幅动态画卷。核心特性包括:独立上下文:每个iframe都拥有独立的DOM/CSS/JS环境(类似浏...