当前位置: 首页 > news >正文

速度革命:esbuild如何改变前端构建游戏 (1)

什么是 esbuild?

esbuild 是一款基于 Go 语言开发的 JavaScript 构建打包工具,以其卓越的性能著称。相比传统的构建工具(如 Webpack),esbuild 在打包速度上有着显著的优势,能够将打包速度提升 10 到 100 倍。这对于那些经常受到 Webpack 缓慢打包速度困扰的开发人员来说,无疑是一个巨大的福音。
在这里插入图片描述

为什么 esbuild 能这么快?
  1. Golang 开发

    • Go 语言在 CPU 密集型任务中表现出色,而传统的 JavaScript 构建工具并不适合这类场景。
  2. 多核并行

    • Go 语言具有多线程运行能力,可以充分利用多核 CPU 的性能,将解析、编译和生成的工作并行化。
  3. 从零开始

    • esbuild 从一开始就注重性能优化,不依赖第三方库,使用一致的数据结构,避免了不必要的数据转换开销。
  4. 内存的有效利用

    • 在 JS 开发的传统打包工具当中一般会频繁地解析和传递抽象语法树( AST )数据,比如 字符串 -> TS -> JS -> 字符串,然后字符串 -> JS -> 旧的JS -> 字符串,然后字符串 -> JS -> minified JS -> 字符串,这其中会涉及复杂的编译工具链,比如 webpack -> babel -> terser,每次接触到新的工具链,都得重新解析 AST,导致大量的内存占用。

esbuild 仅触及整个JavaScript AST 3次:

  1. 进行词法分析,解析,作用域设置和声明符号的过程
  2. 绑定符号,最小化语法。比如:将 JSX / TS转换为 JS。
  3. AST生成JS,source map生成。

当 AST 数据在CPU缓存中仍然处于活跃状态时,会最大化AST数据的重用。
在这里插入图片描述

为什么 esbuild 还没有一统江山?

尽管 esbuild 有许多优点,但它也存在一些明显的不足:

  • 缺乏 AST 操作能力

    • 无法对打包产物进行降级到 ES5 及以下,不支持低版本浏览器。
  • Code Splitting 功能还在计划中

    • 当前版本的 esbuild 还不支持代码分割。
  • 没有 TypeScript 类型检测

    • 不像 Webpack 集成了 TypeScript 支持,esbuild 需要额外的配置才能支持 TypeScript。
  • 默认不支持 Vue、Angular 等框架的代码文件格式

    • 需要通过插件来实现对这些框架的支持,增加了开发成本。
为什么要学习 esbuild?

esbuild 之所以受到关注,很大程度上是因为它在 Vite 中的应用。esbuild是组成Vite的两架马车之一。
在这里插入图片描述
Vite 是一个现代的前端构建工具,其核心理念是“快速启动”和“按需编译”。esbuild 是 Vite 的重要组成部分之一,主要负责以下几个方面:

  1. 依赖预构建

    • 作为 Bundle 工具,预构建第三方依赖,减少开发时的加载时间。
  2. 单文件编译

    • 作为 TypeScript 和 JSX 编译工具,支持现代 JavaScript 语法。
  3. 代码压缩

    • 作为压缩工具,优化最终的打包产物。
什么是 no-bundle?

ESMJavaScript提出的官方标准化模块系统,不同于之前的CJSAMDCMD等等,ESM提供了更原生以及更动态的模块加载方案,最重要的就是它是浏览器原生支持的,也就是说我们可以直接在浏览器中去执行import,动态引入我们需要的模块,而不是把所有模块打包在一起。

Vite 是一个提倡 no-bundle 的构建工具,相比于传统的 Webpack,能做到开发时的模块按需编译,而不用先打包完再加载。
在这里插入图片描述
在这里插入图片描述

什么是依赖预构建?

模块代码其实分为两部分,一部分是源代码,也就是业务代码,另一部分是第三方依赖的代码,即node_modules中的代码。所谓的no-bundle只是对于源代码而言,对于第三方依赖而言,我们基本不会去改变他,Vite 还是选择 bundle(打包),这个部分,就依赖于esbuild

但是关键点是,为什么在开发阶段我们要对第三方依赖进行预构建? 如果不进行预构建会怎么样?

首先 Vite 是基于浏览器原生 ES 模块规范实现的 Dev Server,不论是应用代码,还是第三方依赖的代码,理应符合 ESM 规范才能够正常运行。但是,我们没有办法控制第三方的打包规范。还有相当多的第三方库仍然没有 ES 版本的产物。

