极速 JavaScript 打包器:esbuild

文章目录

    • 引言
    • 什么是esbuild?
    • esbuild的特点
    • esbuild如何实现如此出色的性能?
    • esbuild缺点
    • 基本配置
        • 入口文件
        • 输出文件
        • 模块格式
        • target
        • platform
        • external
        • banner和footer
    • 高级配置
        • 插件系统
        • 自定义插件
        • 压缩代码
        • 调试代码
    • 结论
    • 😶 写在结尾

引言

esbuild是一个快速、可扩展的JavaScript打包器和压缩器,它的目标是成为最快的打包器。它使用Go编写,可以在几乎瞬间内完成大多数项目的构建。在本文中,我们将深入了解esbuild,并探讨其如何实现如此出色的性能。

什么是esbuild?

esbuild 是一款基于 Go 语言开发的 javascript 构建打包工具,相比传统的构建工具,主打性能优势。同样规模的项目,使用 Esbuild 可以将打包速度提升 10 - 100 倍,这对广大一直饱受 Webpack 缓慢打包速度折磨的开发人员来说,简直就是福音。

image.png

esbuild的特点

1. 极快的构建速度

esbuild被设计为最快的JavaScript打包器之一。它使用Go编写,并且可以在几乎瞬间内完成大多数项目的构建。这使得它成为处理大型代码库和快速迭代开发过程中不可或缺的工具。

2. 可扩展性

esbuild支持插件系统,这使得开发人员可以根据自己的需求进行自定义配置。插件系统还允许开发人员添加自定义转换器和加载程序。

3. 支持多种模块格式

esbuild支持多种模块格式,包括CommonJS、ES6模块、AMD和UMD等。这使得开发人员可以轻松地将现有代码库迁移到esbuild中。

4. 支持TypeScript

esbuild支持TypeScript,并且可以直接处理TypeScript文件。这意味着开发人员无需安装额外的TypeScript编译器即可使用TypeScript。

5. 支持JSX

esbuild支持JSX,并且可以直接处理JSX文件。这意味着开发人员无需安装额外的Babel插件即可使用JSX。

esbuild如何实现如此出色的性能?

1. Go语言

esbuild使用Go语言编写,这使得它比其他JavaScript打包器更快。Go语言具有出色的并发性能和内存管理功能,这使得它非常适合用于构建工具。

2. 并行化处理

esbuild使用并行化处理来加速构建过程。它会将输入文件分成多个块,并在多个CPU核心上同时处理每个块。这样做可以显著提高构建速度。

例如,在一个包含10个JavaScript文件的项目中,如果将输入文件分成5个块,则每个块包含2个JavaScript文件。然后,在4核CPU上运行时,每个核心将同时处理一个块中的2个JavaScript文件。

3. AST优化

esbuild会对输入代码进行AST(抽象语法树)优化以提高性能。AST优化是一种通过修改代码结构来提高执行效率的技术。

例如,在一个包含大量重复代码或未使用变量/函数等未优化代码段的项目中,AST优化可以通过删除重复代码或未使用变量/函数等未优化代码段来减小输出文件大小并提高性能。

4. Tree shaking

Tree shaking是一种通过删除未使用代码来减小输出文件大小的技术。esbuild会对输入代码进行Tree shaking以减小输出文件大小并提高性能。

例如,在一个包含大量未被引用或未被执行函数/变量等冗余代码段的项目中,Tree shaking可以通过删除冗余代码段来减小输出文件大小并提高性能。

示例

下面是一个简单示例:

// index.js
import { add } from './math.js';

console.log(add(1, 2));

// math.js
export function add(a, b) {
  return a + b;
}

export function subtract(a, b) {
  return a - b;
}

运行以下命令:

npx esbuild index.js --bundle --outfile=out.js

则会生成以下输出:

// out.js
function add(a, b) {
  return a + b;
}

console.log(add(1, 2));

在此示例中,由于subtract函数没有被引用或执行,则Tree shaking会将其删除以减小输出文件大小并提高性能。

esbuild缺点

尽管esbuild具有许多优点,但它也有一些缺点。下面是一些esbuild的缺点:

  • 社区生态相对较小
  • 没有 TS 类型检查
  • 不支持代码分割
  • 不支持多种语言(比如vue)
  • 不能操作 AST
  • 不支持装饰器语法
  • 产物 target 无法降级到 ES5 及以下,不能兼容一些低版本浏览器

