Что делает Babel, чтобы позволить мне использовать любое имя для импорта модуля узла, который экспортирует функцию - PullRequest
0 голосов
/ 26 июня 2018

Пример прояснит мой вопрос, скажем, я хочу импортировать модуль отладки в мои коды vuejs

Экспорт модуля отладки createDebug функция, подобная этой,

module.exports = require('./browser.js');
...
exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;

function createDebug(namespace) { ... }

Когда я использую import для импорта модуля отладки, я могу дать ему любое имя, например

import debug from 'debug' // or any name I want, e.g
import debugjs from 'debug'

Я понимаю, что если export default анонимная функция, я могу импортировать ее с любым именем, которое яхочу, но здесь дело не в этом.

Так почему я могу использовать любое имя для его импорта?

---------------- update-----------------

Одним из выводов ответа является то, что import "any name" работает для и экспортной анонимной функции по умолчанию и именованной функции.

1 Ответ

0 голосов
/ 26 июня 2018

но здесь дело не в этом.

Это вроде как.Вы пытаетесь импортировать модуль без экспорта ES6.Вы пытаетесь импортировать модуль CommonJS.Поэтому Бабел должен принять решение, как обрабатывать этот случай.

Существует два распространенных способа экспорта чего-либо из модуля CommonJS:

  • Назначение свойства для exports (илиmodule.expoets), например exports.answer = 42;
  • Перезаписать значение module.exports, например module.exports = 42;.

Во втором случае вы экспортируете только одно значениеиз модуля.Это в основном то, чем является экспорт по умолчанию (поскольку он может быть только один), и это то, что вы делаете в своем коде.

Другими словами, при импорте модуля CommonJS через операторы ES6 import, затемзначение module.exports используется как значение экспорта по умолчанию.

Мы можем подтвердить это, посмотрев , как Бабель преобразует код :

// import foo from 'bar'; becomes
var _bar = require('bar');

var _bar2 = _interopRequireDefault(_bar);

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