速度革命: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 在实际项目中的巨大潜力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/480021.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【逐行注释】自适应观测协方差R的AUKF(自适应无迹卡尔曼滤波,MATLAB语言编写),附下载链接

文章目录 自适应R的UKF逐行注释的说明运行结果部分代码各模块解释 自适应R的UKF 自适应无迹卡尔曼滤波(Adaptive Unscented Kalman Filter,AUKF)是一种用于状态估计的滤波算法。它是基于无迹卡尔曼滤波(Unscented Kalman Filter&…

实现 Browser 客户端下载 XML 文件功能

后端 使用 io.BytesIO 方法 创建一个字节缓冲区在不需要磁盘文件的情况下进行文件操作打包为 zip 压缩包(上图代码)in_memory_zip.seek(0) 数据写入ZIP后文件指针会停留在缓冲区的末尾将文件指针重置回开头make_response() 方法用于创建HTTP响应的函数.g…

几个bev模型部署常用的命令

#bevformer 相比bevfusion多了canbus(因为引入了时序注意力机制) ##迷你版数据集 python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes --version v1.0-mini ##标准版 python tools/crea…

大数据新视界 -- Hive 数据分区:精细化管理的艺术与实践(上)(7/ 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

web博客系统的自动化测试

目录 前言测试用例编写自动化脚本测试准备博客登录页相关测试用例登陆成功登录失败 博客首页相关测试用例登陆成功登录失败 博客详情页相关测试用例登录成功登录失败 博客编辑页相关测试用例登陆成功登录失败 编写测试文档测试类型内容 前言 本次测试是运用个人写的一个博客系…

Flink高可用配置(HA)

从Flink架构中我们可以看到,JobManager这个组件非常重要,是中心协调器,负责任务调度和资源管理。默认情况下,每个Flink集群只有一个JobManager实例。这会产生单点故障(SPOF):如果JobManager崩溃,则无法提交新程序,正在运行的程序也会失败。通过JobManager的高可用性,…

基于Springboot的流浪宠物管理系统

基于javaweb的流浪宠物管理系统 介绍 基于javaweb的流浪宠物管理系统的设计与实现,后端框架使用Springbootmybatis,前端框架使用Vuehrml,数据库使用mysql,使用B/S架构实现前台用户系统和后台管理员系统,和不同权限级别…

unity 绿幕抠图

1.硬件:Insta360 Link 2C摄像机 2.引用shader Shader "Demo/ChromaKey" { Properties { _MainTex("Texture", 2D) "white" {} _KeyColor("KeyColor", Color) (0,1,0,0) _TintColor(&q…

Linux中离线安装gcc

gcc在安装一些其他工具的经常用到,在此记录下如何安装gcc。 1.在线安装 yum -y install gcc 2.离线安装 2.1 获取安装包链接: https://pan.baidu.com/s/1oDvt64ByWs1w-evz5TXU7w?pwd9cfo mpfr-3.1.1-4.el7.x86_64.rpmlibmpc-1.0.1-3.el7.x86_64.rp…

继续完善wsl相关内容:基础指令

文章目录 前言一、我们需要安装wsl,这也是安装docker desktop的前提,因此我们在这篇文章里做了介绍:二、虽然我们在以安装docker desktop为目的时,不需要安装wsl的分发(distribution),但是装一个分发也是有诸多好处的:三、在使用wsl时,不建议把东西直接放到系统里,因…

GITEX GLOBAL聚焦AI创新,Soul App创始人张璐团队带来多模态社交新体验

2024年10月,全球瞩目的科技盛会GITEX GLOBAL在迪拜举行。作为全球三大IT展之一,GITEX GLOBAL一直是展示全球尖端科技的重要平台,今年吸引了全球超6700家科技企业及创新公司参展。 在此次展会中,Soul App创始人张璐团队携自主研发的多模态大模型首次在国际大型展会亮相,展示了其…

C++——map相关的oj题

前言:菜鸟写博客给自己看,我是菜鸟。 1:随机链表的复制 1.1题目要求: 1.2解题思路: 可以分两步来实现代码: ①先将示例1链表中的val值以及next的指向关系深拷贝到另一个新的链表当中 ②再处理新链表中&am…

go web单体项目 学习总结

为什么学习go 博主的主语言是Java,目前的工作也是做Java web开发,有了Java的经验后就想着再学一门语言,其实有两个原因,第一是基于兴趣,也想和Java对比下到底有什么不同,在学习go的时候让我更加了解了Java…

paimon的四种changelog模式(2)-none模式

# 请先了解input模式 环境创建 CREATE CATALOG fs_catalog WITH (typepaimon,warehousefile:/data/soft/paimon/catalog );USE CATALOG fs_catalog;drop table if exists t_changelog_none ;CREATE TABLE t_changelog_none (age BIGINT,money BIGINT,hh STRING,PRIMARY KEY (h…

新型大语言模型的预训练与后训练范式,阿里Qwen

前言:大型语言模型(LLMs)的发展历程可以说是非常长,从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初,LLM的训练过程只关注预训练,但后来逐步扩展到了包括预训练和后训练在内的完整…

NAT:连接私有与公共网络的关键技术(4/10)

一、NAT 的工作原理 NAT 技术的核心功能是将私有 IP 地址转换为公有 IP 地址,使得内部网络中的设备能够与外部互联网通信。其工作原理主要包括私有 IP 地址到公有 IP 地址的转换、端口号映射以及会话表维护这几个步骤。 私有 IP 地址到公有 IP 地址的转换&#xff1…

notepad++文件github下载

1、github下载网址:Releases notepad-plus-plus/notepad-plus-plus GitHub 2、找到操作系统支持的软件: 3、CSDN下载链接:https://download.csdn.net/download/u013083576/90046203

【AI绘画】Midjourney进阶:色调详解(下)

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AI绘画 | Midjourney 文章目录 💯前言💯Midjourney中的色彩控制为什么要控制色彩?为什么要在Midjourney中控制色彩? 💯色调纯色调灰色调暗色调 &#x1f4af…

【MySQL篇】持久化和非持久化统计信息的深度剖析(第一篇,总共六篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…

PH热榜 | 2024-11-27

DevNow 是一个精简的开源技术博客项目模版,支持 Vercel 一键部署,支持评论、搜索等功能,欢迎大家体验。 在线预览 1. Agentplace 标语:这是一个能创建互动式AI网站和应用的平台。 介绍:Agentplace是一个平台&#xf…