比较新一代的构建工具

2021-04-22 11:53:25

使用Algolia托管API将疼痛从建筑站点搜索中进行。现在免费开始!

一群新的开发工具在过去的一年里降落了,他们在过去几年中占据了前端发展的工具的高跟鞋,包括网克,巴巴勒,汇总,包裹,Create-React-App。

这些新工具尚未设计用于执行完全相同的功能,每个工具都有不同的东西,他们正在尝试实现和到达那里的功能。尽管有了差异,但这些工具确实共享了一个共同目标:提高开发人员体验。

具体来说,我想评估每个人,概述他们所做的事情,为什么我们需要它们,以及他们的用例。我意识到比较并不总是公平的。再次,它不像我们在本文中看到的任何东西都是直接竞争对手。事实上,积雪和vite实际上在引擎盖下使用eSbuild进行某些任务。我们的目标是更好地了解开发人员工具的景观,这些工具运行任务使我们的工作更轻松。这样,我们看到那里有哪些选择以及它们如何堆叠,所以我们可以在我们需要时做出最好的选择。

当然,所有这一切都将通过我的经验使用React和Proaect的经验。我更熟悉这些框架图书馆,但我们也会看看他们对其他前端框架的支持。

关于这些新开发人员工具,有很多伟大的文章,流和播客。有几个ShopTalk Show剧集我推荐更多上下文:第454集讨论vite和第448集拥有WMR和Snowpack的创造者。从这些剧集中脱颖而出的是,大量的工作已经建立了这些工具来使开发人员环境现代化。

部分地,我认为这些工具是对JavaScript模具疲劳的反应 - 在这篇文章中捕获的东西关于2016年学习JavaScript的东西。他们还在编写一个vanilla javascript文件之间填补了缺少的中间地面,并不得不下载200在您编写了自己代码的行之前,兆字节的工具依赖关系。它们来包括电池 - 没有依赖列表,并且是JavaScript生态系统中倒塌图层趋势的一部分。

Snowpack,Vite和WMR都通过浏览器中的本机JavaScript模块启用了所有。回到2018年,Firefox 60默认启用了ECMAScript 2015模块。从那时起,所有主要的浏览器引擎都支持了本机JavaScript模块。 Node.js还将在2019年11月与本机JavaScript模块一起发布。我们仍然发现本土JavaScript模块在2021年解锁的可能性。

无论是为开发服务器使用WebPack,Rollup或Parcel,该工具从源代码和Node_modules文件夹中捆绑了我们的整个代码库,通过构建进程 - 像Babel,TypeScript或Postcss一样运行这些 - 然后将捆绑的代码推向我们的浏览器。这一切都需要工作,并且可以慢慢开发服务器在较大的Codebases中爬行,即使在缓存和优化的所有工作之后也是如此。

SnowPack,Vite和WMR开发服务器不遵循此模型。相反,他们等到浏览器找到导入语句并为模块提供HTTP请求。只有在此请求进行此请求后,工具将在模块的导入树中应用于所请求的模块和任何叶节点,然后将其服务于浏览器。在推送DEV服务器的过程中,这会速度更加速度。

您将注意到eSbuild缺少这张照片。这是一个束缚,最重要。它不会侧面捆绑其他工具所做的方式。相反,eSBuild通过避免昂贵的变换,利用并行化并使用GO语言来处理代码非常快。

我从React Docs中拍摄了一个示例应用程序并使用本文中涵盖的每个工具重建它。我和yogita verma一起拍摄的这个项目。这是一个与原来的repo的链接,以及使用不同的构建工具的四个版本的Snap拍摄到我的repo的链接。我们稍后会比较每个构建步骤的输出。重建此应用程序允许我测试将一些漂亮标准的反应依赖关系拉到工具中的开发人员体验,包括React Router和XIO。

在我们进入每个工具的细节之前,它们都支持框中的以下功能(到不同程度):

所有这些工具都可以将TypeScript编译为JavaScript,但即使存在类型错误也会这样做。对于正确的类型检查,您需要在根javascript文件上安装打字和运行tsc --noemit,或者使用编辑器插件来监视类型错误。

