模块化规范,主要是为了统一模块化的编写方式,比如不同团队的Java
代码,总能用import
的方式来加载,C#
的话也有using
,avaScript
本身没有内置的模块系统(ES6中引入了模块系统,接下来会介绍),JavaScript的模块化规范,一般都是致力于提高 JavaScript
程序的可移植性和可交换性,朝着统一模块化交互方式的方向而努力。
CommonJS的目标是定义一套普通应用程序使用的API,从而填补原生JavaScript标准库过少的缺点。终极目标是实现一个像python,java中含有的标准库。node.js实际上就是CommonJS 的一个实现。
CommonJS 标准大致如下:
CommonJS有一个全局性的方法 require()
,主要用于加载模块,加载后,就可以调用模块的方法:
math
模块的add
方法是怎么定义的呢,CommonJS
还有一个全局变量 exports
,它用来导入模块的方法,通过它导入的方法,便是这个模块的API
,可供调用:
在模块里,还有一个变量module
,它有一个只读的id
属性,还有一个uri
属性。
通过 CommonJS 的规范和代码可以看出,require 是同步的,模块系统需要同步读取模块文件内容,并编译执行以得到模块接口。在服务端,比如node.js,这一般来说没有问题,文件请求都是本地获取,对性能没有什么影响。但是放在浏览器端,问题就出来了,等到所有模块同步加载完毕,时间不知道要过去多久了。
CommonJS 最早叫做 ServerJS,Modules 1.0规范在node.js上实践的很好,由于知道自身在浏览器中的不足,CommonJS社区把名字改为CommonJS,意为想统一服务器端和浏览器端,但是要实现浏览器端,就要有新的版本的标准,在新的版本制定过程中,社区出现了分歧,在这个分歧中,分出了AMD规范。
由于风格和机制的差异,最终,AMD从CommonJS社区中独立了出来,成为了现在最受欢迎的规范。接下来的文章里,会介绍这个规范。