babel-minify vs terser(而不是 uglify-js)

babel-minify vs terser (instead uglify-js)

我对 ES6+ 比较陌生(称为现代 JavaScript),但似乎如果我想在浏览器中使用它,我需要 babel-minify or terser. (First I thought Babili is another player but it's just the old name of Babel-Minify)

关于浏览器的 polyfills,有像 @babel/polyfill or Polyfill.io 这样的生产就绪解决方案,使用它们可以向现代浏览器发送更小、更快的代码,因为它们需要 no/few polyfills(测试浏览器快速地动态加载所需的 polyfill,然后启动我们应用程序的主脚本)。所以使用这些现代技术似乎是绝对合理的。

关于选择 babel-minifyterser 的两难选择来了。

即将发布的 Webpack 5 中的 Webpack 团队 decided to switchterser
Babel 团队做了一个 comparison table 显示 terser 在速度上要好得多。
文档 says terseruglify-es 的一个分支,之前被广泛使用。

这些让我觉得我必须选择terser

但另一方面,Babel 还是需要改造的(可以做很多有用的事情)。他们很久以前就从事这项业务(尽管 Babili/babel-minify 在 2016 年 8 月 26 日是 first released,所以 uglify 更老)。他们在 GitHub 上有一个很棒的开发者社区,错误可能已经发现并更早修复。基于这些,在生产安全输出方面,我对他们更加信任。但我还没有找到任何文章显示 babel-minify 优于 terser

问题:

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

在大多数情况下,使用 terser 还是 babel-minify 都没有太大关系。也就是说,使用 babel-minify 的好处是与 babel 生态系统的其余部分紧密集成。如果你在像 webpack 这样的捆绑器之外使用 babel,或者在 CLI 上使用,babel-minify 可以与其他 babel t运行sforms 同时 运行,因此需要最少的额外配置。如果您通过例如 babel-loader 启用了缓存,Babel-minify 也可以使用与其余 babel 插件相同的缓存。

最初创建babel-minify(然后是babili)是因为没有与ES6或更新版本兼容的uglify-js版本,而babel已经有了支持新语法的解析器。从那以后,terser 成为了一个很好的选择,并且比 babel-minify 执行得更快,同时仍然支持 ES6(可能是因为它没有绑定到 babel 的 t运行sform 管道)。由于这个以及您列出的原因,terser 可能是现在最好的选择。

一个可能的例外是,如果您使用尚未标准化为 ECMAScript 的一部分但在 babel 的解析器中受支持的实验性语法(可能有插件)。在这种情况下,babel-minify 可能被证明是有益的。