eSbuild是由Evan Wallace(Figma)的evan Wallace(CTO)创建的。其主要特征是它提供的构建步骤10×-100×比基于节点的捆绑程序(通过自己的基准)更快。它没有提供许多您在Create-React-App等类似的开发人员的便利。但是,还有越来越多的esbuild启动器突破,填补了那些差距,包括创造反应 - app-esbuild,estrella和snowpack,它使用esbuild为其构建步骤。

esbuild非常新。它尚未达到1.0版本,并没有准备好生产使用 - 但它不远处。它为您提供了具有智能默认值的直观的JavaScript和命令行API。

esbuild是一个完整的淫荡世界变更者。它在大的CodeBases中最有用,其中eSBuild和Node Bundlers之间的速度差异乘以乘以。当esbuild命中1.0时,在大生产基地将非常有用,并将节省大量时间等待建立的队伍。不幸的是,大型生产现场必须等到eSBuild变得稳定。与此同时,在侧面项目中添加一些速度,它就很好。

esbuild的淡化快速将是您正在做的任何工作的奖励。花在等待建筑物的时间越来越少,始终会对开发人员体验有益!这考虑了,如果您是原型化的快速应用程序,您可能希望从eSBuild开始更高的内容 - 否则,您需要花一些时间在依赖性中拉出依赖性并在获得JavaScript生态系统中预期的便利之前配置您的环境。此外,如果要尽可能最大限度地减少捆绑的大小,您可能需要使用汇总和纺织器,这将产生稍微较小的捆绑尺寸。

我决定以北面方式在eSBuild中开始反应项目:NPM安装eSBuild,反应和反应。我创建了一个src / app.jsx文件和dist / index.html文件。然后,我使用以下命令将应用程序编译为dist / bundle.js文件:

当我在浏览器中托管和打开index.html时,我与“白色屏幕”遇到了“未捕获的roiderError:流程未定义”控制台错误。 Docs和CLI都解释了您需要做的事情,以防止这一点,但它可能是初学者的一点“GOTCHA”,因为它需要绑架响应时需要额外的参数:

或者,如果您在类似于此编写的NPM脚本中包括eSbuild以逃脱引号:

对于预期节点环境变量的浏览器捆绑在一起,需要此定义参数。 Vue 2.0也预期这些。您不会有同样的问题,因为它默认情况下,它不会指望任何环境变量和浏览器的船舶。

我用define参数运行命令后,我的“Hello World”React应用程序正完美。 JSX用.jsx文件的框。也就是说,需要手动导入React,然后JSX转换为React.Createelement。但是,有些方法可以在JSX中添加自动导入和/或配置JSX的P React。

eSbuild为开发服务器提供--serve选项。这绕过文件系统并直接从内存提供模块,确保浏览器不会提取旧版本的模块。但是,它不包括Live / Hot Recoading,因此您可以在保存后刷新浏览器,这不是理想的体验。

我决定使用新发布的监视功能。这告诉eSBuild每次保存源文件时都会重新编译代码。但我们仍然需要一个服务器来查看我们已保存的更改。我们可以提取一个开发服务器包,例如Luke Jackson的Servor:

然后我们可以使用eSbuild JavaScript API以服务器启动并同时运行ESBuild的手表模式。让我们在叫做Watch.js的项目的根目录中创建一个文件:

// Watch.jsconst esbuild =要求(" esbuild"); const servor = require(" servor"); esbuild.build({//将任何选项传递给eSbuild的任何选项... entrypoints:[" src / app.jsx"],outir:" dist",定义:{" process.env.node_env&#34 ;:'''' 34;生产"'},观察:true,}); async函数服务(){console.log("运行服务器来自:http:// localhost:8080 /") ;等待服务器({//将任何选项传递给服务器...浏览器:true,root:" dist",端口:8080,});}服务();

现在在命令行中运行节点Watch.js。这为我们提供了一个漂亮的Dev服务器,但再次,它不会给我们提供热模块替换或快速刷新(即,您的客户端状态不会被保留)。但这足以让我的测试需求。

尽管我们每次保存文件时都是重建我们的整个应用程序,但我们需要在eSBuild减慢之前有一个非常大量的应用程序。设置此工具后,我正在从更改中获得即时反馈。我的电脑从2012年使用Intel I7,因此它肯定不是一台直线机。

如果您需要带有实时重新加载和一些反应默认值的ESBuild版本,则可以克隆这款repo。

