如何防止Babel两次发出出口报关单?

时间:2019-01-29 19:20:49

标签: javascript babeljs es6-modules

我今天在我正在构建的一些JavaScript上查看Babel(版本7.2.3,使用preset-env)的输出。该代码将仅在浏览器中使用,可能会通过缓慢的连接以及在现有的网站上使用,因此我弯腰以使代码尽可能紧凑。 Babel的大多数转码都是按照我认为的方式进行的,但令我惊讶的是它发出了多少冗余代码来支持出口。


特别是让我惊讶的是,这个简单的声明-

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

被转换为多套作业-

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约占三分之一。 just export的声明!

Babel可能添加了初始void 0分配,以注意递归模块的包含或其他内容,但是此模块中未发生任何事情:导入和导出严格是树形的,甚至不是DAG形的-而且绝对不是递归或类似一般图形的。 void 0分配只是浪费代码,浪费下载时间和浪费浏览器中的执行时间。


tl; dr :将Babel转换模块的大小减小到应该的大小:

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

0 个答案:

没有答案