2017-09-27 221 views
2

很多时候,阅读Babel及其插件的文档,我遇到了loose选项。我还没有看到一个足够好的例子来理解它是什么。在Babeljs中“松散”的意思是什么?

下面是preset-es2015文档中的示例。

松散

boolean,默认为false

为此预设中的任何插件启用“松散”转换, 允许它们转换。

有人可以详细解释这个选项吗?

回答

1

This article是目前网络上最好的例子。我建议你阅读这篇文章,它解释了插件babel-plugin-transform-es2015-class的例子。

下面我将给出另一个插件babel-plugin-transform-es2015-for-of的例子。

源代码:

for (var i of foo) {} 

loose: false - 生成的代码获得了最严格的,并与标准兼容,具有许多检查。

var _iteratorNormalCompletion = true; 
var _didIteratorError = false; 
var _iteratorError = undefined; 

try { 
    for (var _iterator = foo[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { 
    var i = _step.value; 
    } 
} catch (err) { 
    _didIteratorError = true; 
    _iteratorError = err; 
} finally { 
    try { 
    if (!_iteratorNormalCompletion && _iterator.return) { 
     _iterator.return(); 
    } 
    } finally { 
    if (_didIteratorError) { 
     throw _iteratorError; 
    } 
    } 
} 

loose: true - 较轻的版本,它遵循规格较少,但产生相同的结果。

for (var _iterator = foo, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { 
    var _ref; 

    if (_isArray) { 
    if (_i >= _iterator.length) break; 
    _ref = _iterator[_i++]; 
    } else { 
    _i = _iterator.next(); 
    if (_i.done) break; 
    _ref = _i.value; 
    } 

    var i = _ref; 
}