JavaScript工具的未来离JavaScript越来越远,Webpack和Babel等工具的重要性正在下降。为什么?一些语言(例如Rust、Go,甚至Zig)已被证明在捆绑、转译和编译方面具有比JavaScript更好的性能。它们不是单线程的,这在处理大文件时是一个优势。是什么让用JavaScript开发生态系统工具如此重要?毕竟,这些工具大多运行在开发者的机器上,而不是浏览器上。此外,JavaScript开发人员不需要调试这些工具的内部代码。SWC是最早脱离JavaScript的工具项目之一,不久之后,Esbuild发布,很多人对此感到兴奋,因为它们在性能方面真正改变了游戏规则。目前,Vite2.0正在底层使用Esbuild来提供高性能的构建体验。最近,JavaScript工具生态系统的新成员出现了——Bun。它的目标是使整个JavaScript开发过程更快,这是一个一体化的工具,不仅可以加速编译和解析,还提供自己的依赖管理器工具和捆绑。该工具尚未完全准备好用于生产,但它的前景一片光明。本文将介绍这个新工具以及它与NPM、Esbuild、Babel和Webpack的比较。概览与用Rust或Go开发的其他工具不同,Bun是用Zig开发的。Zig是一种通用编程语言和工具链,用于开发和维护健壮、优化和可重用的软件。虽然它是从头开始开发的,但开发人员对Esbuild项目采用了类似的方法。Bun支持一些开箱即用的复杂功能,例如TypeScript、CSSinJs、JSX,但仍然缺少一些基本功能,例如源映射、minifier、treeshaking优化等。Bun的一个显着特点是它提供了它的自己实现了Node模块解析器,这是最值得注意的优化之一。与NPM和Yarn一样,Bun也创建了一个名为bun.lockb的锁文件。这里需要注意的是它生成二进制文件,而不是纯文本文件。为什么是二进制文件?主要是出于性能原因。缺点是不方便我们查看PR的变化。检查锁定文件的唯一方法是使用以下命令:buninstall-yBun目前支持以下加载器:安装配置Bun还不是一个公共项目,你需要加入他们的Discord频道并发送邀请请求。在Discord上找到他们的#invites频道,并在“我想要包子”频道上发起邀请请求。您将获得jarred-sumner/bun存储库的一次性邀请。安装Bun需要执行以下命令:curl-fsSLhttps://bun.sh/install|bash#手动将目录添加到你的$HOME/.bashrc(或类似的)BUN_INSTALL="/home/jgranja/.bun"PATH="$BUN_INSTALL/bin:$PATH"检查它是否有效:bun--version你会看到它还没有达到1.0.0版本。正如我之前提到的,它还没有完全准备好用于生产。它的用法很简单。如果你熟悉Yarn或NPM,你会发现它们几乎是一样的。安装包:buninstall与Yarn相同,它将使用现有的package.json和锁定文件(如果有)的组合。添加或删除包:bunremovereactbunaddpreact我们可以使用Bun作为执行器:#而不是`npmrunclean`bunrunclean#如果添加到package.jsonbunclean中的`scripts`,它会提供最新的创建命令与React生态系统的一些集成。让我们创建一个Next.js应用程序:buncreatenext./appcdappbun让我们创建一个Create-React应用程序:buncreatereact./appcdappbun如何生成捆绑文件?运行bunbun./path-to.js会生成一个包含所有导入依赖项的node_modules.bun文件。您可以通过执行./node_modules.bun>build.js查看包的内容。基准让我们通过运行一些基准来了解它有多快。当然,这些是近似值,取决于操作环境的配置。由于这是开发人员的工具,因此我专注于最常见的开发任务:启动开发服务器;对文件进行一些更改;安装包;构建生产发布包;创建一个新的网络应用程序。作为参考,我的笔记本电脑运行的是Ubuntu20.04,配备AMDRaizen7CPU和16GB内存。我使用生成随机jsx文件的工具。我生成了21个随机jsx文件,我将它们包含在所有测试项目中。Bun与Babel的比较可能不公平,但它确实向我们展示了该工具与传统工具相比有多快。转译React文件与创建Create-React应用程序我们可以看到使用Bun和Webpack+NPM来创建CreateReact应用程序之间的明显区别。前者几乎没有任何滞后,只需4.4秒即可完成所有设置。创建CRA与构建Next.js应用程序之前的结果并不那么令人印象深刻,毕竟我们习惯于使用其他工具击败Webpack。让我们来一场公平的较量,比较一下Bun和SWC。Bunvs.SWC两者之间的差异非常明显,尤其是在处理文件更改方面。在我的笔记本电脑上,Bun只需要10ms,而SWC需要70ms。在模块安装和操作方面,Bun也比包管理器有一些优势。其他工具依赖NPM或Yarn来完成这项工作,Bun的性能比NPM快4到100倍左右。我们已经在第二步中看到了两者之间的巨大差异。但是,现在让我们做一个更基本的例子。我们创建一个package.json文件,依赖如下:date-fns@2.28.0——89.5KBjspdf@2.5.1——339.1KBreact@17.0.2——6.9KB然后我们安装并基于安装的Cache进行benchmarking。为了让区别更明显,我选择了一个大型图书馆(jspdf)。Bun和NPM安装包的时间差异很明显。如果通过网络安装快4倍,如果从缓存中解析则快得多。Bun和ViteEsbuild是Bun真正的竞争对手。对于这个测试,我使用了Vite,因为它内部使用了Esbuild。Bunvs.Vitefordevelopmentserver我还基于与之前相同的代码使用三个主要工具生成了包。需要注意的是,我们不建议在生产环境中使用Bun,因为它缺少很多功能。尽管基准测试结果令人印象深刻,但我们还是要保持谨慎。在最坏的情况下,最长的构建时间为7秒。这三个工具在这方面做得非常出色并非没有原因。Bun、Vite、SWC构建用于生产的捆绑包。总结JavaScript工具从未如此好过,即使该工具还没有准备好用于生产,新的竞争者总是一件好事。Webpack的未来不明朗,它在JavaScript领域内外都有许多竞争对手。Bun不是万能工具,它擅长构建网站和Web应用程序。如果构建库,Bun团队推荐Esbuild,甚至Rollup。目前,Bun开发团队的重点仍然不在生产准备上,他们专注于开发以及与现有框架和工具的兼容性。
