什么是 Esbuild?

Esbuild 是由 Figma 的 CTO 「Evan Wallace」基于 Golang 开发的一款打包工具,相比传统的打包工具,主打性能优势,在构建速度上可以快 10~100 倍。

受够了webpack缓慢的打包速度,越来越多的团队开始探索采用更加底层的语言来编写前端的打包工具,以此来突破JavaScript语言的瓶颈。

esbuild便是其中非常具有代表性的工具之一,它采用Go语言编写,经过了vitenest.js的检验,开创了构建工具性能的新时代。

其主要特点:

  • 无需缓存即可实现极高的速度
  • 内置JavaScript、CSS、TypeScript``和JSX
  • 直接用于CLI、JS和Go的API
  • 打包ESM和CommonJS模块
  • 打包CSS,包括CSS modules
  • Tree shaking, minification, source maps
  • Local server, watch mode, plugins

esbuild中文文档

https://esbuild.uihtm.com

Esbuild架构优势

1. Golang 开发

采用 Go 语言开发,相比于 单线程 + JIT 性质的解释型语言 ,使用 Go 的优势在于 :

一方面可以充分利用多线程打包,并且线程之间共享内容,而 JS 如果使用多线程还需要有线程通信(postMessage)的开销;

另一方面直接编译成机器码,而不用像 Node 一样先将 JS 代码解析为字节码,然后转换为机器码,大大节省了程序运行时间。

2. 多核并行

内部打包算法充分利用多核 CPU 优势。Esbuild 内部算法设计是经过精心设计的,尽可能充分利用所有的 CPU 内核。所有的步骤尽可能并行,这也是得益于 Go 当中多线程共享内存的优势,而在 JS 中所有的步骤只能是串行的。

3. 从零造轮子

从零开始造轮子,没有任何第三方库的黑盒逻辑,保证极致的代码性能。

  1. 高效利用内存

    一般而言,在 JS 开发的传统打包工具当中一般会频繁地解析和传递 AST 数据,比如 string -> TS -> JS -> string,这其中会涉及复杂的编译工具链,比如 webpack -> babel -> terser,每次接触到新的工具链,都得重新解析 AST,导致大量的内存占用。而 Esbuild 中从头到尾尽可能地复用一份 AST 节点数据,从而大大提高了内存的利用效率,提升编译性能。

esbuild 与传统工具的对比

特性 esbuild Webpack Rollup
构建速度 极快(10-100 倍) 较慢 较快
配置复杂度 简单 复杂 中等
插件系统 灵活 非常灵活 灵活
支持的文件格式 JS、TS、JSX、CSS 多种格式(需插件支持) JS、TS、JSX
社区生态 较小 非常成熟 成熟

使用场景

1. 小型项目

对于小型项目,esbuild 的极速构建和简洁配置使其成为理想选择。开发者可以快速完成项目的打包工作,无需复杂的配置。

2. 大型项目

对于大型项目,esbuild 的并行处理能力和插件系统可以显著提升构建效率。虽然 esbuild 的社区生态不如 Webpack 成熟,但其性能优势足以弥补这一不足。

3. 前端框架项目

esbuild 支持 JSX 和 TypeScript,非常适合用于 React、Vue 等前端框架项目。通过插件系统,可以轻松扩展其功能,满足复杂项目的需求。

安装 esbuild

在使用 esbuild 之前,首先需要安装它。你可以通过 npm 或 yarn 来安装 esbuild:

npm install esbuild --save-dev

yarn add esbuild --dev

使用 esbuild 打包 JavaScript 文件

首先,创建一个简单的项目结构:

my-project/
├── src/
│ └── index.js
└── package.json

在 src/index.js 文件中,添加一些简单的 JavaScript 代码:

// src/index.js
console.log("Hello, esbuild!");

接下来,我们编写一个简单的 esbuild 配置文件,用于打包 src/index.js 文件。

在项目根目录下创建一个 build.js 文件,内容如下:

编写 esbuild 配置

const esbuild = require('esbuild');