eSbuild如果您的风格,可以在JavaScript中导入CSS。它将CSS编译为具有与主要输出JavaScript文件相同的输出文件。它也可以默认捆绑CSS @Import语句。对CSS模块没有支持,但有计划。

eSbuild有一个不断增长的插件社区。例如,有Vue单个文件组件和Svelte组件的插件。

eSbuild与JSON文件一起工作,可以在没有任何配置的情况下将它们捆绑为JavaScript模块。

它还可以在JavaScript中导入图像中的选项,以便将它们转换为数据URL或将它们复制到输出文件夹中。默认情况下未启用此行为,但您可以在eSbuild Config对象中添加以下内容以启用任一选项:

装载机:{' .png&#39 ;:' dataull' } //转换为JS BundleLoader中的数据URL:{' .png&#39 ;:'文件' } //副本到输出文件夹

代码拆分似乎是正在进行的工作,但大多数在ESM输出格式中,它看起来它是项目的优先级。它也值得一提的是,默认情况下,树木摇动是内置的eSbuild,无法关闭。

使用eSbuild命令中的“缩减”和“捆绑”选项将不会像汇总/纺织管道一样小。这是因为eSbuild牺牲了一些捆绑大小优化,以便在尽可能少的通行证中通过代码。但是,差异可能非常忽略不计,值得填充速度的增加,具体取决于您的项目。在SNAP拍摄应用程序的克隆中,eSBuild创建了一个177 KB的捆绑,这不是比Vite生产的165KB不超过165KB,它使用汇总和陶器。

esbuild是一个非常强大的工具。但如果您用于零配置设置可能很困难。如果您需要更多,那么您可能想看看使用esbuild的下一个工具snowpack。

默认情况下,SnowPack的构建步骤不会将文件捆绑到单个包中,但提供在浏览器中运行的未绑定的ESModules。 eSbuild实际上包含在那里作为依赖项,但是这个想法是在需要时使用JavaScript模块并仅在eSbuild中捆绑。

Snowpack有一些非常漂亮的光滑文档,包括使用JavaScript框架使用它的指南列表,以及它们的一堆模板。一些指南仍然是一项正在进行的工作,但其他像反应的其他指南都很好明确。看起来Snowpack将Svelte视为一流的公民。我实际上首次听说过来自富豪哈里斯的“未来派网络发展”的Snowpack在Svelte Summit 2020。所以,即将到来的Svelte Meta-Framework Sveltekit应该由SnowPack提供动力,但自切换到Vite(我们将在下次查看)。

如果您想在未绑定的部署中加倍,Snowpack是一个不错的选择。您可以使用少量模块写入源代码。这意味着您并没有创建一个与不捆绑的构建的大请求瀑布。如果您不需要捆绑的额外复杂性和技术债务,那么Snowpack是一个很好的选择。如果您逐步地采用前端框架进入服务器呈现或静态应用程序,则将是一个很好的用例。您可以从节点生态系统中尽可能轻松地拉动工具,但您仍然会获得声明性前端框架的好处。

其次,我认为Snowpack是埃博苏尔周围的一个伟大的包装。如果您想尝试eSBuild,还要希望开发服务器和前端框架的预先写模板,那么您就不会出现问题。在Snowpack Config的构建步骤中启用eSBuild,您很好。

随着目前的事情,我认为Snowpack不是零配置工具的最佳替代品,如Create-React-App,因为您需要在插件中加入并将自己配置为自己,如果您有大应用和需要超级幻想优化的生产准备好的建设步骤。

我认为在配置文件中设置一个无辜的键值对时,Snowpack最神奇的部分是来的。将其粘贴到配置文件中,例如:

资料来源:远程启用名为Streaming Imports的内容。流媒体导入使Snowpack通过转换裸露进口(例如,从&#39的导入反应来绕过NPM安装来绕过NPM安装;从SkyPack进口CDN进口CDN。

<! - index.html - ><!doctype html>< html lang =" en">> head> < meta charset =" UTF-8"> <标题>雪盒流进口< /标题>< / head>< body> < div id =" root">< / div> <! - 注意Type ="模块"这对于JavaScript模块导入非常重要。 - > <脚本类型="模块" src =" app.js">>< / script>< / body>< / html>

// app.jsximport从&#39做出反应/h1>}反应下的nuder 0.

请注意,我们没有在任何阶段安装React或Reactdom。但是,如果我们像这样启动SnowPack开发人员服务器:

Snowpack而不是从Node_Modules文件夹中拉出Node_Modules文件夹,从SkyPack中拉下NPM封装,该CDN托管NPM注册表,它是预先优化的在浏览器中工作。然后snowpack在a ./_snowpack/pkg url中提供它。

这是距Node / NPM的工作流程的一步。我们实际研究的是一种新的CDN / JavaScript模块的工作流程。

但是,如果我们的应用程序,并运行生产构建,Snowpack抛出错误。这是因为它需要知道在构建时使用的反应和反应品的哪些版本。您可以通过写入snowpack.deps.json来解决此问题,可以通过运行以下内容自动创建:

这不会从NPM下载包,但它将记录用于SnowPack构建的软件包的版本。

一个警告是,我们错过了开发人员错误消息,因为SkyPack将运送软件包的生产版本。

即使我们不使用流媒体导入,SnowPack开发服务器也将每个依赖性从Node_modules捆绑到每个依赖关系的一个JavaScript文件中,将这些文件转换为本机JavaScript模块,然后将其用于浏览器。这意味着浏览器可以缓存这些脚本,并且只有在改变时才重新请求它们。开发服务器会在保存时自动刷新,但不保留客户端状态。无论它们是使用遗留模块格式或节点API吗?

在React中保留客户端状态需要反应刷新,这需要自己的一些Babel软件包作为依赖项。默认情况下,这些都不包含,但使用更大的React模板可用。模板在反应刷新,更漂亮,柴和反应测试库中提取,对于80 MB称重的总节点依赖性封装:

默认情况下,仅支持JSX,但仅使用.jsx文件。 SnowPack自动检测是否正在使用反应或取消,并根据该渲染用于JSX变换的功能。但是,如果我们想进一步自定义JSX,我们需要通过他们的插件来拉动Babel。还提供Vue单个文件组件的Snowpack插件,当然,对于Svelte组件。此外,snowpack编译打字标注,但是对于类型检查,我们需要打字插件。

CSS可以导入JavaScript,并将其折叠到文档中<头部>在运行时。只要它们具有.module.css扩展,也支持CSS模块的盒子中的框中。

导入的JSON文件将投用成带有对象作为默认导出的JavaScript模块。 SnowPack支持图像并将它们复制到生产文件夹中。与其不捆绑的哲学一起,SnowPack不包括捆绑包中的数据URL。

默认的snowpack构建命令基本上将确切的源文件结构复制到输出文件夹中。对于编译到JavaScript的文件(例如,打字标注,JSX,JSON,.vue,.svelte),它将每个文件转换为单独的浏览器友好的JavaScript模块。

这有效,但生产不太好,因为它可能导致请求的大瀑布如果源代码分成大量文件。在Snap拍摄应用程序中,我最终获得了184KB的源文件,然后从SkyPack向另外105 kB的依赖性提出,这为一个非常巨大的瀑布制作。

但是,SnowPack将eSbuild作为依赖项,我们可以通过将“优化”对象添加到SnowPack配置,使您可以启用eSBuild,拆卸和编译我们的代码:

这运行了使用esbuild提供的优化功能的代码,因此只需添加这些选项,我们可以获得我们早先与esbuild的相同的构建。

由于eSBuild尚未达到1.0,SnowPack建议使用WebPack或Rollup插件进行生产构建,这两者都需要配置。

SnowPack提供轻量级开发人员体验,具有全功能开发服务器,详细文档和易于安装的模板。 您留下来决定是否要捆绑您的应用程序以及您想要的方式。 如果您想要一个提供DEV服务器和更自由的构建步骤的工具,您可能需要查看Vite,我们列表中的下一个工具。 VITE由Vue Creator(和Hades Speedrunner)开发的evan。 如果esbuild集中在开发服务器上的构建步骤和snowpack集中,则vite提供:完整的开发服务器和使用汇总的优化构建命令。 如果您想要一个严肃的创建 - 反应应用程序或Vue CLI竞争对手,Vite是束中最接近的一个,因为它附带了电池的功能。 闪电快速开发服务器和零配置擎天柱 ......