基本配置

入口文件

在使用esbuild时,需要指定入口文件。可以使用--entry选项指定入口文件,例如:

npx esbuild --entry=index.js --outfile=out.js
输出文件

在使用esbuild时,需要指定输出文件。可以使用--outfile选项指定输出文件,例如:

npx esbuild --entry=index.js --outfile=out.js
模块格式

在使用esbuild时,需要指定模块格式。可以使用--format选项指定模块格式,例如:

npx esbuild --entry=index.js --outfile=out.js --format=esm

支持的模块格式包括:esm(ES6模块)、cjs(CommonJS)、iife(立即执行函数)、amd(AMD)和umd(UMD)。

target

target选项用于指定输出代码的目标环境。可以使用--target选项指定目标环境,例如:

npx esbuild --entry=index.js --outfile=out.js --target=es2015

支持的目标环境包括:es2015(ES6)、es2016(ES7)、es2017(ES8)、es2018(ES9)、es2019(ES10)、es2020(ES11)和esnext(最新版本)。

platform

platform选项用于指定输出代码的平台。可以使用--platform选项指定平台,例如:

npx esbuild --entry=index.js --outfile=out.js --platform=node

支持的平台包括:browser(浏览器)和node(Node.js)。

external

在使用esbuild时,你可以选择将某些模块排除在输出文件之外。可以使用--external:module-name[=variable-name]... 选项排除模块,例如:

npx esbuild --entry=index.js --outfile=out.js --external:react --external:react-dom

在此示例中,我们将React和React DOM排除在输出文件之外。

banner和footer

在使用esbuild时,你可以选择在输出文件的开头或结尾添加自定义文本。可以使用 --banner:file=path/to/banner.txt --footer:file=path/to/footer.txt 选项添加文本,例如:

npx esbuild --entry=index.js --outfile=out.js \ --banner:file=header.txt \ --footer:file=footer.txt

在此示例中,我们将header.txt添加到输出文件开头,并将footer.txt添加到输出文件结尾。

高级配置

插件系统

esbuild支持插件系统,这使得开发人员可以根据自己的需求进行自定义配置。插件系统还允许开发人员添加自定义转换器和加载程序。 例如,在使用Less或Sass等CSS预处理器时,你可以使用相应的插件来实现。以下是一个示例:

// esbuild.config.js
const sassPlugin = require('esbuild-plugin-sass');
module.exports = {
  entryPoints: ['index.js'],
  outfile: 'out.js',
  plugins: [sassPlugin()],
};
自定义插件

除了使用现有插件外,你还可以编写自己的插件来扩展esbuild。以下是一个示例:

// my-plugin.js
module.exports = (options = {}) => ({
  name: 'my-plugin',
  setup(build) {
    build.onLoad({ filter: /.txt$/ }, async (args) => {
      const contents = await fs.promises.readFile(args.path, 'utf8');
      return { contents };
      });
    },
});
// esbuild.config.js
const myPlugin = require('./my-plugin');
module.exports = {
  entryPoints: ['index.js'],
  outfile: 'out.js',
  plugins: [myPlugin()],
};

在此示例中,我们编写了一个名为my-plugin的插件,并将其添加到了配置文件中。该插件会在加载.txt文件时读取其内容并返回给构建器。

压缩代码

在使用esbuild时,你可以选择是否压缩代码以减小输出文件大小并提高性能。可以使用--minify选项压缩代码,例如:

npx esbuild --entry=index.js --outfile=out.min.js --minify
调试代码

在使用esbuild时,你可以选择是否生成调试信息以便于调试代码。可以使用--sourcemap选项生成调试信息,例如:

npx esbuild --entry=index.js --outfile=out.min.js --minify --sourcemap=inline

支持的sourcemap类型包括:inline(内联)、external(外部)和sources-content(包含源代码内容)。

结论

总之,如果你正在寻找一个快速、可扩展且易于配置的JavaScript打包器和压缩器,那么你应该考虑使用esbuild。它具有极快的构建速度、可扩展性、支持多种模块格式、支持TypeScript和JSX等特点,并且通过Go语言、并行化处理、AST优化和Tree shaking等技术实现了出色的性能表现。在选择使用esbuild时,请考虑其优点和缺点,并根据自己项目的需求进行选择。

