webpack - 桶锉和摇树
问题描述
这是一个示例存储库,显示了此线程中报告的问题的示例:https ://github.com/Eux86/tree-shaking-barrel-test/blob/master/README.md
我试图了解使用 Barrel 文件将库项目中的函数和类导入到另一个使用 webpack 的项目时会产生什么影响,并且应该能够对捆绑包进行 treeshake。
想象一下我有一个项目:
图书馆
索引.ts
libA.ts
libB.ts
index.ts 有这个代码:
export { LibAMain } from 'LibA';
export { LibBMain } from 'LibB';
所以我使用索引作为桶文件来导出我将在我的库中开发的所有功能。
第二个项目将是:
图书馆用户
- 索引.ts
Index.ts 有这个代码:
import { LibAMain } from 'library'
LibAMain();
现在:library-user 是使用 webpack 构建的,我希望能够对 MyLib 中未使用的库进行 treeshake,但是当我查看生成的包时,我看到它包含引导 LibA.js 和 LibB.js,这不应该在那里:
如果我将 index.ts 更改为:
import { LibAMain } from 'library/lib/LibA'
LibAMain();
然后 webpack 做得很好,我只在最终包中看到 LibA:
TL;DR:我怎样才能继续使用桶索引文件,只从“库”导入所有内容,但仍然让 treeshaking 工作?
感谢您的任何帮助 :)
解决方案
它看起来像您的代码中的模块问题,而不是 webpack。
tsconfig.json
...
"module": "commonjs",
...
Commonjs 模块系统不支持在 webpack 中摇树(仅像您在上面所做的那样直接导入有效mylib/libA
)。
要修复 github 存储库中的树抖动,您应该使用module
:es2015
或esnext
in tsconfig.json
。
...
"module": "esnext",
...
但你是对的——不幸的是,treeshaking 并不是 webpack 最好的一面。
有几种方法可以更好地摇动你的树:
- 用于改进 treeshaking 的插件
- 副作用webpack 选项
- 使用的导出webpack 选项
- 从 移动
webpack
到rollup
。Rollup 默认具有一流的 tree shaking 功能(我不建议在大型项目中这样做)。
推荐阅读
- python - Spyder 不导入底图
- c# - 如何以编程方式将动态创建的超链接添加到堆栈面板wpf
- apache-flink - Apache Flink - 如何结合 AssignerWithPeriodicWatermark 和 AssignerWithPunctuatedWatermark?
- asp.net-mvc - ASP.NET MVC 异常“角色管理器功能尚未启用”
- spring-boot - 在 ELB 后面使用带有 Spring Boot 的 SAML 重定向到 http 而不是 https
- bash - 如果设置,则使用环境变量,否则在 makefile 中使用默认值
- javascript - 如何更新 Jquery 范围滑块中的值
- android - 使用 Firebase 在 android 中搜索
- paypal - Braintree PCI 合规性问题
- scala - 在 Spark Stream 中保存 PairRdd 时出错