Babel - Различные результаты переноса при экспорте модулей es - PullRequest
0 голосов
/ 07 сентября 2018

Допустим, у меня есть два модуля es myModule / A и myModule / B , и я хочу экспортировать их в мой myModule / index файл. Для этого мне нужно:

- Приблизительно A:

// myModule/index.es
import moduleA from './A';
import moduleB from './B';
export { moduleA, moduleB };


Бабель передаст код, как показано ниже:

'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.moduleB = exports.moduleA = undefined;

var _A = require('./A');

var _A2 = _interopRequireDefault(_A);

var _B = require('./B');

var _B2 = _interopRequireDefault(_B);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

exports.moduleA = _A2.default;
exports.moduleB = _B2.default;

- Прибл. B:

// myModule/index.es
export { default as moduleA } from './A';
export { default as moduleB } from './B';


Бабель передаст код, как показано ниже:

'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _A = require('./A');

Object.defineProperty(exports, 'moduleA', {
  enumerable: true,
  get: function get() {
    return _interopRequireDefault(_A).default;
  }
});

var _B = require('./B');

Object.defineProperty(exports, 'moduleB', {
  enumerable: true,
  get: function get() {
    return _interopRequireDefault(_B).default;
  }
});

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }


Может кто-нибудь объяснить, почему у нас разные результаты ?. Спасибо!

1 Ответ

0 голосов
/ 07 сентября 2018

Это разные результаты, потому что Babel 6 плохо справляется с компиляцией этих случаев.В Babel 7.x плагины преобразования модулей были переписаны с нуля, и в двух примерах выводится идентичный результат:

"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
Object.defineProperty(exports, "moduleA", {
  enumerable: true,
  get: function get() {
    return _A.default;
  }
});
Object.defineProperty(exports, "moduleB", {
  enumerable: true,
  get: function get() {
    return _B.default;
  }
});

var _A = _interopRequireDefault(require("./A"));

var _B = _interopRequireDefault(require("./B"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

Как отмечено Берги , единственное функциональное различие междуво-вторых, первая создаст локальные переменные с именами moduleA и moduleB, но так как ваш пример кода никогда не пытается использовать эти импортированные переменные, нет никакой разницы в выводе.

...