😶 写在结尾

前端设计模式专栏
在这里插入图片描述
设计模式是软件开发中不可或缺的一部分,它们帮助我们解决了许多常见问题,并提供了一种优雅而可靠的方式来构建应用程序。在本专栏中,我们介绍了所有的前端设计模式,包括观察者模式、单例模式、策略模式等等。通过学习这些设计模式,并将其应用于实际项目中,我们可以提高代码的可维护性、可扩展性和可重用性。希望这个专栏能够帮助你在前端开发中更好地应用设计模式,写出高质量的代码。点击订阅前端设计模式专栏

Vue专栏
在这里插入图片描述
Vue.js是一款流行的JavaScript框架,用于构建用户界面。它采用了MVVM(Model-View-ViewModel)的架构模式,通过数据驱动和组件化的方式,使开发者能够更轻松地构建交互性强、可复用的Web应用程序。在这个专栏中,我们将深入探讨Vue.js的核心概念、组件开发、状态管理、路由和性能优化等方面的知识。我们将学习如何使用Vue.js构建响应式的用户界面,并探索其强大的生态系统,如Vue Router和Vuex、Pinia。通过学习这些内容,你将能够成为一名熟练的Vue.js开发者,并能够应用这些知识来构建复杂而高效的Web应用程序。点击订阅Vue专栏

JavaScript(ES6)专栏在这里插入图片描述
JavaScript是一种广泛应用于网页开发和后端开发的脚本语言。它具有动态性、灵活性和易学性的特点,是构建现代Web应用程序的重要工具之一。在这个专栏中,我们将深入探讨JavaScript语言的基本语法、DOM操作、事件处理、异步编程以及常见算法和数据结构等内容。此外,我们还将介绍ES6(ECMAScript 2015)及其后续版本中引入的新特性,如箭头函数、模块化、解构赋值等。通过学习这些内容,你将能够成为一名熟练的JavaScript开发者,并能够应用这些知识来构建出高质量和可维护的Web应用程序。点击订阅JavaScript(ES6)专栏

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

月薪15000在春晚分会场西安,够花吗?

千寻的结论: 如果有房无贷,另一半也有工作收入,父母身体健康且均有不错的退休金, 满足这些条件的话,在西安月入1.5W是相当不错。

苹果电脑菜单栏应用管理软件Bartender 4 mac软件特点

Bartender mac是一款可以帮助用户更好地管理和组织菜单栏图标的 macOS 软件。它允许用户隐藏和重新排列菜单栏图标,从而减少混乱和杂乱。 Bartender mac软件特点 菜单栏图标隐藏:Bartender 允许用户隐藏菜单栏图标,只在需要时显示。这样可以…

Flutter 图片和资源的高效使用指南

