首页 > 解决方案 > 如何防止 Babel 发出两次出口申报单?

问题描述

preset-env我今天在我正在构建的一些 JavaScript 上查看 Babel(版本 7.2.3,使用)的输出。这段代码将专门用于浏览器,可能用于慢速连接,以及在预先存在的网站上,所以我向后弯腰以使代码尽可能紧凑。Babel 的大部分转换都按照我认为的方式进行,但我对它为支持导出而发出的冗余代码感到有些惊讶。


具体来说,我很惊讶这个简单的声明——</p>

export const foo = ... ,
    bar = ... ,
    baz = ... ;

被转换成多组作业——</p>

exports.foo = exports.bar = exports.baz = void 0;

...

var foo = ... ,
    bar = ... ,
    baz = ... ;

...

exports.foo = foo;
exports.bar = bar;
exports.baz = baz;

当我期待一些更轻更直接的东西时,比如以下两种形式中的任何一种:

(预期的和可接受的)

var foo = ... ,
    bar = ... ,
    baz = ... ;

exports.foo = foo;
exports.bar = bar;
exports.baz = baz;

(理想的)

exports.foo = ... ;
exports.bar = ... ;
exports.baz = ... ;

到目前为止,无论我尝试了什么,我都无法让 Babel 发出比上面显示的输出更短或更简单的东西。似乎没有配置选项(类似于--no-recursive-modules),而且我似乎也无法对声明进行任何更改以使 Babel 表现得更好。我仍然更喜欢使用export关键字而不是exports直接编写对象,因为export语法是未来。

这个模块在其他方面是紧密编写的,所以它主要由相互引用并且几乎全部导出的小函数(和高阶函数调用)组成——这意味着在缩小后大约三分之一的结果 JS export包含声明!

Babel 可能会添加初始void 0分配以小心递归模块包含或其他内容,但在此模块中没有发生任何事情:导入和导出严格是树形的,甚至不是 DAG 形的——而且绝对不是递归或通用图-喜欢。该void 0分配只是浪费了代码,浪费了下载时间,浪费了浏览器中的执行时间。


tl;dr:将我的 Babel 转译模块的大小缩小到应有的大小:

如何防止 Babelexports.foo = exports.bar = ... = void 0;在输出顶部发出无用的声明?

标签: javascriptbabeljses6-modules

解决方案


推荐阅读