此外,ESM还有一个比较重要的问题——请求瀑布流问题。ESM的每个import都会触发一次新的文件请求,因此在依赖层级深涉及模块数量多的情况下,会触发很多个网络请求,巨大的请求量加上 Chrome 对同一个域名下只能同时支持 6个 HTTP 并发请求的限制,导致页面加载十分缓慢,与 Vite 主导性能优势的初衷背道而驰。

在进行依赖的预构建之后,这种第三方库的代码被打包成了一个文件,这样请求的数量会骤然减少,页面加载也快了许多

总结

esbuild 以其卓越的性能和高效的构建流程,成为现代前端开发的重要工具之一。虽然它还有一些不足,但随着社区的发展和技术的进步,这些问题正在逐步得到解决。Vite 作为 esbuild 的重要应用场景,展示了 esbuild 在实际项目中的巨大潜力。

相关文章:

速度革命:esbuild如何改变前端构建游戏 (1)

什么是 esbuild? esbuild 是一款基于 Go 语言开发的 JavaScript 构建打包工具,以其卓越的性能著称。相比传统的构建工具(如 Webpack),esbuild 在打包速度上有着显著的优势,能够将打包速度提升 10 到 100 倍…...

大语言模型---什么是注意力机制?LlaMA 中注意力机制的数学定义

摘要 注意力机制(Attention Mechanism)是一种在深度学习和人工智能中广泛使用的技术,旨在使模型在处理信息时能够重点关注重要的部分,从而提升任务的效率和精度。它最初应用于自然语言处理(NLP)&#xff0…...

LSA详情与特殊区域

LSA是构成LSDB的重要原材料,在OSPF中发挥很大作用。 报文 通用头部 LS age:LSA寿命,0-3600s Options:可选项 LS type:LSA类型,三要素之一 Link State ID:LSAID 三要素之一 Advertising Ro…...

Python爬虫能处理动态加载的内容吗?

Python爬虫确实可以处理动态加载的内容。动态加载的内容通常是通过JavaScript在客户端执行,这意味着当网页首次加载时,服务器返回的HTML可能并不包含最终用户看到的内容。相反,JavaScript代码会在页面加载后从服务器请求额外的数据&#xff0…...

Spring Boot Web应用开发:数据访问

数据访问是Web应用的关键部分,Spring Boot简化了这一流程,特别是通过集成Java Persistence API (JPA) 来实现数据持久化。以下是如何在Spring Boot中配置数据源、使用JPA进行数据持久化以及创建访问数据的REST接口。 配置数据源 在Spring Boot中&#…...

【Linux】进程控制-----进程创建与进程终止

目录 前言: 一、进程创建: 1、fork函数 2、创建多个进程: 3、写时拷贝: 二、进程终止: 进程退出码: 退出方式: ​编辑 进程异常退出: 缓冲区: 前言&#xff1…...

【软考速通笔记】系统架构设计师③——信息安全技术基础知识

文章目录 一、前言二、信息安全基础知识2.1 信息安全的基本要求2.2 信息安全的范围2.3 网络安全表现2.4 安全措施包括 三、信息安全系统的组成框架3.1 技术体系:3.2 组织机构体系:3.3 管理体系 四、信息加解密技术4.1 对称密钥加密算法4.2 非对称密钥加密…...

AI安全:从现实关切到未来展望

近年来,人工智能技术飞速发展,从简单的图像识别到生成对话,从自动驾驶到医疗诊断,AI技术正深刻改变着我们的生活。然而,伴随着这些进步,AI的安全性和可控性问题也日益凸显。这不仅涉及技术层面的挑战&#…...

YOLO格式数据集介绍

yolo数据集 yolo数据集标注格式主要是 yolov5 项目需要用到。 标签使用txt文本进行保存。yolo的目录如下所示: dataset ├─images │ ├─train │ │ ├─ flip_mirror_himg0026393.jpg │ │ ├─ flip_mirror_himg0026394.jpg │ │ ├─ flip_…...

Doris 数据集成 LakeSoul

Doris 数据集成 LakeSoul 作为一种全新的开放式的数据管理架构,湖仓一体(Data Lakehouse)融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势,帮助用户更加便捷地满足各种数据处理分析的需求,在企业的大数据体系中已经得到越来越多的应用。 在过去多个版本…...

Navicat 预览变更sql

需求 用了Flyway(数据库迁移工具)后,需要记录变更sql,所以要知道变更sql。 查看方式 Navicat提供了预览变更sql功能,右击表---->设计表,比如修改字段后,点击SQL预览标签页, 顺…...

深入理解下oracle 11g block组成

