2015-12-09 5 views
3

При запуске столпотворения над моей ES6 импортирует переименовывает моим импортирует весь путь через мой источник:Бабель ES6 модули: Почему Бабель импорт переименования

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

становится

'use strict'; 
var _bar = require('./bar'); 
console.log(_bar.foo); 

Именованной импорт переименовывается от:

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

в

'use strict'; 
var _bar = require('./bar'); 
console.log(_bar.bar); 

А еще хуже импорта по умолчанию, так как 2 также добавил:

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

становится

'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 был переименован в _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); 
+1

Я не могу ответить на * почему *, но вы должны генерировать [sourcemaps] (https://www.npmjs.com/package/gulp-babel#source-maps), чтобы отлаживать или вы у вас будет гораздо сложнее отладить поиск имени модулей. – CodingIntrigue

+0

Я генерирую исходные коды, но, насколько я знаю, Chrome Inspector не знает об источниках и не может обнаружить переименование переменной ... Также отладчик «прыгает» в нужный исходный файл, но не может проверять переменные. – david

+2

«* Почему бабеля невозможно преобразовать ... *" - это, безусловно, может, это просто не то, что они сделали. Я не думаю, что есть веские причины для выбора одного над другим, кроме отладки, поскольку они оцениваются эквивалентно. Возможно, вам захочется открыть ошибку (запрос функции?), Если вам это интересно. – Bergi

ответ

5

Это делается для имитации «ссылка» природа импорта модулей. В

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).

Смежные вопросы