Раньше Бабель добавлял строчку module.exports = exports["default"]
. Это больше не делает это. Что это значит, прежде чем я смог сделать:
var foo = require('./foo');
// use foo
Теперь я должен сделать это:
var foo = require('./foo').default;
// use foo
Не огромная сделка (и я предполагаю, что так и должно быть). Проблема в том, что у меня много кода, который зависел от того, как все работало раньше (я могу преобразовать большую часть его в импорт ES6, но не все). Может кто-нибудь дать мне советы о том, как заставить старый способ работать без необходимости проходить через мой проект и исправлять это (или даже некоторую инструкцию о том, как написать codemod, чтобы сделать это, было бы довольно гладко).
Спасибо!
Пример:
Входные данные:
const foo = {}
export default foo
Выход с Вавилоном 5
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var foo = {};
exports["default"] = foo;
module.exports = exports["default"];
Вывод с Babel 6 (и плагином es2015):
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var foo = {};
exports["default"] = foo;
Обратите внимание, что единственная разница в выводе - это module.exports = exports["default"]
.
редактировать
Возможно, вас заинтересует этот пост, который я написал после решения моей конкретной проблемы: недопонимание модулей ES6, обновление Babel, слезы и решение
источник
require
если вы работаете в кодовой базе, которая использует Babel? Скорее всего, есть и другие подходы, которые в любом случае позволят вам избежать этого.if (false) { require('./foo') }
с webpack пропустил бы фактическое включениеfoo.js
в получившийся пакет.false
тумблером? Если это условие доступно в вашей конфигурации веб-пакета, может быть другой вариант.export default {foo, bar}
сmodule.exports = {foo, bar}
. Мне очень понравился неправильный метод, который сейчас не поддерживается.Ответы:
Вы также можете использовать этот плагин, чтобы вернуть старое
export
поведение.источник
Если вам нужно поведение экспорта CommonJS, вам нужно использовать CommonJS напрямую (или использовать плагин в другом ответе). Это поведение было удалено, потому что оно вызывало путаницу и приводило к неверной семантике ES6, на которую, например, полагались некоторые люди.
а потом
который является недопустимым ES6, но работал из-за поведения совместимости CommonJS, которое вы описываете. К сожалению, поддержка обоих случаев невозможна, и позволить людям писать недействительные ES6 - проблема хуже, чем заставлять вас делать это
.default
.Другая проблема заключалась в том, что пользователи неожиданно добавили именованный экспорт, например, в будущем.
затем
но
затем
источник
export default function () {}
в модуле A, а затемimport a from 'a'
в модуле B, с Babel 6a
будет{ default: function () {} }
... Из того, что я могу понять из exploringjs.com/es6/… это должно работать, и я должен получить экспортированный функция в B, а не объект.Для авторов библиотеки вы можете обойти эту проблему.
У меня обычно есть точка входа, то
index.js
есть файл, на который я указываю из основного поляpackage.json
. Он ничего не делает, кроме как реэкспортирует фактическую точку входа в lib:Чтобы обойти проблему babel, я изменил это на
import
утверждение и затем назначил по умолчаниюmodule.exports
:Все остальные мои файлы остаются чистыми модулями ES6, без каких-либо обходных путей. Так что только точка входа нуждается в небольшом изменении :)
Это будет работать для потребностей commonjs, а также для импорта ES6, потому что babel, похоже, не сбросил обратное взаимодействие (commonjs -> es6). Бабель вводит следующую функцию для исправления commonjs:
Я потратил часы на борьбу с этим, поэтому я надеюсь, что это спасет кого-то еще от усилий!
источник
module.exports
иexport default
все такое. Теперь мы вернулись на круги своя?require("whatever").default
. Если вы не автор библиотеки, это, вероятно, не имеет значенияУ меня была такая проблема. И это мое решение:
//src/arithmetic.js
//src/main.js
источник