跳到主要内容

esbuild

Vite底层使用Esbuild实现对.ts、jsx、.js代码文件的转化,所以先看下什么是es-build。

Esbuild是一个JavaScript Bundler 打包和压缩工具,它提供了与Webpack、Rollup等工具相似的资源打包能力。

可以将JavaScript 和TypeScript代码打包分发在网页上运行。但其打包速度却是其他工具的10~100倍。

目前他支持以下的功能:

  • 加载器
  • 压缩
  • 打包
  • Tree shaking
  • Source map生成

esbuild总共提供了四个函数:transform、build、buildSync、Service。有兴趣的可以移步官方文档了解。

esbuild 官网: https://esbuild.github.io/

Esbuild 如何利用多线程

esbuild 是一个极快的 JavaScript 打包器和压缩器,它之所以能够达到惊人的速度,部分原因是因为它使用了 Go 语言编写,Go 语言本身就支持并发编程。esbuild 利用 Go 的高效并发模型来实现多线程的工作方式,从而显著提升了构建和压缩代码的速度。

以下是 esbuild 利用多线程(在 Go 中通常称为 goroutines)的几个关键点:

  1. 并发编译 esbuild 在处理模块和依赖时会启动多个 goroutines,允许它并行地编译多个文件。这种并行处理相比于单线程处理可以显著减少总体构建时间。

  2. 高效的文件读取和写入 在读取源文件和写入目标文件时,esbuild 也能够利用 Go 的并发特性来同时处理多个I/O操作,进一步提高了整体的性能。

  3. 最小化锁等待时间 esbuild 的设计尽量减少了锁的使用,即使在需要同步访问共享资源的情况下,也通过优化来最小化等待锁的时间。这保证了并发操作的效率,避免了常见的并发瓶颈。

  4. 利用 CPU 多核心 esbuild 能够自动利用多核心 CPU 的优势,通过在多个核心上分配工作来提高构建速度。这是通过 Go 运行时自动管理 goroutines 在系统可用的 CPU 核心之间的调度来实现的。

  5. 高效的内存管理 esbuild 利用 Go 的高效内存管理和垃圾收集机制,减少了内存的使用和泄漏的可能性,即使在处理大型项目时也能保持高效的性能。