问题
该babel-plugin-external-helpers
插件不负责在最终包中注入这些依赖项。
它唯一控制的是生成的代码将如何访问这些函数。例如:
classCallCheck(this, Foo);
// or
babelHelpers.classCallCheck(this, Foo);
它是必需的,所以所有rollup-plugin-babel
需要做的就是注入babelHelpers
每个模块。
该文档具有误导性,插件whitelist
上没有选项external-helpers
。它位于完全独立的模块和命令行工具babel-external-helpers
上,它实际上负责生成babelHelpers
.
这rollup-plugin-babel
就是注入的东西babelHelpers
。并使用一种技巧来模块化最终代码。它调用babel-external-helpers
生成助手,并忽略白名单参数。请参阅我要求公开选项的问题。
这种方法是正确的,因为汇总将摇树未使用的辅助函数。然而,一些帮助程序(如asyncGenerator
)的编写方式很难检测到初始化是否有任何副作用,从而防止在 tree-shaking 期间被删除。
解决方法
我分叉rollup-plugin-babel
并创建了一个 PR,它公开了在插件选项中构建 babelHelpers 的白名单选项。可以这样使用:
require("rollup").rollup({
entry: "./src/main.js",
plugins: [
require("rollup-plugin-babel")({
"presets": [["es2015", { "modules": false }]],
"plugins": ["external-helpers"],
"externalHelpersWhitelist": ['classCallCheck', 'inherits', 'possibleConstructorReturn']
})
]
}).then(bundle => {
var result = bundle.generate({
format: 'iife'
});
require("fs").writeFileSync("./dist/bundle.js", result.code);
}).then(null, err => console.error(err));
请注意,我没有在 npm 上发布分发版本,您必须克隆 git 存储库并使用rollup -c
.
解决方案
在我看来,正确的解决方案是以某种方式检测或告诉汇总这些导出是纯的,因此可以通过摇树移除。在做一些研究之后,我将在 github 上开始讨论它。