我最近一直在研究rollup,看看它与Webpack和其他Bundle 包有什么不同.我遇到的一件事是,由于"扁平Bundle ",它对图书馆更有利.这是以tweeta recent PR for React to utilize Rollup为基础的.

根据我的经验,Rollup更擅长构建库,因为它对扁平Bundle (例如提升)进行了更好的优化.1/2

不过,如果你将应用程序与代码拆分等Bundle 在一起,Webpack 2可能会对你更好.2/2

但我不完全确定我是否理解这意味着什么.扁平Bundle 指的是什么?我知道Rollup的文档提到了treeshaking个,以帮助减少Bundle 包的大小,但却提到了Webpack also has a way of doing this个.也许我只是不完全理解这个概念.

请注意,这不是关于汇总和网页包的比较问题.对于对此感兴趣的人来说,这里有一个comparison chart for that by Webpack.这主要是问什么是扁平Bundle ?为了实现这一点,Rollup在内部做了什么?

推荐答案

Edit: Rollup supports code splitting - 100

Edit: Webpack now supports scope hoisting in some situations — 100

对于这类东西,我们可能都有不同的定义,但我认为扁平Bundle 只是意味着"将模块转换为单个Bundle 包"——也就是说,"扁平"是多余的.React 16的最大区别在于,默认情况下,你会使用一个预先制作的Bundle 包,而不是你的应用程序负责Bundle React的源模块(尽管总是有prebuilt UMD bundle of React available个,用Browserify构建).

相反,两者之间的最大区别在于发生了什么.webpack的工作方式是将每个模块包装在一个函数中,并创建一个实现加载程序和模块缓存的包.在运行时,依次计算这些模块函数中的每一个,以填充模块缓存.这种体系 struct 有很多优点——它可以实现代码拆分和按需加载以及热模块替换(HMR)等高级功能.

Rollup采用不同的方法——它将所有代码放在同一级别(根据需要重写标识符,以避免变量名之间的冲突等).这通常被称为"scope hoisting".因此,没有每个模块的开销,也没有每个包的开销.你的包一定会更小,而且判断速度也会更快,因为间接性更少(更多信息-The cost of small modules).取舍是,这种行为依赖于ES2015模块语义,这意味着webpack的一些高级功能更难实现(例如,Rollup不支持代码拆分,至少目前还不支持!).

简而言之,webpack generally更适合应用程序,而Rollup generally更适合库.

我已经凑了small gist illustrating the differences个.您还可以在tinkering with the Rollup REPL之前感受到Rollup的输出.

Reactjs相关问答推荐

react 导致不必要的回归

如何通过TEK查询将对象传递到Express后台

sourceBuffer. appendBuffer成功,但h5视频播放器卡住了

props 可以在Reaction中锻造吗?

react 派生状态未正确更新

如何通过浏览器路由在单独的.jsx文件中使用MUI抽屉?

如何用Reaction做交互式的MathML?

面对动画警告:未指定`useNativeDriver`.这是必需的选项,并且必须在REACT本机中显式设置为`true`或`False`

梅X折线图无响应

如何在React中正确地将密码输入类型切换为文本或反之亦然(下一页)

在构建或部署Reaction应用程序时出错

如何使我的代码可以接受我想要的每一个链接

React useEffect 问题...异步函数内的变量正在获取延迟的更新值

在 React 中将 MUI 样式外包到单独的文件中?

在一个事件处理程序中进行多次调度是个好主意吗?

i18next中复数键的理解

React:如何设置光标 Select

当从数组中删除数据时,UseEffect 不会重新渲染,仅在添加数据时才会重新渲染

将 set statehook 函数传递给子路由组件.解构错误

axios post方法中的请求失败,状态码为500错误