今天看了一天的前端的模块化的解决方案,发现如果是初学者会有很多的疑问,网上看了很多文章渐渐才有了头绪。
首先模块化的方案其实一直都用,从我们最基本的函数来说可以说就是一个模块化的过程,可是这个模块化的过程会有很多的弊端,首先就是变量冲突的问题,命名冲突的问题,全局作用域的污染,一旦项目构建的越来越大,会导致我们越来越痛苦,所以出现了很多的解决方案,模块化就是目前比较流行的一种方法,es6出来完全就实现了模块化的工程,可以说模块化是一个优秀的前端人员必须学习的。
模块化的话首先要讲commonJS它是服务器端的node最先采用的一种模块化的规范,学习node的人肯定都明白,我没有深入学习过,所以在这就不多说了。模块话固然是非常好的,但是在浏览器端实现起来确困难重重,首先是因为浏览器的环境中依赖的资源都是通过网络请求过来的,没有服务端的那么稳定,我们在请求资源时,资源可能对应在不同的服务器端配置,所以会出现各种的问题,但是后面出现了一些改进的方案,先不急,先了解以下AMD规范和CMD规范。
在了解之前先来看一张图
看了这幅图之后,相信你会有一个大概的印象,AMD是异步加载模块的缩写,他产生了requireJS这样的定义,CMD他有了seaJS这样的模块加载框架,有一段代码很好的讲了他们两的区别:
requireJS需要在定义之前就要预加载所有需要的模块,而reaJS需要在什么时候使用,什么时候再进行加载,用语言来类比就是一个是静态加载,一个是运行时加载,当然这个比喻不是很恰当,但是有些类似,下面说说在requireJS下定义模块的方式:
AMD其实也就只定义了一个define函数,
这个函数就是定义模块的函数,参数说明:id就是这个模块的名字,也就是模块加载器要进行加载的指定的名字,在另外一个地方看到说也就是这个文件的路径名,第二个参数是当前模块已定义的依赖模块的数组字面量,依赖参数是可选的,如果忽略此参数,默认是["require", "exports", "module"]
然而如果工厂方法的长度属性小于三,加载器会以函数的长度属性指定的参数属性调用工厂方法。
工厂方法factory是模块初始化要执行的函数或对象,如果为函数,他应该只被执行一次,如果为对象,他应该为模块的输出值,定义模块用define定义用exports导入,下面来看一个例子:
这就是定义一个模块的方法,我们常见的jquery就已经实现自动模块化了,
seaJS是懒加载,那么它是怎么使用的,下面看个例子:
就这样可以使用响应的模块了,当然对于这些规范有一些很深的思考,比如怎么设计一个AMD模块,怎么实现,这些我暂时没有实践过,暂时不说了。