什么是平面捆绑,为什么 Rollup 在这方面比 Webpack 更好?



我最近一直在研究rollup,看看它与Webpack和其他捆绑器有何不同。我遇到的一件事是,由于"扁平捆绑",它对图书馆更好。这是基于一条推文和最近的 React 利用 Rollup 的 PR。

根据我的经验,Rollup 在构建库方面做得更好,因为围绕平面捆绑(例如提升)进行了更好的优化。 1/2

Webpack 2 可能更适合你,如果你将应用程序与代码拆分等捆绑在一起。 2/2

我不完全确定我是否理解这意味着什么。平面捆绑是指什么?我知道 Rollup 的文档提到了树摇来帮助减小捆绑包大小,但 Webpack 也有一种方法可以做到这一点。也许我只是不完全理解这个概念。

请注意,这不是关于汇总与 Webpack 的比较问题。对于对此感兴趣的人,Webpack有一个比较图表。这主要是问什么是平面捆绑?可能汇总在内部做了什么来实现这一目标?

编辑:汇总支持代码拆分 - 阅读文章

编辑:Webpack 现在在某些情况下支持范围提升 - 在此处阅读博客文章

我们可能对这些东西有不同的定义,但我认为扁平捆绑只是意味着"拿走你的模块并将它们变成一个捆绑包"——也就是说,"扁平"是多余的。React 16 的最大区别在于,默认情况下您将使用预制的捆绑包,而不是您的应用程序负责捆绑 React 的源代码模块(尽管总是有一个预构建的 UMD 捆绑包 React,使用 Browserify 构建)。

相反,两者之间的最大区别是在模块边界处发生的情况。webpack 的工作方式是它将每个模块包装在一个函数中,并创建一个实现加载器和模块缓存的捆绑包。在运行时,依次计算每个模块函数以填充模块缓存。这种架构有很多优点——它可以实现高级功能,如代码拆分和按需加载,以及热模块更换 (HMR)。

Rollup 采用不同的方法 — 它将所有代码放在同一级别(根据需要重写标识符以避免变量名称之间的冲突等)。这通常被称为">范围提升"。因此,没有每个模块的开销,也没有每个捆绑包的开销。您的捆绑包保证更小,并且评估速度也会更快,因为间接性更少(更多信息 - 小模块的成本)。代价是这种行为依赖于 ES2015 模块语义,这意味着 webpack 的一些高级功能更难实现(例如,Rollup 不支持代码拆分,至少现在还不支持!

简而言之,webpack 通常更适合应用程序,而 Rollup通常更适合库。

我整理了一个小要点来说明差异。您还可以通过修改汇总 REPL 来感受 Rollup 的输出。

最新更新