es6使用的是import导入模块,export导出模块。导入导出的是值的引用,在真正需要用到这个值才会到这个模块中取值。而commonjs规范使用的是require导入模块和module.exports导出模块。require一开始加载就会形成这个模块的值,即使你修改了该模块的输出,其require的值也不会发生改变,因为他回去取缓存中的输出值。
eg、a先export出false,然后require时执行b,b文件有require了a,因为a先前已经export出了一个false,所以缓存了a的export值,如果这个export在require b文件后面则会报错。
下面的例子时es6的引入方式,他们在循环引用的时候,会动态去执行模块,如果将下面的引入方式换成commonJs的话则会报错,因为在执行odd中的even时 even尚未export出值,因此缓存中没有对应的值,所以会报错