babel-minify和terser(代替uglify-js)的比较

13
我对ES6+(称为现代JavaScript)相对较新,但似乎如果我想在浏览器中使用它,我需要babel-minifyterser。(起初我以为Babili是另一个工具,但它只是Babel-Minify的旧名称。)
关于浏览器的polyfills,有一些生产就绪的解决方案,如@babel/polyfillPolyfill.io。使用它们可以向现代浏览器发送更小、更快的代码,因为它们不需要/需要少量的polyfills(快速测试浏览器,动态加载所需的polyfills,然后启动我们应用程序的主脚本)。因此,使用这些现代技术似乎是非常合理的。
接下来是我在选择babel-minifyterser时遇到的困境。
Webpack团队决定在即将发布的Webpack 5中转换terser。 Babel团队制作了一张比较表,显示terser速度更快。 文档说明terseruglify-es的一个分支,在此之前被广泛使用。 这些使我认为我应该选择terser

但另一方面,Babel仍然需要进行转换(并且可以用于许多有用的事情)。他们已经从事这项业务很长时间了(尽管Babili/babel-minify是在2016年8月26日首次发布的,所以uglify更旧)。他们在GitHub上拥有伟大的开发者社区,可能会更早地发现和修复漏洞。基于这些原因,当涉及到生产安全输出时,我对他们更加信任。但我没有找到任何文章显示babel-minify相比terser的优点。

问题:

我会选择terser,因为它看起来很有前途,而且上述原因,但是:

  • 在哪些情况下我应该使用babel-minify而不是terser
  • 使用Babel包完成所有操作是否有任何优势?

请参观 导览,并学习如何提出好问题。"并非所有问题都适合我们的格式。避免主要基于个人意见的问题,或者可能会引发讨论而不是答案的问题。" - Quentin
@Quentin 抱歉,我刚刚编辑了一下内容,使其更清晰明了。希望现在可以了。谢谢! - szegheo
很好的问题,我刚刚在这里提出了同样的问题 https://github.com/webpack/webpack/issues/7923 ,也许 webpack 可以解释为什么他们更喜欢 terser。从提交活动 https://github.com/babel/minify/graphs/commit-activity 和 https://github.com/terser-js/terser/graphs/commit-activity 来看,我觉得使用 terser 更加活跃。 - Fabio Crisci
1个回答

16
在大多数情况下,使用terser或babel-minify并不会有太大差别。然而,使用babel-minify的好处在于与babel生态系统的其余部分紧密集成。如果您在webpack之外使用babel,或者在CLI上使用它,那么可以同时运行babel-minify和其他babel转换,因此需要最少的额外配置。如果启用了缓存(例如babel-loader),则babel-minify也可以使用与其他babel插件相同的缓存。
最初,babel-minify(当时是babili)的创建是因为没有与ES6或更新版本兼容的uglify-js版本,而babel已经有一个支持新语法的解析器。自那以后,terser已成为很好的替代方案,并且比babel-minify执行更快,同时仍支持ES6(可能是因为它没有绑定到babel的转换流程中)。因此,出于您列出的原因,现在terser可能是最好的选择。
唯一可能的例外情况是,如果您使用尚未作为ECMAScript的一部分标准化但在babel解析器中受支持(可能需要插件)的实验性语法。在这种情况下,babel-minify可能会有所裨益。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接