目录
ES6 module 和 CommonJS module 的区别
ES6 module、CommonJS module 循环引用的理解
CommonJS规范![](https://img-blog.csdnimg.cn/5b3f5e8754c644a99400227592f811aa.png)
ES6 module 和 CommonJS module 的区别
-
为CommonJS的
require
语法是同步的,所以就导致了CommonJS模块规范只适合用在服务端,而ES6模块无论是在浏览器端还是服务端都是可以使用的,但是在服务端中,还需要遵循一些特殊的规则才能使用 ; -
CommonJS 模块输出的是一个值的拷贝,而ES6 模块输出的是值的引用;
-
CommonJS 模块是运行时加载,而ES6 模块是编译时输出接口,使得对JS的模块进行静态分析成为了可能
-
因为两个模块加载机制的不同,所以在对待循环加载的时候,它们会有不同的表现。CommonJS遇到循环依赖的时候,只会输出已经执行的部分,后续的输出或者变化,是不会影响已经输出的变量。而ES6模块相反,使用
import
加载一个变量,变量不会被缓存,真正取值的时候就能取到最终的值; -
关于模块顶层的
this
指向问题,在CommonJS顶层,this
指向当前模块;而在ES6模块中,this
指向undefined
; -
关于两个模块互相引用的问题,在ES6模块当中,是支持加载CommonJS模块的。但是反过来,CommonJS并不能
require
ES6模块,在NodeJS中,两种模块方案是分开处理的。
ES6 module、CommonJS module 循环引用的理解
循环加载指的是a脚本的执行依赖b脚本,b脚本的执行依赖a脚本
-
CommonJS模块是加载时执行。一旦出现某个模块被“循环加载”,就只输出已经执行的部分,没有执行的部分不会输出。
-
ES6模块对导出模块,变量,对象是动态引用,遇到模块加载命令import时不会去执行模块,只是生成一个指向被加载模块的引用。
CommonJS模块规范主要适用于后端Node.js,后端Node.js是同步模块加载,所以在模块循环引入时模块已经执行完毕。推荐前端工程中使用ES6的模块规范,通过安装Babel转码插件支持ES6模块引入的语法。
CommonJS模块的加载原理![](https://img-blog.csdnimg.cn/d340932ae9bc448ebc02d3a42e574ec0.png)
ES6模块的循环加载![](https://img-blog.csdnimg.cn/80f8e232fafc421ba935df85027a38f9.png)