Antes, babel adicionava a linha module.exports = exports["default"]
. Não faz mais isso. O que isso significa é antes que eu pudesse fazer:
var foo = require('./foo');
// use foo
Agora eu tenho que fazer isso:
var foo = require('./foo').default;
// use foo
Não é um grande negócio (e acho que é isso que deveria ter sido o tempo todo). O problema é que tenho um monte de código que dependia da maneira como as coisas funcionavam (posso converter a maioria delas em importações do ES6, mas não todas). Alguém pode me dar dicas de como fazer a maneira antiga funcionar sem ter que passar pelo meu projeto e consertar isso (ou até mesmo algumas instruções sobre como escrever um codemod para fazer isso seriam bem lisas).
Obrigado!
Exemplo:
Entrada:
const foo = {}
export default foo
Saída com Babel 5
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var foo = {};
exports["default"] = foo;
module.exports = exports["default"];
Saída com Babel 6 (e plugin es2015):
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var foo = {};
exports["default"] = foo;
Observe que a única diferença na saída é a module.exports = exports["default"]
.
Editar
Você pode estar interessado neste post do blog que escrevi depois de resolver meu problema específico: Entendendo mal os módulos ES6, atualizando o Babel, as lágrimas e uma solução
fonte
require
que você precisa se estiver trabalhando em uma base de código que usa Babel? Provavelmente, existem outras abordagens que permitiriam evitar isso de qualquer maneira.if (false) { require('./foo') }
webpack ignoraria realmentefoo.js
o pacote resultante.false
alternância lá? Se houver uma condição disponível na sua configuração do webpack, pode haver outra opção.export default {foo, bar}
commodule.exports = {foo, bar}
. Gostei bastante do método incorreto , que agora não é suportado.Respostas:
Você também pode usar este plugin para recuperar o
export
comportamento antigo .fonte
Se você deseja um comportamento de exportação do CommonJS, precisará usar o CommonJS diretamente (ou usar o plug-in na outra resposta). Esse comportamento foi removido porque causou confusão e levou a semântica ES6 inválida, na qual algumas pessoas confiaram, por exemplo
e depois
que é ES6 inválido, mas funcionou devido ao comportamento de interoperabilidade CommonJS que você está descrevendo. Infelizmente, não é possível suportar os dois casos, e permitir que as pessoas escrevam ES6 inválido é um problema pior do que fazer você
.default
.O outro problema era que era inesperado para os usuários se eles adicionassem uma exportação nomeada no futuro, por exemplo
então
mas
então
fonte
export default function () {}
no módulo A e,import a from 'a'
em seguida, no módulo B, com Babel 6a
seria{ default: function () {} }
... Pelo que eu posso entender em explorejs.com/es6/…, isso deve funcionar e eu devo exportar função em B, não o objeto.Para os autores da biblioteca, você pode solucionar esse problema.
Normalmente, tenho um ponto de entrada
index.js
, que é o arquivo para o qual aponto no campo principalpackage.json
. Ele não faz nada além de reexportar o ponto de entrada real da lib:Para solucionar o problema do babel, alterei isso para uma
import
instrução e atribua o padrão amodule.exports
:Todos os meus outros arquivos permanecem como módulos ES6 puros, sem soluções alternativas. Portanto, apenas o ponto de entrada precisa ser ligeiramente alterado :)
Isso funcionará para os requisitos do commonjs e também para as importações do ES6 porque o babel não parece ter descartado a interoperabilidade inversa (commonjs -> es6). Babel injeta a seguinte função para corrigir os commonjs:
Passei horas lutando contra isso, então espero que isso poupe o esforço de outra pessoa!
fonte
module.exports
eexport default
coisas assim. Agora estamos de volta à estaca zero?require("whatever").default
. Se você não é um autor biblioteca, esta é provavelmente irrelevanteEu tive esse tipo de problema. E esta é a minha solução:
//src/arithmetic.js
//src/main.js
fonte