JavaScript 构建工具格局已经发生了巨大变化。2025 年,开发者必须在 Webpack、Vite、esbuild 和 Turbopack 之间做出选择——每个工具都有截然不同的架构和权衡。本综合指南从开发服务器速度、生产构建性能、配置复杂度、插件生态和框架支持等维度全面对比这四个工具,帮助你为项目选择合适的打包器。
试试我们的 JS/HTML 格式化工具来美化你的构建输出 →
2025 年构建工具格局
现代 JavaScript 应用需要构建步骤。浏览器原生不支持 TypeScript、JSX、Vue SFC 或 CSS 模块。构建工具将你的源代码转换为浏览器可以执行的优化包。但工作远不止转译:构建工具还处理代码分割、树摇优化、热模块替换(HMR)、资源优化和依赖解析。
多年来,Webpack 是无可争议的霸主。它开创了代码分割、加载器和基于插件的架构等概念。但随着项目规模增长,其基于 JavaScript 的架构遇到了性能瓶颈。这为用更快语言编写的新一代工具打开了大门:esbuild(Go)、Vite(利用 esbuild + Rollup)和 Turbopack(Rust)。
核心矛盾在于成熟度与速度之间的权衡。Webpack 拥有最丰富的生态但构建较慢。esbuild 速度惊人但插件 API 有限。Vite 在开发时使用 esbuild、生产时使用 Rollup,取得了务实的平衡。Turbopack 由 Vercel 支持,旨在以 Rust 级别的性能成为 Webpack 的继任者。
Webpack:配置驱动的老将
Webpack 由 Tobias Koppers 于 2012 年创建,十多年来一直是大多数 JavaScript 项目的默认打包器。它将每个文件——JavaScript、CSS、图片、字体——都视为依赖图中的模块。Loader 转换文件,Plugin 扩展功能,输出是一个或多个优化后的包。
核心特性
- 代码分割——通过动态导入和 SplitChunksPlugin 实现自动和手动分块
- Loader——转换任何文件类型(babel-loader、ts-loader、css-loader、file-loader 等)
- Plugin——扩展构建流水线(HtmlWebpackPlugin、MiniCssExtractPlugin、DefinePlugin 等)
- 树摇优化——从包中消除未使用的导出(需要 ES 模块)
- Module Federation——在运行时在独立部署的应用之间共享代码
- 开发服务器——支持 HMR 的 webpack-dev-server
- Source Map——多种 source map 策略用于调试
- 缓存——持久化文件系统缓存加速重新构建(Webpack 5)
配置示例
// webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
entry: './src/index.tsx',
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].[contenthash].js',
clean: true,
},
resolve: {
extensions: ['.tsx', '.ts', '.js', '.jsx'],
alias: {
'@': path.resolve(__dirname, 'src'),
},
},
module: {
rules: [
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/,
},
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader'],
},
{
test: /\.(png|svg|jpg|jpeg|gif)$/i,
type: 'asset/resource',
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: './public/index.html',
}),
new MiniCssExtractPlugin({
filename: '[name].[contenthash].css',
}),
],
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all',
},
},
},
},
devServer: {
port: 3000,
hot: true,
historyApiFallback: true,
},
};优点
- 生态中最成熟、经过实战检验的打包器
- 最丰富的插件和 Loader 生态——几乎任何需求都有对应的插件
- Module Federation 支持微前端架构
- 详尽的文档和社区资源
- Webpack 5 的持久化缓存显著提升重建速度
- 对构建的每个环节都有细粒度控制
缺点
- 冷启动慢——基于 JavaScript 的架构限制了速度
- 配置复杂——webpack.config.js 可能增长到数百行
- HMR 比 Vite 慢(完整模块重新评估)
- 初学者学习曲线陡峭
- 依赖体积大——需要安装许多 Loader 和 Plugin
Vite:原生 ESM 开发服务器 + Rollup 生产构建
Vite(法语意为"快")由 Evan You(Vue.js 创始人)于 2020 年创建。它从根本上重新思考了开发服务器,利用浏览器原生的 ES 模块支持。Vite 不是在提供服务之前打包整个应用,而是直接将源文件作为 ES 模块提供,让浏览器处理导入。这使得无论项目多大,服务器启动都近乎即时。
在生产构建中,Vite 底层使用 Rollup,生成高度优化的包,具有出色的树摇优化。从 Vite 5 开始,它还在开发期间使用 esbuild 进行依赖预打包和 TypeScript/JSX 转译。
核心特性
- 原生 ESM 开发服务器——将源文件作为 ES 模块提供,开发期间无需打包
- 闪电般的 HMR——无论应用大小,更新都在毫秒内传播
- 依赖预打包——使用 esbuild 将 node_modules 依赖预打包为 ESM
- 基于 Rollup 的生产构建——成熟、优化的输出,支持代码分割和树摇
- CSS 代码分割——自动提取异步块使用的 CSS
- 优化的资源处理——图片、字体和其他资源的内容哈希
- SSR 支持——一流的服务端渲染原语
- 库模式——使用基于 Rollup 的输出格式(ESM、CJS、UMD)构建库
配置示例
// vite.config.ts
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import path from 'path';
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
},
},
server: {
port: 3000,
open: true,
},
build: {
rollupOptions: {
output: {
manualChunks: {
vendor: ['react', 'react-dom'],
router: ['react-router-dom'],
},
},
},
sourcemap: true,
minify: 'esbuild',
},
css: {
modules: {
localsConvention: 'camelCase',
},
},
});优点
- 开发服务器冷启动近乎即时——无需打包
- 生态中最快的 HMR——更新在 50ms 以内
- 简单、最少的配置——大多数框架开箱即用
- 不断增长的插件生态,兼容 Rollup 插件
- 一流的 TypeScript、JSX、CSS Modules 和 PostCSS 支持
- 出色的开发体验(DX),错误信息清晰
缺点
- 开发和生产使用不同的打包器(esbuild vs Rollup)——偶尔有行为差异
- Rollup 生产构建比纯 esbuild 构建慢
- 与 Webpack 相比插件生态较小
- 某些仅 CJS 的包需要额外配置进行预打包
- Module Federation 支持需要社区插件(非内置)
esbuild:速度恶魔
esbuild 由 Evan Wallace(Figma 联合创始人)于 2020 年创建。使用 Go 编写,它在 CPU 核心之间并行化工作,避免了 JavaScript 运行时的开销。结果是构建速度比基于 JavaScript 的打包器快 10-100 倍。esbuild 可以在不到一秒内打包一个大型项目,而 Webpack 需要 30 秒以上。
然而,esbuild 故意采用有限的插件 API,不打算逐一替代 Webpack 的功能。它作为转译器和打包器表现出色,但缺少 HMR、复杂的代码分割策略和 HTML 生成等高级功能。许多工具(包括 Vite)在内部使用 esbuild,同时在其之上添加更高级的功能。
核心特性
- 极致速度——用 Go 编写,比 JavaScript 打包器快 10-100 倍
- TypeScript 和 JSX——原生转译,无需 Babel
- 树摇优化——语句级别的死代码消除
- 压缩——快速、高质量的 JavaScript 和 CSS 压缩
- Source Map——快速生成 source map
- 多种输出格式——ESM、CJS 和 IIFE
- CSS 打包——原生 CSS 打包,支持 CSS 模块
- 监听模式——文件变更时增量重建
配置示例
// esbuild.config.mjs
import * as esbuild from 'esbuild';
await esbuild.build({
entryPoints: ['src/index.tsx'],
bundle: true,
outdir: 'dist',
format: 'esm',
splitting: true,
minify: true,
sourcemap: true,
target: ['es2020'],
loader: {
'.png': 'file',
'.svg': 'file',
},
define: {
'process.env.NODE_ENV': '"production"',
},
plugins: [],
});
// 或使用 CLI:
// esbuild src/index.tsx --bundle --outdir=dist
// --format=esm --splitting --minify --sourcemap优点
- 最快的可用构建工具——以毫秒而非秒计算
- 基本用例零配置
- 开箱即用的优秀 TypeScript 和 JSX 支持
- 极小的依赖体积——单一二进制文件
- 一致的速度——基于 Go 的并行处理随 CPU 核心扩展
- 作为嵌入其他工具的转译器/压缩器表现出色
缺点
- 有限的插件 API——无法匹配 Webpack 的可扩展性
- 没有内置 HMR 或开发服务器(需要包装工具)
- 没有 HTML 生成——需要单独的工具处理 HTML 入口
- 代码分割功能比 Webpack 或 Rollup 基础
- 不适合作为复杂 Web 应用的独立工具
- 不执行 TypeScript 类型检查(仅转译)
Turbopack:Rust 驱动的 Next.js 默认打包器
Turbopack 由 Vercel 于 2022 年 10 月发布,定位为 Webpack 的继任者。使用 Rust 编写,基于 Turbo 引擎,它采用增量计算——意味着只重新计算实际变更的部分。从 Next.js 15 开始,Turbopack 成为 Next.js 开发模式的默认打包器。
Turbopack 的设计目标是处理世界上最大的代码库。其增量架构意味着 HMR 速度不会随项目增长而下降。一个 10,000 模块的应用与 100 模块的应用更新速度一样快,因为只有变更的模块及其依赖会被重新处理。
核心特性
- 增量计算——只重新处理变更部分,任何规模下 HMR 速度一致
- 基于 Rust——原生性能,无 JavaScript 运行时开销
- Next.js 集成——作为默认 Next.js 开发打包器的一流支持
- 懒打包——只打包浏览器实际请求的代码
- TypeScript 和 JSX——通过 SWC 转译原生支持
- CSS 支持——CSS 模块、PostCSS 和 Tailwind CSS
- Webpack 兼容层——支持许多常用的 Webpack Loader
优点
- HMR 速度无论应用规模大小都保持恒定
- Rust 原生性能,配合细粒度缓存
- 无缝 Next.js 集成——零配置
- 懒编译减少初始开发服务器启动时间
- 由 Vercel 支持,有强大的长期投入
缺点
- 与 Next.js 紧密耦合——尚未作为独立打包器提供
- Next.js 中生产构建仍使用 Webpack(截至 2025 年初 Turbopack 仅用于开发)
- 没有独立的插件 API——依赖 Webpack 兼容层
- 相对较新——社区内容和故障排除资源较少
- 无法与非 Next.js 框架一起使用
开发服务器速度对比
开发速度是这些工具差异最大的地方。以下基准测试基于一个约 1,000 模块的 React + TypeScript 项目。
| 指标 | Webpack 5 | Vite 6 | esbuild | Turbopack |
|---|---|---|---|---|
| 开发服务器冷启动 | ~8-15s | ~300-800ms | ~100-300ms | ~1-3s |
| HMR 更新时间 | ~200-500ms | ~20-50ms | 无(无内置 HMR) | ~10-30ms |
| 首次页面加载(开发) | ~2-5s | ~1-3s | 无 | ~1-2s |
| 内存使用(开发) | ~300-600MB | ~150-300MB | ~50-100MB | ~200-400MB |
注意:esbuild 没有内置开发服务器或 HMR,它主要是打包器/转译器。Turbopack 数据仅针对 Next.js 项目。基准测试为近似值,会因硬件、项目结构和依赖数量而异。
生产构建速度对比
生产构建性能对 CI/CD 流水线至关重要。以下是不同项目规模的近似构建时间。
| 项目规模 | Webpack 5 | Vite 6 | esbuild | Turbopack |
|---|---|---|---|---|
| 小型(约 100 模块) | ~5-10s | ~2-4s | ~0.1-0.3s | 无(仅开发) |
| 中型(约 1,000 模块) | ~20-45s | ~8-15s | ~0.5-1.5s | 无(仅开发) |
| 大型(约 10,000 模块) | ~60-180s | ~25-60s | ~2-5s | 无(仅开发) |
| Monorepo(约 50,000 模块) | ~300-600s | ~90-200s | ~10-30s | 无(仅开发) |
注意:Vite 生产构建使用 Rollup,比 esbuild 慢但输出更优化。Turbopack 目前不支持生产构建。这些数字包括 TypeScript 转译、压缩和资源处理。
配置复杂度
这些工具之间最大的区别之一是需要多少配置。Webpack 以配置繁重著称,而 Vite 和 esbuild 力求合理的默认值。
Webpack:显式配置
典型的 Webpack 项目需要安装和配置多个 Loader 和 Plugin。一个生产就绪的 webpack.config.js 通常跨越 100-300 行。你需要显式配置 TypeScript 支持(ts-loader 或 babel-loader + @babel/preset-typescript)、CSS 处理(css-loader + postcss-loader + MiniCssExtractPlugin)、资源处理、开发服务器和优化设置。
# 典型的 Webpack 依赖
npm install --save-dev webpack webpack-cli webpack-dev-server
npm install --save-dev html-webpack-plugin mini-css-extract-plugin
npm install --save-dev ts-loader css-loader postcss-loader style-loader
npm install --save-dev @babel/core @babel/preset-env @babel/preset-react
npm install --save-dev babel-loader
# 总计:仅构建工具就需要 12+ 个开发依赖Vite:约定优于配置
Vite 对大多数项目零配置即可工作。TypeScript、JSX、CSS Modules 和 PostCSS 原生支持。典型的 vite.config.ts 只有 10-30 行。唯一需要的插件是框架特定的(例如 @vitejs/plugin-react)。
# 典型的 Vite 依赖
npm install --save-dev vite @vitejs/plugin-react
# 总计:2 个开发依赖
# TypeScript、CSS Modules、PostCSS——全部内置esbuild:最简 API
esbuild 有最简单的 API——一个函数调用或 CLI 命令。但是,你可能需要额外的工具来处理 HTML 生成、开发服务器和 HMR。esbuild API 可以在 JavaScript/Go 中编程使用,但缺少声明式配置文件模式。
# 典型的 esbuild 依赖
npm install --save-dev esbuild
# 总计:1 个开发依赖
# 但你可能需要额外的工具来完成完整的开发工作流Turbopack:零配置(在 Next.js 中)
Turbopack 不需要单独配置——它在 Next.js 中自动启用。所有配置通过 next.config.js 完成。如果你需要自定义 Webpack Loader,许多可以通过 Webpack 兼容层工作。
# Turbopack 依赖(通过 Next.js)
npx create-next-app@latest my-app
# Turbopack 已包含——无需额外安装
# 在开发中启用:next dev --turbopack插件生态对比
插件生态决定了你可以多容易地扩展构建工具来满足项目的特定需求。
Webpack Loader 和 Plugin
Webpack 拥有 JavaScript 打包器世界中最大的插件生态。npm 上有数千个 Loader 和 Plugin,几乎可以找到满足任何构建需求的解决方案。Loader/Plugin 架构文档完善,经过十年的改进。关键示例包括:babel-loader、ts-loader、css-loader、sass-loader、less-loader、file-loader、url-loader、HtmlWebpackPlugin、MiniCssExtractPlugin、DefinePlugin、CopyWebpackPlugin、BundleAnalyzerPlugin 和 Module Federation Plugin。
Vite 插件(Rollup 兼容)
Vite 的插件 API 基于 Rollup 的插件接口,并有 Vite 特定的扩展。这意味着许多现有的 Rollup 插件可以直接与 Vite 配合使用。Vite 插件生态正在快速增长,有针对 React、Vue、Svelte 和旧版浏览器支持的官方插件。社区插件涵盖 PWA、SSG、组件检查等。创建 Vite 插件比创建 Webpack Loader/Plugin 对简单得多。
// 示例:自定义 Vite 插件
export default function myPlugin() {
return {
name: 'my-plugin',
// Rollup 兼容钩子
resolveId(source) {
if (source === 'virtual-module') {
return source;
}
},
load(id) {
if (id === 'virtual-module') {
return 'export default "Hello from virtual module"';
}
},
// Vite 特定钩子
configureServer(server) {
server.middlewares.use((req, res, next) => {
// 自定义中间件
next();
});
},
transformIndexHtml(html) {
return html.replace(
'</head>',
'<script>console.log("injected")</script></head>'
);
},
};
}esbuild 插件
esbuild 的插件 API 故意设计为最小化且聚焦。插件可以拦截模块解析(onResolve)和加载(onLoad),但无法修改打包或优化阶段。这保持了 esbuild 的速度但限制了可扩展性。与 Webpack 或 Vite 相比,插件生态较小。
// 示例:esbuild 插件
const envPlugin = {
name: 'env',
setup(build) {
// 拦截以 "env:" 开头的导入路径
build.onResolve({ filter: /^env:/ }, (args) => ({
path: args.path,
namespace: 'env-ns',
}));
// 加载拦截的路径
build.onLoad({ filter: /.*/, namespace: 'env-ns' }, () => ({
contents: JSON.stringify(process.env),
loader: 'json',
}));
},
};
await esbuild.build({
entryPoints: ['src/index.ts'],
bundle: true,
outfile: 'dist/bundle.js',
plugins: [envPlugin],
});框架支持对比
不同的构建工具对流行框架的支持程度各不相同。以下是兼容性矩阵。
| 框架 | Webpack 5 | Vite 6 | esbuild | Turbopack |
|---|---|---|---|---|
| React | 完全支持(babel-loader/ts-loader) | 完全支持(@vitejs/plugin-react) | 仅转译(无 HMR) | 完全支持(通过 Next.js) |
| Vue 3 | 完全支持(vue-loader) | 完全支持(@vitejs/plugin-vue) | 仅转译 | 不支持 |
| Svelte | 完全支持(svelte-loader) | 完全支持(@sveltejs/vite-plugin-svelte) | 通过插件 | 不支持 |
| Next.js | 默认生产打包器 | 不支持 | 不支持 | 默认开发打包器 |
| Nuxt 3 | 支持(旧版) | 默认打包器 | 不支持 | 不支持 |
| Angular | 默认(通过 Angular CLI) | 默认(Angular 17+) | 不支持 | 不支持 |
| SolidJS | 完全支持(babel-plugin) | 完全支持(vite-plugin-solid) | 仅转译 | 不支持 |
| Astro | 未使用 | 默认打包器 | 非直接使用 | 不支持 |
迁移指南:从 Webpack 到 Vite
Vite 是 Webpack 用户最常见的迁移目标。以下是分步指南和常见陷阱。
分步迁移
步骤 1:安装 Vite 和框架插件
npm install --save-dev vite @vitejs/plugin-react
# 删除 Webpack 依赖
npm uninstall webpack webpack-cli webpack-dev-server
npm uninstall html-webpack-plugin mini-css-extract-plugin
npm uninstall babel-loader ts-loader css-loader style-loader步骤 2:创建 vite.config.ts
// vite.config.ts
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
'@': '/src', // Vite 使用 URL 风格路径
},
},
});步骤 3:将 index.html 移到项目根目录
Vite 使用 index.html 作为入口(而非 Webpack 插件)。将其从 public/index.html 移到项目根目录,并添加指向入口文件的 script 标签:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>My App</title>
</head>
<body>
<div id="root"></div>
<!-- 这是与 Webpack 的关键区别 -->
<script type="module" src="/src/main.tsx"></script>
</body>
</html>步骤 4:更新 package.json 脚本
{
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"preview": "vite preview"
}
}步骤 5:更新环境变量
Vite 使用 import.meta.env 而非 process.env。变量必须以 VITE_ 为前缀而非 REACT_APP_:
// 之前(Webpack / CRA)
const apiUrl = process.env.REACT_APP_API_URL;
// 之后(Vite)
const apiUrl = import.meta.env.VITE_API_URL;常见迁移陷阱
- CJS 依赖——某些包只提供 CommonJS。在 vite.config.ts 的
optimizeDeps.include中添加它们 - 全局变量——
process.env不可用。使用配置中的define或import.meta.env - require() 调用——Vite 使用 ESM。将
require()替换为import语句 - CSS 导入——Vite 原生处理 CSS。删除 css-loader、style-loader 和 MiniCssExtractPlugin
- 静态资源——动态资源路径使用
new URL('./asset.png', import.meta.url).href - 代理配置——Vite 在
server.proxy中使用不同的代理配置格式 - Jest 到 Vitest——考虑迁移到 Vitest,它共享 Vite 配置且速度显著更快
决策矩阵:如何选择构建工具
正确的工具取决于你的项目类型、团队规模和优先级。以下是实用的决策矩阵。
| 项目类型 | 推荐工具 | 原因 |
|---|---|---|
| 新的 SPA(React/Vue/Svelte) | Vite | 最快的开发体验,简单配置,出色的框架支持 |
| Next.js 应用 | Turbopack(开发)+ Webpack(生产) | 内置,零配置,最佳 Next.js 性能 |
| Nuxt 3 应用 | Vite | Nuxt 默认打包器,出色的 Vue 生态集成 |
| 遗留 Webpack 项目 | 保留 Webpack(渐进迁移) | 低风险,启用持久化缓存提升速度 |
| NPM 库 | Vite(库模式)或 esbuild | 干净的 ESM/CJS 输出,简单配置 |
| 微前端 | Webpack | Module Federation 是 Webpack 独有的 |
| 速度关键的 CI 流水线 | esbuild | 生产构建速度遥遥领先 |
| 企业级 Monorepo | Vite + Turborepo | 快速开发 + 跨包编排构建 |
对于 2025 年的大多数新项目,Vite 是默认推荐。它在开发速度、生产输出质量和生态支持方面提供了最佳平衡。仅在需要 Module Federation 或维护现有 Webpack 项目时使用 Webpack。当原始构建速度是首要优先级且不需要开发服务器时使用 esbuild。如果使用 Next.js 构建则使用 Turbopack。
常见问题
Vite 比 Webpack 快吗?
是的,Vite 在开发方面比 Webpack 快得多。Vite 的开发服务器无论项目大小都能在一秒内启动,因为它使用原生 ES 模块而非打包。Vite 中 HMR 更新需要 20-50ms,而 Webpack 需要 200-500ms。在生产构建方面,Vite(使用 Rollup)比 Webpack 快约 2-3 倍。但如果启用 Webpack 5 的持久化文件系统缓存,后续构建的差距会缩小。
esbuild 能完全替代 Webpack 吗?
对于大多数 Web 应用,不能。esbuild 缺少内置开发服务器、HMR、HTML 生成,且插件 API 有限。它最适合作为嵌入更高级工具(如 Vite)的转译器/打包器,或用于构建不需要开发服务器的 Node.js 库和简单脚本。对于具有代码分割、多入口和框架特定转换的复杂 Web 应用,Vite 或 Webpack 仍然是更好的选择。
我应该从 Webpack 迁移到 Vite 吗?
取决于你的情况。如果你的团队经常抱怨开发服务器启动慢或 HMR 慢,迁移到 Vite 可以显著改善开发体验。对于大多数 React、Vue 和 Svelte 项目,迁移很简单。但如果你的 Webpack 配置使用了许多 Loader 和 Plugin 进行了大量自定义,迁移可能需要较大工作量。首先评估你的 Webpack 插件是否有 Vite 等价物。
Turbopack 是什么,我应该什么时候使用它?
Turbopack 是 Vercel 专门为 Next.js 构建的基于 Rust 的打包器。它使用增量计算来保持一致的 HMR 速度,无论项目大小。截至 2025 年初,Turbopack 是 Next.js 的默认开发打包器,但尚不支持生产构建。如果你正在构建 Next.js 应用,应该使用它——它会自动启用。目前不可用于非 Next.js 项目的独立工具。
为什么 Vite 生产构建使用 Rollup 而不是 esbuild?
虽然 esbuild 更快,但 Rollup 为生产包生成更优化的输出。Rollup 有更好的树摇优化、更成熟的代码分割和精确的块控制,以及更丰富的生产转换插件生态。Vite 的理念是在每个场景使用最快的工具:开发时使用 esbuild(速度最重要),生产时使用 Rollup(输出优化最重要)。Vite 团队一直在开发 Rolldown,一个基于 Rust 的 Rollup 替代品,旨在结合 esbuild 的速度和 Rollup 的优化质量。