Estaba probando la dependencia circular con commonjs.
//index.js console.log('main starting'); const a = require('./a.js'); const b = require('./b.js'); console.log('in main, a.done = %j, b.done = %j', a.done, b.done); //a.js console.log('a starting'); exports.done = false; const b = require('./b.js'); console.log('in a, b.done = %j', b.done); exports.done = true; console.log('a done'); //b.js console.log('b starting'); exports.done = false; const a = require('./a.js'); console.log('in b, a.done = %j', a.done); exports.done = true; console.log('b done');el resultado fue
// output main starting a starting b starting in b, a.done = false b done in a, b.done = true a done in main, a.done = true, b.done = true Entonces, index la importación a y a importación b
b intente importar a pero a no está terminado, por lo que devuelve a módulo sin terminar.
Ok bien, entendí.
Pero, ¿qué pasa con la sintaxis de esmodule ?
Reproduje un código como este.
//index.js console.log('main starting'); import a from './a.js'; import b from './b.js'; console.log('in main, a.done = %j, b.done = %j', a.done, b.done); //a.js console.log('a starting'); export let done = false; import {done as B_done} from './b.js'; console.log('in a, b.done = %j', B_done); done = true; console.log('a done'); export default { done } //b.js console.log('b starting'); export let done = false; import {done as A_done} from './a.js'; console.log('in b, a.done = %j', A_done); done = true; console.log('b done'); export default { done }Pero el resultado fue cambiado.
ReferenceError: Cannot access 'A_done' before initialization
Este error ocurrió.
¿Por qué me da un resultado diferente al de commonjs?
¿ esmodule no devuelve módulos sin terminar?
De hecho, puede encontrar este ejemplo de código aquí
¿Esmodule no devuelve módulos sin terminar?
Lo hace. Pruebe con var en lugar de let .
¿Por qué me da un resultado diferente al de commonjs?
Porque también cambió el orden de evaluación. Las importaciones se "elevan", la evaluación del código del módulo se difiere hasta que se configuran todas las dependencias (es decir, se terminan de evaluar por completo o se declaran sus variables y se esperan dependencias circulares). A diferencia de la llamada require() , no obtendrá el código de inicialización de b ejecutándose en medio de a .