ES6 循环依赖的一个例子
a.js
1 | import {bar} from './b.js'; |
b.js
1 | import {foo} from './a.js'; |
babel-node a.js -> 执行完毕
- import {bar} from ‘./b.js’ -> 此时对b模块只是一个引用, 不会去执行
- foo() -> bar() -> 执行b
- import {foo} from ‘./a.js’ -> 指向a.js 中的foo对象
- Math.random() > 0.5 条件成立执行 foo 跳到2, 否则 不执行, 直接执行5
- 执行完毕
ES6处理循环依赖
ES6根本不关心会不会发生循环依赖, 只是生产一个指向被加载模块的一个引用, 这和CommonJS不同
上述代码webpack编译后如下:
1 | (function(modules) { |
1 | // 说明当前module是使用ES6模块 |
ES6 输出值的引用
a.js
1 | import {foo} from './b'; |
b.js
1 | export let foo = 1; |
- babel-node a.js
- -> 1 -> 2 -> 2
1 | (function(modules) { |
ES6模块的特性
- import 命令会被javascript 引擎静态分析, 先于模块内的其它内容执行
- export 命令会有变量声明提前的效果
a.js
1 | console.log('a.js') |
b.js
1 | export let foo = 1; |
执行结果
1 | b.js 先执行 |
参考文章