深层次说,oracle数据库的最少组成单位应该是块,一般默认情况下,oracle数据库的块大小是8kb,其中存储着我们平常所需的数据。我们在使用过程中,难免会疑问道:“oracle数据块中到底是怎样组成的,平…...

Qt Graphics View 绘图架构

Qt Graphics View 绘图架构 "QWGraphicsView.h" 头文件代码如下&#xff1a; #pragma once#include <QGraphicsView>class QWGraphicsView : public QGraphicsView {Q_OBJECTpublic:QWGraphicsView(QWidget *parent);~QWGraphicsView();protected:void mouseM…...

大数据-234 离线数仓 - 异构数据源 DataX 将数据 从 HDFS 到 MySQL

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…...

零基础学安全--shell脚本学习(1)脚本创建执行及变量使用

目录 学习连接 什么是shell shell的分类 查看当前系统支持shell 学习前提 开始学习 第一种执行脚本方法 ​编辑 第二种执行脚本方法 第三种执行脚本方法 变量声明和定义 ​编辑 查看变量 删除变量 学习连接 声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣…...

C#对INI配置文件进行读写操作方法

#region 读写ini配置文件/// <summary>/// 对INI文件进行读写/// </summary>class INIHelper{/// <summary>/// 从INI文件中读取数据/// </summary>/// <param name"filePath">INI文件的全路径</param>/// <param name"…...

华为鸿蒙内核成为HarmonyOS NEXT流畅安全新基座

HDC2024华为重磅发布全自研操作系统内核—鸿蒙内核&#xff0c;鸿蒙内核替换Linux内核成为HarmonyOS NEXT稳定流畅新基座。鸿蒙内核具备更弹性、更流畅、更安全三大特征&#xff0c;性能超越Linux内核10.7%。 鸿蒙内核更弹性&#xff1a;元OS架构&#xff0c;性能安全双收益 万…...

请求响应(学习笔记)

请求响应 文章目录 请求响应请求Postman简单参数实体参数数组集合参数数组参数集合参数 日期参数JSON参数路径参数 响应响应数据统一响应结果 分层解耦三层架构分层解耦IOC & DI 入门IOC详解DI详解 请求响应&#xff1a; 请求(HttpServeltRequest)&#xff1a;获取请求数据…...

JavaScript核心语法(5)

这篇文章讲一下ES6中的核心语法&#xff1a;扩展运算符和模块化。 目录 1.扩展运算符 数组中的扩展运算符 基本用法 合并数组 对象中的扩展运算符 基本用法 合并对象 与解构赋值结合使用 数组解构中的剩余元素 对象解构中的剩余属性 2.模块化 基本概念 1.扩展运算符…...

2024年第15届蓝桥杯C/C++组蓝桥杯JAVA实现

目录 第一题握手&#xff0c;这个直接从49累加到7即可&#xff0c;没啥难度&#xff0c;后面7个不握手就好了&#xff0c;没啥讲的&#xff0c;(然后第二个题填空好难&#xff0c;嘻嘻不会&#xff09; 第三题.好数​编辑 第四题0R格式 宝石组合 数字接龙 最后一题:拔河 第…...

MongoDB 和 Redis 是两种不同类型的数据库比较

MongoDB 和 Redis 是两种不同类型的数据库&#xff0c;设计目标和应用场景各有侧重&#xff0c;因此性能对比需要结合具体需求场景进行评估。 1. MongoDB 性能特点 类型: 文档型数据库&#xff08;NoSQL&#xff09;。适合场景: 复杂查询&#xff1a;支持丰富的查询语法和索引…...

CLIP-Adapter: Better Vision-Language Models with Feature Adapters 论文解读

abstract 大规模对比视觉-语言预训练在视觉表示学习方面取得了显著进展。与传统的通过固定一组离散标签训练的视觉系统不同&#xff0c;(Radford et al., 2021) 引入了一种新范式&#xff0c;该范式在开放词汇环境中直接学习将图像与原始文本对齐。在下游任务中&#xff0c;通…...

Spring Boot 开发环境搭建详解

下面安装spring boot的详细步骤&#xff0c;涵盖了从安装 JDK 和 Maven 到创建和运行一个 Spring Boot 项目的全过程。 文章目录 1. 安装 JDK步骤 1.1&#xff1a;下载 JDK步骤 1.2&#xff1a;安装 JDK步骤 1.3&#xff1a;配置环境变量 2. 安装 Maven步骤 2.1&#xff1a;下载…...

网络安全中的数据科学如何重新定义安全实践?

