Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ecmascript 6 Babel ES6模块:为什么Babel重命名导入_Ecmascript 6_Babeljs - Fatal编程技术网

Ecmascript 6 Babel ES6模块:为什么Babel重命名导入

Ecmascript 6 Babel ES6模块:为什么Babel重命名导入,ecmascript-6,babeljs,Ecmascript 6,Babeljs,在我的ES6导入上运行babel时,它会通过我的源代码重命名我的导入: import {foo as bar} from './bar'; console.log(bar); 变成 'use strict'; var _bar = require('./bar'); console.log(_bar.foo); 'use strict'; function _interopRequireDefault(obj) { return obj && obj.__esModule ?

在我的ES6导入上运行babel时,它会通过我的源代码重命名我的导入:

import {foo as bar} from './bar';
console.log(bar);
变成

'use strict';
var _bar = require('./bar');
console.log(_bar.foo);
'use strict';
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _bar = require('./bar');
var _bar2 = _interopRequireDefault(_bar);
console.log(_bar2['default']);
命名的导入将从以下位置重命名:

import {bar} from './bar';
console.log(bar);

默认导入的情况更糟,因为还添加了2:

import bar from './bar';
console.log(bar);
变成

'use strict';
var _bar = require('./bar');
console.log(_bar.foo);
'use strict';
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _bar = require('./bar');
var _bar2 = _interopRequireDefault(_bar);
console.log(_bar2['default']);
巴贝尔为什么要这样做?背景:在Chrome中调试应用程序时,我需要转到源文件,了解变量是如何重命名以获取其当前值的,因为Chrome不知道
bar
已重命名为
\u bar.bar
。。。这使得使用WebStorm之类的工具进行调试几乎不可能

为什么巴贝尔不能将命名的导入转换为

'use strict';
var _bar = require('./bar');
var bar = _bar.bar;
console.log(bar);
'use strict';
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _bar = require('./bar');
var _bar2 = _interopRequireDefault(_bar);
var bar = _bar2['default']
console.log(bar);
和默认导入到

'use strict';
var _bar = require('./bar');
var bar = _bar.bar;
console.log(bar);
'use strict';
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _bar = require('./bar');
var _bar2 = _interopRequireDefault(_bar);
var bar = _bar2['default']
console.log(bar);
这样做是为了模拟模块导入的“引用”性质。在

import {foo as bar} from './bar';
console.log(bar);
bar
不仅仅是一个保存值的变量,它是对其他模块导出的引用。如果导出的值更改,则导入也会更改

例如:

// a.js
export var a = 42;
setTimeout(() => a = 21, 500);

// b.js
import {a} from './a';
setTimeout(() => console.log(a), 1000);

根据规范,
b.js
中的代码必须记录
21
。由于JavaScript没有按引用赋值,实现这种行为的唯一方法是将每次导入转换为MemberExpression(
foo.bar
)。

我无法回答原因,但您应该生成以进行调试,否则在调试时将遇到更困难的问题,即查找模块名称。我正在生成sourcemaps,但据我所知,Chrome Inspector不知道sourcemaps,并且无法检测变量重命名。。。此外,调试器正在“跳转”到正确的源文件,但无法检查变量。“为什么不能进行babel转换…”-当然可以,这不是他们所做的。除了可调试性之外,我不认为有任何好的理由选择一个而不是另一个,因为它们的评估是等价的。如果您关心这一点,您可能希望打开一个bug(功能请求?)。