我今天在我正在构建的一些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;
声明?