Flutter 应用程序包含代码和 assets(也为资源)。资源是被打包到应用程序安装包中,可以在运行时访问的一种文件。常见的资源类型包括静态数据(例如 JSON 文件),配置文件,图标和图片(J…

14:00面试,14:08就出来了,问的问题过于变态了。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到10月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40…

springboot第47集:【思维导图】面向对象,关键字,标识符,变量,数组的使用...

关键字:class,public,static,void等,特点是全部关键字都是小写字母。 image.png image.png 凡是自己起的名字可以叫标识符 image.png image.png image.png image.png 整数类型的使用 image.png image.png image.png 浮点类型 image.png image.png 字符类…

回归预测 | Matlab实现基于GA-Elman遗传算法优化神经网络多输入单输出回归预测

回归预测 | Matlab实现基于GA-Elman遗传算法优化神经网络多输入单输出回归预测 目录 回归预测 | Matlab实现基于GA-Elman遗传算法优化神经网络多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于GA-Elman遗传算法优化神经网络多输入单输…

Java重修第一天—学习数组

1. 认识数组 建议1.5倍速学习,并且关闭弹幕。 数组的定义:数组是一个容器,用来存储一批同种类型的数据。 下述图:是生成数字数组和字符串数组。 为什么有了变量还需要定义数组呢?为了解决在某些场景下,变…

安装extiverse/mercury时报错

问题描述 作者在安装 Flarum 的插件 extiverse/mercury 时报错,内容如下图所示 解决方案 ⚠警告:请备份所有数据再进行接下来的操作,此操作可能会导致网站不可用! 报错原因:主要问题是在安装过程中解决依赖关系。具…

Day24 回溯算法part01 理论基础 77.组合

回溯算法part01 理论基础 77.组合 理论基础(转载自卡码网) 什么是回溯法 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 在二叉树系列中,我们已经不止一次,提到了回溯,例如二叉树:以为使用了递归,其…

nVisual如何实现数据中心资产管理

背景 随着信息技术的迅速发展,数据中心已经成为了企业信息化建设的重要基础设施之一。数据中心不仅承载着大量的企业数据和业务应用,而且也需要大量的资产投入来支持其运营和发展。 因此,数据中心资产管理的重要性也日益凸显,数…

SparkStreaming基础解析(四)

1、 Spark Streaming概述 1.1 Spark Streaming是什么 Spark Streaming用于流式数据的处理。Spark Streaming支持的数据输入源很多,例如:Kafka、Flume、Twitter、ZeroMQ和简单的TCP套接字等等。数据输入后可以用Spark的高度抽象原语如:map、…

OpenCV-15位运算

OpenCV中的逻辑运算就是对应位置的元素进行与、或、非和异或。 Opencv与Python不同的是:OpenCV中0的非反过来是255,255反过来是0。 但是Python中255非为-256。 一、非运算 使用API---cv.bitwise_not(str) 示例代码如下: import cv2 imp…

Jenkins集成部署java项目

文章目录 Jenkins简介安装 Jenkins简介 Jenkins能实时监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象的展示项目构建的趋势和稳定性。 官网 安装 在官网下载windows版本的Jenkins 但是我点击这里浏览器没有反应&#xff0…

系列十一、(一)Sentinel简介

一、Sentinel简介 1.1、官网 【英文文档】 https://github.com/alibaba/Sentinel/wiki【中文文档】 https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5 1.2、概述 1.3、功能

JAVA基本语法(关键字,保留字)和快捷键

java基本语法: 1 大小写敏感 2 类名首字母大写 3 变量名、方法名首字母小写,遵循驼峰命名法 4 源文件名必须和类相同 命名法: 驼峰命名法(推荐):由若干单词组成,每个单词首字母大写&#…

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-3流体系统建模

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-12课程介绍电路系统建模、基尔霍夫定律 流量 flow rate q q q m 3 / s m^3/s m3/s 体积 volume V V V m 3 m^3 m3 高度 heigh h h h m m m 压强 pressure p p p …

在线的omniplan甘特图制作工具

在线的omniplan甘特图制作工具 快捷键 按住空格键 可以拖动画布Tab 将选中的任务右缩进(设置为子任务)Shift Tab 将选中的任务提升一级(取消子任务)按住Shift可以选择多个任务按住Ctrl 或者 Mac 的 command 可以选择多个任务按…

threejs在透视相机模式下,绘制像素大小固定的元素

要求:在透视相机模式下绘制一个图标,图标大小始终为32*32px。图标如下: 实现思路: 使用THREE.Sprite。因为 SpriteMaterial 支持配置 sizeAttenuation 使Sprite大小不随相机的深度而衰减。所以我们只要保证sprite的初始的大小合适…

qt源码阅读准备

qt源码阅读准备 阅读qt源码前先了解以下知识,对阅读qt源码有极大的好处。 D-pointer介绍 D-pointer介绍 d-pointer它可以把一个类库的实施细节对使用的用户隐藏, 而且对实施的更改不会打破二进制兼容。其基本贯穿qt所有类。 Qt类的的结构 我们以QO…

第84讲:基于各种场景使用mysqldump逻辑备份数据库

文章目录 1.mysqldump备份工具的语法格式2.使用mysqldump进行全库备份3.备份单个库或者多个库的数据4.备份某个库下的单表或者多表的数据5.mysqldump备份数据库时必加的一些参数5.1.基本参数5.2.核心参数 6.mysqldump备份数据库时的一些其他参数 1.mysqldump备份工具的语法格式…