esbuild.build({
entryPoints: ['src/index.js'],
outfile: 'dist/bundle.js',
bundle: true,
minify: true,
sourcemap: true,
}).catch(() => process.exit(1));

在这个配置中:

  • entryPoints:指定入口文件,即 src/index.js。
  • outfile:指定输出文件的路径,即 dist/bundle.js。
  • bundle:设置为 true,表示将所有依赖打包到一个文件中。
  • minify:设置为 true,表示对输出文件进行压缩。
  • sourcemap:设置为 true,表示生成 source map 文件,方便调试。

运行打包命令

在终端中运行以下命令来执行打包:

node build.js

运行完成后,你会在 dist 目录下看到生成的 bundle.js 文件。

验证打包结果

你可以通过在浏览器中打开一个简单的 HTML 文件来验证打包结果。在项目根目录下创建一个 index.html 文件,内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>esbuild Example</title>
</head>
<body>
<script src="dist/bundle.js"></script>
</body>
</html>

在浏览器中打开 index.html,你应该会在控制台中看到 Hello, esbuild! 的输出。

esbuild高级功能:使用插件

esbuild 支持插件机制,允许你通过插件来扩展其功能。例如,你可以使用插件来处理 CSS、图片、TypeScript 等资源。

安装插件

假设我们想要使用 esbuild-sass-plugin 来处理 Sass 文件,首先需要安装该插件:

npm install esbuild-sass-plugin --save-dev

修改配置文件

接下来,修改 build.js 文件,添加 Sass 插件:

const esbuild = require('esbuild');
const sassPlugin = require('esbuild-sass-plugin'); esbuild.build({
entryPoints: ['src/index.js'],
outfile: 'dist/bundle.js',
bundle: true,
minify: true,
sourcemap: true,
plugins: [sassPlugin()],
}).catch(() => process.exit(1));

添加 Sass 文件

在 src 目录下创建一个 styles.scss 文件,内容如下:

// src/styles.scss
body {
background-color: #f0f0f0;
h1 {
color: #333;
}
}

然后在 src/index.js 中引入这个 Sass 文件:

// src/index.js
import './styles.scss'; console.log("Hello, esbuild!");

打包完成后,dist/bundle.js 中将包含处理后的 CSS 代码。

总结

esbuild 作为一个新兴的 JavaScript 打包工具,以其极快的构建速度和简洁的 API 设计,迅速赢得了开发者的青睐。虽然它在社区生态和功能丰富度上还无法与 Webpack 等传统工具相比,但其性能优势使其成为小型项目和前端框架项目的理想选择。

Esbuild-新一代极速前端构建打包工具的更多相关文章

  1. 细说前端自动化打包工具--webpack

    背景 记得2004年的时候,互联网开发就是做网页,那时也没有前端和后端的区分,有时一个网站就是一些纯静态的html,通过链接组织在一起.用过Dreamweaver的都知道,做网页就像用word编辑文档 ...

  2. 简单理解 Webpack,以及Web前端使用打包工具的原因

    Java 中的模块 传统的前端开发就是 JS.HTML.CSS 三件套.Web 没有像 Java 一样拥有优秀的模块机制,就是类与类之间可以分装在不同的包下,不同包下的类互相引用时通过import导入 ...

  3. gulp前端构建化工具,帮你搞定不同浏览器的兼容性写法问题

    .相信所有的前端攻城狮.听到浏览器兼容性问题都深有体会. 浏览器兼容性问题,无非就是因为浏览器内核不同,浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况.还有就是根据浏览器的版本不同,所兼 ...

  4. 前端项目打包工具weexpack的安装

    最下面是本人安装时候的系统环境,本篇文章只限于参考,不一定非得是这样,原因你懂得. 打包的过程中出现的问题 1.执行到weexpack run android的时候,到了resolving class ...

  5. react纯前端不依赖于打包工具的代码

    ####react最基础的语法和不依赖环境的纯前端免编译代码 参照:http://www.ruanyifeng.com/blog/2015/03/react.html 注意事项:1.必须放倒服务器上, ...

  6. Buildroot构建指南——工具链

    Linux系统的交叉编译工具链用来将源代码变成bin文件或者库文件的一个软件.一般大家默认工具链等于gcc或者arm-linux-gcc,但是实际上,gcc只是工具链的编译器部分,不是全部,制作一个工 ...

  7. 窥探原理:实现一个简单的前端代码打包器 Roid

    roid roid 是一个极其简单的打包软件,使用 node.js 开发而成,看完本文,你可以实现一个非常简单的,但是又有实际用途的前端代码打包工具. 如果不想看教程,直接看代码的(全部注释):点击地 ...

  8. Buildroot构建指南——工具链【转】

    本文转载自:http://blog.csdn.net/zhou_chenz/article/details/52346134 Linux系统的交叉编译工具链用来将源代码变成bin文件或者库文件的一个软 ...

  9. 下一代的前端构建工具:parcel打包react

    1. parcel很受欢迎,webpack太慢了,试试Parcel下一代的前端构建工具 2.Parcel很快,但缺少好多插件,没有base64,没有办法拆分打包文件.... 3.总结:适合小项目 4. ...

  10. 前端构建工具之gulp(一)「图片压缩」

    前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ...

