关于循环依赖的问题



我正在测试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');

结果

// 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

所以index进口a,a进口b

b尝试导入a,但a尚未完成,因此a返回未完成的模块。

好吧,我明白了。


但是esmodule的语法呢?

我像这样复制代码。

//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
}

但结果改变了。

ReferenceError: Cannot access 'A_done' before initialization

错误发生。

为什么它给我的结果与commonjs不同?

esmodule不返回未完成的模块?

你可以在这里找到这个代码示例

esmodule不返回未完成的模块?

。试试用var代替let

为什么它给我一个不同的结果比commonjs?

因为它也改变了求值顺序。导入被"挂起",模块代码的求值被推迟,直到所有依赖项都设置好(也就是说,要么完全完成求值,要么声明了它们的变量并等待循环依赖项)。与require()调用不同,您不会在a中间执行b的初始化代码。

相关内容

  • 没有找到相关文章

最新更新