什么是 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. MySQL清理binlog的正确姿势

    本位主要讲述如何正确的清理 MySQL的binlog,里面有哪些坑,注意点有什么.   一. 为什么要清理binlog       如果没有设置MySQL的binlog过期时间或者设置的时间过长, 会 ...

  2. win mysql实现主从同步(精简版)

    最近项目要弄读写分离,那首先要实现主从同步啊,网上教程很多,但大多都看得云里雾里,so,有了这个精简版: 主库my.ini添加配置: #数据库ID号, 为1时表示为Master,其中master_id ...

  3. .net core项目代码提交忽略文件.gitignore的配置

    根据语言自动生成 1. 访问 .gitignore.io 首先,访问 https://www.gitignore.io/.这是一个非常有用的网站,可以根据你的开发环境自动生成 .gitignore 文 ...

  4. 工具 | MemShellParty

    0x00 简介 MemShellParty是一键常见中间件框架内存马生成工具.一键生成常见中间件框架内存马,让内存马测试变得简单高效,打造内存马的全方位学习平台 下载地址: MemShellParty ...

  5. np.random总结

    import numpy as np (1)np.random.random_sample help(np.random.random_sample) Help on built-in functio ...

  6. 6 指纹浏览器 CPU 核心数伪装教程

    目的 navigator.hardwareConcurrency 可用于获取当前设备的 CPU 逻辑核心数量.这一信息常被用于识别用户设备等级或作为浏览器指纹的一部分参与反欺诈系统分析. 通过伪造该信 ...

  7. Vue-lazyload实现图片懒加载

    前端多半是和页面打交道,我们在进行页面的展示的时候,对于图片过多的页面,为了加速页面加载速度,所以很多时候我们需要将页面内未出现在可视区域内的图片先不做加载,等到滚动到可视区域后再去加载.即需要使用到 ...

  8. HTTP请求中Content-Type的取值讲解

      在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息(MediaType),下面先看看请求信息的定义,MediaType,即Internet Media Type,互 ...

  9. python基于正则爬虫-小笔记

    一.re.match(),从字符串的起始位置开始匹配,比如hello,匹配模式第一个字符必须为 h 1.re.match(),模式'^hello.*Demo$',匹配字符串符合正则的所有内容 impo ...

  10. JuiceFS v1.3-Beta2:集成 Apache Ranger,实现更精细化的权限控制

    在大数据场景中,文件系统和应用组件的权限管理至关重要.在最新发布的 JuiceFS 社区版 v1.3-Beta 2 中,JuiceFS 引入了与 Apache Ranger 的集成,提供了更为灵活和细 ...