组织每天处理大量数据&#xff0c;这些数据由各个团队和部门管理。这使得全面了解潜在威胁变得非常困难&#xff0c;常常导致疏忽。以前&#xff0c;公司依靠 FUD 方法&#xff08;恐惧、不确定性和怀疑&#xff09;来识别潜在攻击。然而&#xff0c;将数据科学集成到网络安全中…...

安装数据库客户端工具

如果没有勾选下面的&#xff0c;可以运行下面的两个命令 红框为自带数据库 新建数据库 右键运行mysql文件&#xff0c;找到数据库&#xff0c;并刷新...

GoogleTest做单元测试

目录 环境准备GoogleTest 环境准备 git clone https://github.com/google/googletest.git说cmkae版本过低了&#xff0c;解决方法 进到googletest中 cmake CMakeLists.txt make sudo make installls /usr/local/lib存在以下文件说明安装成功 中间出了个问题就是&#xff0c;…...

深入解析 EasyExcel 组件原理与应用

✨深入解析 EasyExcel 组件原理与应用✨ 官方&#xff1a;EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网 在日常的 Java 开发工作中&#xff0c;处理 Excel 文件的导入导出是极为常见的需求。 今天&#xff0c;咱们就一起来深入了解一款非常实用的操作 Exce…...

JSON数据转化为Excel及数据处理分析

在现代数据处理中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;因其轻量级和易于人阅读的特点而被广泛使用。然而&#xff0c;有时我们需要将这些JSON数据转化为Excel格式以便于进一步的分析和处理。本文将介绍如何将JSON数据转化为Excel文件&#xff0…...

(计算机网络)期末

计算机网络概述 物理层 信源就是发送方 信宿就是接收方 串行通信--一次只发一个单位的数据&#xff08;串行输入&#xff09; 并行通信--一次可以传输多个单位的数据 光纤--利用光的反射进行传输 传输之前&#xff0c;要对信源进行一个编码&#xff0c;收到信息之后要进行一个…...

【AI技术赋能有限元分析应用实践】将FEniCS 软件安装在Ubuntu22.04

FEniCS 完整介绍 FEniCS 是一个开源的计算工具包,专门用于解决偏微分方程(PDE)的建模和求解。它以灵活的数学抽象和高效的计算性能著称,可以让用户使用高层次的数学表达来定义问题,而无需关注底层的数值实现细节。 具体来看,FEniCS 是一个开源的高性能计算工具包,用于…...

男女做啊免费视频网站/网站技术制作

来自&#xff1a;http://kakajw.iteye.com/blog/1063843&#xff0c;感谢作者解决问题。 Tomcat 5.5使EL表达式不被解析。 现象 代码${userSession.user_name}是JSP中的一个代码片段&#xff1b; 如果部署到tomcat5.5中&#xff0c;不会显示出session中的变量user用户名,而只会…...

钓鱼网站教程/河南网站建设制作

1.关系型数据库简单的可以理解为二维数据库&#xff0c;表的格式就如Excel&#xff0c;有行有列。常用的关系数据库有Oracle&#xff0c;SqlServer&#xff0c;Informix&#xff0c;MySql&#xff0c;SyBase等。&#xff08;也即是我们平时看到的数据库&#xff0c;都是关系型数…...

惠州做棋牌网站建设哪家公司收费合理/百度营销后台

文章目录**1. 概述****2. String类的特点****3. 常见操作方法****3.1 构造方法****3.2 判断功能****3.3 获取功能****3.4 转换功能****3.5 其他功能****4. String类练习**4.1 把数组中的数据按照指定个格式拼接成一个字符串**4.2 字符串反转****4.3 统计大串中小串出现的次数**…...

佛山新网站建设平台/推广注册app拿佣金

这几天搞Windows离线断网环境下安装Python包&#xff0c;配置环境&#xff0c;各种坑&#xff01;做个记录&#xff0c;供以后查询吧。# 生产环境 windows 7# python 2.7.9# pip 1.5.2友情提示&#xff1a;当你遇到无法安装包的不明错误时&#xff0c;可以回头来考虑如下建议了…...

修改wordpress标题图片/百度seo排名优化价格

Devops一般很少时间会花在数据库的部署上&#xff0c;只有到了不得不去考虑的情况下&#xff0c;才会去考虑如何调整数据库&#xff0c;以适应业务的发展。mongodb本身就很适合Devops&#xff0c;大部分情况下&#xff0c;部署基本按照说明操作一下即可。但实际操作起来&#x…...

手机有软件做ppt下载网站有哪些内容吗/百度网站下载安装

...