unexpected react exports example ecmascript-6 commonjs babeljs

ecmascript-6 - react - module.exports class



Babel 6 cambia la forma en que exporta el valor predeterminado (4)

Antes, babel agregaba la línea module.exports = exports["default"] . Ya no hace esto. Lo que esto significa es antes de que pueda hacer:

var foo = require(''./foo''); // use foo

Ahora tengo que hacer esto:

var foo = require(''./foo'').default; // use foo

No es un gran problema (y supongo que esto es lo que debería haber sido todo el tiempo). El problema es que tengo mucho código que depende de la forma en que funcionaban las cosas (puedo convertir la mayor parte a importaciones de ES6, pero no todas). ¿Alguien puede darme consejos sobre cómo hacer que la vieja forma funcione sin tener que pasar por mi proyecto y arreglar esto (o incluso alguna instrucción sobre cómo escribir un codemod para hacer esto sería bastante ingenioso).

¡Gracias!

Ejemplo:

Entrada:

const foo = {} export default foo

Salida con Babel 5

"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var foo = {}; exports["default"] = foo; module.exports = exports["default"];

Salida con Babel 6 (y el complemento es2015):

"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var foo = {}; exports["default"] = foo;

Observe que la única diferencia en la salida es el module.exports = exports["default"] .

Editar

Puede que le interese esta publicación de blog que escribí después de resolver mi problema específico: malentendidos módulos ES6, actualización de Babel, lágrimas y una solución


He tenido ese tipo de problema. Y esta es mi solución:

//src/arithmetic.js

export var operations = { add: function (a, b) { return a + b; }, subtract: function (a, b) { return a - b; } };

//src/main.js

import { operations } from ''./arithmetic''; let result = operations.add(1, 1); console.log(result);


Para los autores de la biblioteca, puede solucionar este problema.

Por lo general, tengo un punto de entrada, index.js , que es el archivo al que apunto desde el campo principal en package.json . No hace nada más que reexportar el punto de entrada real de la lib:

export { default } from "./components/MyComponent";

Para solucionar el problema de babel, cambié esto a una declaración de import y luego module.exports el valor predeterminado a module.exports :

import MyComponent from "./components/MyComponent"; module.exports = MyComponent;

Todos mis otros archivos permanecen como módulos ES6 puros, sin soluciones. Entonces, solo el punto de entrada necesita un cambio ligeramente :)

Esto funcionará para los requisitos de commonjs, y también para las importaciones de ES6 porque babel no parece haber eliminado la interoperabilidad inversa (commonjs -> es6). Babel inyecta la siguiente función para parchear commonjs:

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

¡He pasado horas luchando contra esto, así que espero que esto le ahorre el esfuerzo a otra persona!


Si desea un comportamiento de exportación de CommonJS, deberá usar CommonJS directamente (o usar el complemento en la otra respuesta). Este comportamiento se eliminó porque causó confusión y condujo a una semántica ES6 no válida, en la que algunas personas habían confiado, por ejemplo

export default { a: ''foo'' };

y entonces

import {a} from ''./foo'';

que es ES6 no válido pero funcionó debido al comportamiento de interoperabilidad de CommonJS que está describiendo. Desafortunadamente, no es posible admitir ambos casos, y permitir que las personas escriban ES6 no válidas es un problema peor que .default hacerlo .default .

El otro problema era que era inesperado para los usuarios si agregaban una exportación con nombre en el futuro, por ejemplo

export default 4;

entonces

require(''./mod''); // 4

pero

export default 4; export var foo = 5;

entonces

require(''./mod'') // {''default'': 4, foo: 5}


También puede usar este complemento para recuperar el antiguo comportamiento de export .