随机推荐

  1. Python3_模块(一)

    脚本是用 python解释器来编程,如果从 Python解释器退出再进入,那么你定义的所有的方法和变量就都消失了.为此 Python提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器 ...

  2. Spring连接线程的事务控制

    Spring连接线程的事务控制 通过把线程ThreadLocal绑定数据库来连接Connection来控制事务 源码 实现的方式不够优雅 代码实现 pom.xml <?xml version=& ...

  3. JSP (二) -- JSP与HTML集成开发

    目录 脚本 普通脚本 声明脚本 输出脚本 JSP注释 语法规则 JSP指令 page指令 include指令 taglib指令 动作标签 include useBean setProperty get ...

  4. 【记录】MATLAB|Python NumPy|两种语言的数组/矩阵中元素修改方式的总结和对比

    文章目录 二维矩阵 操作 1. 将数组大于0的数全部加1 2. 删除元素 ①删除单个元素 ②删除一列元素 3. 添加一行或多行 ①添加一行 ②添加多行 4. 获取行/列数 5. 格式化输出数组 结构数 ...

  5. 开启PyTorch的第一天

    为积极响应导师的要求,我开启了我的深度学习之旅,成为炼丹大队的一员. 今天先是安装PyTorch,路子大家网上已经摸的很清了,我主要参考的是 https://blog.csdn.net/weixin_ ...

  6. dify+MCP多应用,构建灵活的AI应用生态系统

    一.概述 前面几篇文章写很多MCP应用,基本上一个dify工作流使用一个MCP应用. 那么一个dify工作流,同时使用多个MCP应用,是否可以呢?答案是可以的. 先来看一下效果图 说明: 这里使用了问 ...

  7. 聊一聊 .NET Dump 中的 Linux信号机制

    一:背景 1. 讲故事 当 .NET程序 在Linux上崩溃时,我们可以配置一些参考拿到对应程序的core文件,拿到core文件后用windbg打开,往往会看到这样的一句信息 Signal SIGAB ...

  8. Github Copilot 实战: 从零开始用AI写一个OCR工具 (3)

    源码 https://github.com/densen2014/Blazor100/tree/master/AI/MiOcr 添加一个屏幕截图功能,显示截图起始点,结束点,截图区域,按键ESC取消截 ...

  9. IDEA配置实体类Serializable快捷键生成serialVersionUID

      创建实体类后,如果需要继承Serializable类并生成随机序列号serialVersionUID,在IDEA中使用Serializable快捷键最为合适,故这里为大家介绍如何配置此快捷键.   ...

  10. 解决Spring Boot项目后端接口返回数据中文乱码问题

    摘要 解决 Spring Boot 项目中,后端返回前端的结果出现中文乱码的问题.   这几天在使用 Spring Boot 学习AOP原理的时候,通过浏览器访问后端接口的时候,响应报文总是出现中文乱 ...