【问题标题】:Is re-exporting modules harmful for tree-shaking?重新导出模块对摇树有害吗?
【发布时间】:2019-07-14 13:25:58
【问题描述】:

我与我的同事发生了争执,我们似乎无法从任何官方来源(MDN、webpack 文档……)找到答案。我的研究hasn't yielded much 也是。 even when it comes to importing 似乎也有疑问。

我们的设置是 Webpack、Babel 和一个典型的 React / Redux 应用程序。举个例子:

export * from './actions';
export * from './selectors';
export * from './reducer';

export { default } from './reducer';

这允许我将 Redux 模块分成逻辑部分,使代码更易于阅读和维护。

但是,我的一些同事认为 export * from 实际上可能会损害 webpack 的 tree-shaking 能力,因为它会欺骗它相信一个导出实际上只是被使用了正在重新出口。

所以我的问题是,是否有任何事实可以证明或反驳这一点?

【问题讨论】:

  • 为什么不建立一个虚拟项目并尝试一下呢?我意识到这不像汇总团队的实际文档那样具有权威性,但它并不重要。
  • github.com/webpack/webpack/issues ... 说真的,对于开源的东西,有时最好的地方是在 repo...
  • @Bergi 所有这些都与导入有关。我特意询问是否使用 export * from './module' 重新导出,这是另一回事。
  • @pbondoer 哎呀,你说得对,我完全将语法与命名空间导入混淆了,其中树抖动优化不那么微不足道。
  • @HereticMonkey 指向索引页面的链接(保证会随时间变化)是我需要阅读的最后一件事。

标签: javascript webpack ecmascript-6 es6-modules tree-shaking


【解决方案1】:

据信export * from 可能会损害 webpack 的 tree-shaking 能力,通过诱使它相信一个导出被使用,而实际上它只是被重新导出。

不,导入/导出声明除了为导出的变量设置别名外,什么都不做,它们不算作“使用”。鉴于它们的语义,它们会被任何捆绑程序专门跟踪,不会对摇树产生不利影响。

即使是正确完成的重命名别名也不会破坏它:

export { X as Y } from '…';

import { X as Y } from '…';
export { Y }

import { X } from '…';
export { X as Y }

但语句中的使用将被视为使用和中断(非复杂)优化:

import { X } from '…';
export const Y = X; // avoid!

所以我的问题是,是否有任何事实可以证明或反驳这一点?

您可以尝试一下,看看效果如何。

【讨论】:

    猜你喜欢
    • 2021-05-03
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    相关资源
    最近更新 更多